Fix: support comma-separated values to the Connection HTTP header

This commit is contained in:
uditaren 2024-08-31 14:01:30 +02:00
parent e59cbbc469
commit 60dc513813
2 changed files with 45 additions and 4 deletions

40
header.go Normal file
View File

@ -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
}

View File

@ -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[:])