From a14aa0322cfda1c117033632019ef6a306c9bce9 Mon Sep 17 00:00:00 2001 From: Areg Harutyunyan Date: Wed, 26 Feb 2020 14:38:30 +0000 Subject: [PATCH] TUN-2767: Test for large headers --- h2mux/header_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/h2mux/header_test.go b/h2mux/header_test.go index b5781d91..95170230 100644 --- a/h2mux/header_test.go +++ b/h2mux/header_test.go @@ -610,3 +610,43 @@ func TestH1ResponseToH2ResponseHeaders(t *testing.T) { assert.NoError(t, err) assert.ElementsMatch(t, expectedUserHeaders, actualUserHeaders) } + +// The purpose of this test is to check that our code and the http.Header +// implementation don't throw validation errors about header size +func TestHeaderSize(t *testing.T) { + largeValue := randSeq(5 * 1024 * 1024) // 5Mb + largeHeaders := http.Header{ + "User-header": {largeValue}, + } + mockResponse := http.Response{ + StatusCode: 200, + Header: largeHeaders, + } + + serializedHeaders := H1ResponseToH2ResponseHeaders(&mockResponse) + request, err := http.NewRequest(http.MethodGet, "https://example.com/", nil) + assert.NoError(t, err) + for _, header := range serializedHeaders { + request.Header.Set(header.Name, header.Value) + } + + for _, header := range serializedHeaders { + if header.Name != ResponseUserHeadersField { + continue + } + + deserializedHeaders, err := DeserializeHeaders(header.Value) + assert.NoError(t, err) + assert.Equal(t, largeValue, deserializedHeaders[0].Value) + } +} + +func randSeq(n int) string { + randomizer := rand.New(rand.NewSource(17)) + var letters = []rune(":;,+/=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + b := make([]rune, n) + for i := range b { + b[i] = letters[randomizer.Intn(len(letters))] + } + return string(b) +}