github.com/cloudwego/hertz@v0.9.3/pkg/protocol/http1/ext/headerscanner_test.go (about) 1 /* 2 * Copyright 2022 CloudWeGo Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 * The MIT License (MIT) 17 * 18 * Copyright (c) 2015-present Aliaksandr Valialkin, VertaMedia, Kirill Danshin, Erik Dubbelboer, FastHTTP Authors 19 * 20 * Permission is hereby granted, free of charge, to any person obtaining a copy 21 * of this software and associated documentation files (the "Software"), to deal 22 * in the Software without restriction, including without limitation the rights 23 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 24 * copies of the Software, and to permit persons to whom the Software is 25 * furnished to do so, subject to the following conditions: 26 * 27 * The above copyright notice and this permission notice shall be included in 28 * all copies or substantial portions of the Software. 29 * 30 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 31 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 32 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 33 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 34 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 35 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 36 * THE SOFTWARE. 37 * 38 * This file may have been modified by CloudWeGo authors. All CloudWeGo 39 * Modifications are Copyright 2022 CloudWeGo Authors. 40 */ 41 42 package ext 43 44 import ( 45 "bufio" 46 "errors" 47 "net/http" 48 "strings" 49 "testing" 50 51 errs "github.com/cloudwego/hertz/pkg/common/errors" 52 "github.com/cloudwego/hertz/pkg/common/test/assert" 53 ) 54 55 func TestHasHeaderValue(t *testing.T) { 56 s := []byte("Expect: 100-continue, User-Agent: foo, Host: 127.0.0.1, Connection: Keep-Alive, Content-Length: 5") 57 assert.True(t, HasHeaderValue(s, []byte("Connection: Keep-Alive"))) 58 assert.False(t, HasHeaderValue(s, []byte("Connection: Keep-Alive1"))) 59 } 60 61 func TestResponseHeaderMultiLineValue(t *testing.T) { 62 firstLine := "HTTP/1.1 200 OK\r\n" 63 rawHeaders := "EmptyValue1:\r\n" + 64 "Content-Type: foo/bar;\r\n\tnewline;\r\n another/newline\r\n" + 65 "Foo: Bar\r\n" + 66 "Multi-Line: one;\r\n two\r\n" + 67 "Values: v1;\r\n v2; v3;\r\n v4;\tv5\r\n" + 68 "\r\n" 69 70 // compared with http response 71 response, err := http.ReadResponse(bufio.NewReader(strings.NewReader(firstLine+rawHeaders)), nil) 72 assert.Nil(t, err) 73 defer func() { response.Body.Close() }() 74 75 hs := &HeaderScanner{} 76 hs.B = []byte(rawHeaders) 77 hs.DisableNormalizing = false 78 hmap := make(map[string]string, len(response.Header)) 79 for hs.Next() { 80 if len(hs.Key) > 0 { 81 hmap[string(hs.Key)] = string(hs.Value) 82 } 83 } 84 85 for name, vals := range response.Header { 86 got := hmap[name] 87 want := vals[0] 88 assert.DeepEqual(t, want, got) 89 } 90 } 91 92 func TestHeaderScannerError(t *testing.T) { 93 t.Run("TestHeaderScannerErrorInvalidName", func(t *testing.T) { 94 rawHeaders := "Host: go.dev\r\nGopher-New-\r\n Line: This is a header on multiple lines\r\n\r\n" 95 testTestHeaderScannerError(t, rawHeaders, errInvalidName) 96 }) 97 t.Run("TestHeaderScannerErrorNeedMore", func(t *testing.T) { 98 rawHeaders := "This is a header on multiple lines" 99 testTestHeaderScannerError(t, rawHeaders, errs.ErrNeedMore) 100 101 rawHeaders = "Gopher-New-\r\n Line" 102 testTestHeaderScannerError(t, rawHeaders, errs.ErrNeedMore) 103 }) 104 } 105 106 func testTestHeaderScannerError(t *testing.T, rawHeaders string, expectError error) { 107 hs := &HeaderScanner{} 108 hs.B = []byte(rawHeaders) 109 hs.DisableNormalizing = false 110 for hs.Next() { 111 } 112 assert.NotNil(t, hs.Err) 113 assert.True(t, errors.Is(hs.Err, expectError)) 114 }