HTTPUpgrade transport: Send some Sec-WebSocket-* headers (#6835)

https://github.com/XTLS/Xray-core/pull/6835#issuecomment-5853986428

---------

Co-authored-by: 风扇滑翔翼 <Fangliding.fshxy@outlook.com>
This commit is contained in:
Hossin Asaadi
2026-09-29 17:25:26 +00:00
committed by GitHub
co-authored by 风扇滑翔翼
parent fc8f8a451d
commit 0fc379203f
2 changed files with 19 additions and 0 deletions
+12
View File
@@ -3,6 +3,8 @@ package httpupgrade
import (
"bufio"
"context"
"crypto/rand"
"encoding/base64"
"net/http"
"net/url"
"strings"
@@ -97,6 +99,16 @@ func dialhttpUpgrade(ctx context.Context, dest net.Destination, streamSettings *
req.Header.Set("Connection", "Upgrade")
req.Header.Set("Upgrade", "websocket")
// make a valid Sec-WebSocket-Key if not present
if len(req.Header.Values("Sec-WebSocket-Key")) == 0 {
var buf [16]byte
rand.Read(buf[:])
req.Header.Set("Sec-WebSocket-Key", base64.StdEncoding.EncodeToString(buf[:]))
}
if len(req.Header.Values("Sec-WebSocket-Version")) == 0 {
req.Header.Set("Sec-WebSocket-Version", "13")
}
err = req.Write(conn)
if err != nil {
return nil, err
+7
View File
@@ -3,7 +3,9 @@ package httpupgrade
import (
"bufio"
"context"
"crypto/sha1"
"crypto/tls"
"encoding/base64"
"io"
"net/http"
"strings"
@@ -81,6 +83,11 @@ func (s *server) upgrade(conn net.Conn) (stat.Connection, error) {
}
resp.Header.Set("Connection", "Upgrade")
resp.Header.Set("Upgrade", "websocket")
// respond a valid Sec-WebSocket-Accept header if received a Sec-WebSocket-Key
if wsKey := req.Header.Get("Sec-WebSocket-Key"); wsKey != "" {
acceptKey := sha1.Sum([]byte(wsKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")) // magic number in RFC 6455
resp.Header.Set("Sec-WebSocket-Accept", base64.StdEncoding.EncodeToString(acceptKey[:]))
}
err = resp.Write(conn)
if err != nil {
return nil, err