fix potential issues with some websocket upstream servers

This commit is contained in:
yusing 2024-12-04 06:09:52 +08:00
parent 452bb0b0d7
commit 28d4373f67

View file

@ -375,6 +375,10 @@ func (p *ReverseProxy) handler(rw http.ResponseWriter, req *http.Request) {
if reqUpType != "" { if reqUpType != "" {
outreq.Header.Set("Connection", "Upgrade") outreq.Header.Set("Connection", "Upgrade")
outreq.Header.Set("Upgrade", reqUpType) outreq.Header.Set("Upgrade", reqUpType)
if strings.EqualFold(reqUpType, "websocket") {
cleanWebsocketHeaders(outreq)
}
} }
if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil { if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
@ -538,6 +542,25 @@ func RemoveHopByHopHeaders(h http.Header) {
} }
} }
// reference: https://github.com/traefik/traefik/blob/master/pkg/proxy/httputil/proxy.go
// https://tools.ietf.org/html/rfc6455#page-20
func cleanWebsocketHeaders(req *http.Request) {
req.Header["Sec-WebSocket-Key"] = req.Header["Sec-Websocket-Key"]
delete(req.Header, "Sec-Websocket-Key")
req.Header["Sec-WebSocket-Extensions"] = req.Header["Sec-Websocket-Extensions"]
delete(req.Header, "Sec-Websocket-Extensions")
req.Header["Sec-WebSocket-Accept"] = req.Header["Sec-Websocket-Accept"]
delete(req.Header, "Sec-Websocket-Accept")
req.Header["Sec-WebSocket-Protocol"] = req.Header["Sec-Websocket-Protocol"]
delete(req.Header, "Sec-Websocket-Protocol")
req.Header["Sec-WebSocket-Version"] = req.Header["Sec-Websocket-Version"]
delete(req.Header, "Sec-Websocket-Version")
}
func (p *ReverseProxy) handleUpgradeResponse(rw http.ResponseWriter, req *http.Request, res *http.Response) { func (p *ReverseProxy) handleUpgradeResponse(rw http.ResponseWriter, req *http.Request, res *http.Response) {
reqUpType := UpgradeType(req.Header) reqUpType := UpgradeType(req.Header)
resUpType := UpgradeType(res.Header) resUpType := UpgradeType(res.Header)