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
|
||||
//}
|
||||
|
||||
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[:])
|
||||
|
|
Loading…
Reference in New Issue
Block a user