(t *testing.T)
| 10 | ) |
| 11 | |
| 12 | func TestSerializeHeaders(t *testing.T) { |
| 13 | request, err := http.NewRequest(http.MethodGet, "http://example.com", nil) |
| 14 | require.NoError(t, err) |
| 15 | |
| 16 | mockHeaders := http.Header{ |
| 17 | "Mock-Header-One": {"Mock header one value", "three"}, |
| 18 | "Mock-Header-Two-Long": {"Mock header two value\nlong"}, |
| 19 | ":;": {":;", ";:"}, |
| 20 | ":": {":"}, |
| 21 | ";": {";"}, |
| 22 | ";;": {";;"}, |
| 23 | "Empty values": {"", ""}, |
| 24 | "": {"Empty key"}, |
| 25 | "control\tcharacter\b\n": {"value\n\b\t"}, |
| 26 | ";\v:": {":\v;"}, |
| 27 | } |
| 28 | |
| 29 | for header, values := range mockHeaders { |
| 30 | for _, value := range values { |
| 31 | // Note that Golang's http library is opinionated; |
| 32 | // at this point every header name will be title-cased in order to comply with the HTTP RFC |
| 33 | // This means our proxy is not completely transparent when it comes to proxying headers |
| 34 | request.Header.Add(header, value) |
| 35 | } |
| 36 | } |
| 37 | |
| 38 | serializedHeaders := SerializeHeaders(request.Header) |
| 39 | |
| 40 | // Sanity check: the headers serialized to something that's not an empty string |
| 41 | require.NotEqual(t, "", serializedHeaders) |
| 42 | |
| 43 | // Deserialize back, and ensure we get the same set of headers |
| 44 | deserializedHeaders, err := DeserializeHeaders(serializedHeaders) |
| 45 | require.NoError(t, err) |
| 46 | |
| 47 | require.Len(t, deserializedHeaders, 13) |
| 48 | expectedHeaders := headerToReqHeader(mockHeaders) |
| 49 | |
| 50 | sort.Sort(ByName(deserializedHeaders)) |
| 51 | sort.Sort(ByName(expectedHeaders)) |
| 52 | |
| 53 | require.True( |
| 54 | t, |
| 55 | reflect.DeepEqual(expectedHeaders, deserializedHeaders), |
| 56 | "got = %#v, want = %#v\n", deserializedHeaders, expectedHeaders, |
| 57 | ) |
| 58 | } |
| 59 | |
| 60 | type ByName []HTTPHeader |
| 61 |
nothing calls this directly
no test coverage detected