Fix: support comma-separated values to the Connection HTTP header
This commit is contained in:
parent
e59cbbc469
commit
60dc513813
40
header.go
Normal file
40
header.go
Normal 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
|
||||||
|
}
|
|
@ -106,19 +106,20 @@ func (l Listener) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
|
||||||
// return
|
// return
|
||||||
//}
|
//}
|
||||||
|
|
||||||
if req.Header.Get("Connection") != "Upgrade" {
|
head := &zocketHeader{req.Header}
|
||||||
|
if !head.Contains("Connection", "Upgrade") {
|
||||||
log.ERROR.To(logger).Msg("Connection != Upgrade")
|
log.ERROR.To(logger).Msg("Connection != Upgrade")
|
||||||
resp.WriteHeader(http.StatusUpgradeRequired)
|
resp.WriteHeader(http.StatusUpgradeRequired)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if req.Header.Get("Upgrade") != "websocket" {
|
if head.Get("Upgrade") != "websocket" {
|
||||||
log.ERROR.To(logger).Msg("Upgrade != websocket")
|
log.ERROR.To(logger).Msg("Upgrade != websocket")
|
||||||
resp.WriteHeader(http.StatusUpgradeRequired)
|
resp.WriteHeader(http.StatusUpgradeRequired)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if req.Header.Get("Sec-WebSocket-Version") != "13" {
|
if head.Get("Sec-WebSocket-Version") != "13" {
|
||||||
log.ERROR.To(logger).Msg("Invalid WebSocket Version")
|
log.ERROR.To(logger).Msg("Invalid WebSocket Version")
|
||||||
resp.WriteHeader(http.StatusUpgradeRequired)
|
resp.WriteHeader(http.StatusUpgradeRequired)
|
||||||
return
|
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])
|
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"
|
wsKey += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
|
||||||
shakey := sha1.Sum([]byte(wsKey))
|
shakey := sha1.Sum([]byte(wsKey))
|
||||||
wsKey = base64.StdEncoding.EncodeToString(shakey[:])
|
wsKey = base64.StdEncoding.EncodeToString(shakey[:])
|
||||||
|
|
Loading…
Reference in New Issue
Block a user