From 98b25879e5b22f6246303b4243aa58a60537be7d Mon Sep 17 00:00:00 2001 From: Matt Robenolt Date: Tue, 28 Jun 2022 00:58:44 -0700 Subject: [PATCH] dedupe Alt-Svc header values (#3461) --- http3/server.go | 8 +++++++- http3/server_test.go | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/http3/server.go b/http3/server.go index a9af4c94955..0432a615653 100644 --- a/http3/server.go +++ b/http3/server.go @@ -325,10 +325,16 @@ func (s *Server) generateAltSvcHeader() { if s.QuicConfig != nil && len(s.QuicConfig.Versions) > 0 { supportedVersions = s.QuicConfig.Versions } + + // keep track of which have been seen so we don't yield duplicate values + seen := make(map[string]struct{}, len(supportedVersions)) var versionStrings []string for _, version := range supportedVersions { if v := versionToALPN(version); len(v) > 0 { - versionStrings = append(versionStrings, v) + if _, ok := seen[v]; !ok { + versionStrings = append(versionStrings, v) + seen[v] = struct{}{} + } } } diff --git a/http3/server_test.go b/http3/server_test.go index 81a21e57e7e..c185257184f 100644 --- a/http3/server_test.go +++ b/http3/server_test.go @@ -893,6 +893,14 @@ var _ = Describe("Server", func() { removeListener(&ln2) checkSetHeaderError() }) + + It("doesn't duplicate Alt-Svc values", func() { + s.QuicConfig.Versions = []quic.VersionNumber{quic.Version1, quic.Version1} + addListener(":443", &ln1) + checkSetHeaders(Equal(http.Header{"Alt-Svc": {`h3=":443"; ma=2592000`}})) + removeListener(&ln1) + checkSetHeaderError() + }) }) It("errors when ListenAndServe is called with s.TLSConfig nil", func() {