From 60dc5138135c8512fd095fc88ace4ccb21b2fd84 Mon Sep 17 00:00:00 2001 From: uditaren Date: Sat, 31 Aug 2024 14:01:30 +0200 Subject: [PATCH] Fix: support comma-separated values to the Connection HTTP header --- header.go | 40 ++++++++++++++++++++++++++++++++++++++++ listener.go | 9 +++++---- 2 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 header.go diff --git a/header.go b/header.go new file mode 100644 index 0000000..524450c --- /dev/null +++ b/header.go @@ -0,0 +1,40 @@ +package zocket + +import ( + "net/http" + "strings" + "udico.de/util/log" +) + +type zocketHeader struct { + http.Header +} + +// Has returns true, if one entry of the given key has the exact value. +func (f zocketHeader) Has(key, value string) bool { + log.TRACE.To(logger).If(func(msg log.Fn) { + msg("Has(%v, %v)? Dumping", key, value) + for k, v := range f.Values(key) { + msg(" [%v]: %v", k, v) + } + }) + for _, v := range f.Values(key) { + if v == value { + return true + } + } + return false +} + +// Contains returns true, if at least one entry of the given key contains the value as part of a comma separated list. +func (f zocketHeader) Contains(key, value string) bool { + for _, v := range f.Values(key) { + for _, w := range strings.Split(v, ",") { + ws := strings.TrimSpace(w) + if ws == value { + return true + } + } + } + return false +} diff --git a/listener.go b/listener.go index c3cd9c9..225ec03 100644 --- a/listener.go +++ b/listener.go @@ -106,19 +106,20 @@ func (l Listener) ServeHTTP(resp http.ResponseWriter, req *http.Request) { // return //} - if req.Header.Get("Connection") != "Upgrade" { + head := &zocketHeader{req.Header} + if !head.Contains("Connection", "Upgrade") { log.ERROR.To(logger).Msg("Connection != Upgrade") resp.WriteHeader(http.StatusUpgradeRequired) return } - if req.Header.Get("Upgrade") != "websocket" { + if head.Get("Upgrade") != "websocket" { log.ERROR.To(logger).Msg("Upgrade != websocket") resp.WriteHeader(http.StatusUpgradeRequired) return } - if req.Header.Get("Sec-WebSocket-Version") != "13" { + if head.Get("Sec-WebSocket-Version") != "13" { log.ERROR.To(logger).Msg("Invalid WebSocket Version") resp.WriteHeader(http.StatusUpgradeRequired) return @@ -130,7 +131,7 @@ func (l Listener) ServeHTTP(resp http.ResponseWriter, req *http.Request) { log.INFO.To(logger).Msg(" %v: %v", k, v[0]) } - wsKey := req.Header.Get("Sec-Websocket-Key") + wsKey := head.Get("Sec-Websocket-Key") wsKey += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" shakey := sha1.Sum([]byte(wsKey)) wsKey = base64.StdEncoding.EncodeToString(shakey[:])