Skip to content

Commit dcb20e2

Browse files
committed
fix: websocket server upgrade in golang1.20
1 parent 3d2cb99 commit dcb20e2

File tree

3 files changed

+13
-1
lines changed

3 files changed

+13
-1
lines changed

transport/vmess/websocket.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ func StreamUpgradedWebsocketConn(w http.ResponseWriter, r *http.Request) (net.Co
555555
w.Header().Set("Sec-Websocket-Accept", getSecAccept(r.Header.Get("Sec-WebSocket-Key")))
556556
}
557557
w.WriteHeader(http.StatusSwitchingProtocols)
558-
if flusher, isFlusher := w.(interface{ FlushError() error }); isFlusher {
558+
if flusher, isFlusher := w.(interface{ FlushError() error }); isFlusher && writeHeaderShouldFlush {
559559
err = flusher.FlushError()
560560
if err != nil {
561561
return nil, fmt.Errorf("flush response: %w", err)

transport/vmess/websocket_go120.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//go:build !go1.21
2+
3+
package vmess
4+
5+
// Golang1.20's net.http Flush will mistakenly call w.WriteHeader(StatusOK) internally after w.WriteHeader(http.StatusSwitchingProtocols)
6+
// https://github.com/golang/go/issues/59564
7+
const writeHeaderShouldFlush = false

transport/vmess/websocket_go121.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//go:build go1.21
2+
3+
package vmess
4+
5+
const writeHeaderShouldFlush = true

0 commit comments

Comments
 (0)