Skip to content

Commit e2fc08b

Browse files
authored
reverseproxy: Fix hijack ordering which broke websockets (#5679)
1 parent 4aa4f3a commit e2fc08b

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

modules/caddyhttp/reverseproxy/streaming.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,25 @@ func (h *Handler) handleUpgradeResponse(logger *zap.Logger, rw http.ResponseWrit
5858
return
5959
}
6060

61+
// write header first, response headers should not be counted in size
62+
// like the rest of handler chain.
63+
copyHeader(rw.Header(), res.Header)
64+
rw.WriteHeader(res.StatusCode)
65+
66+
logger.Debug("upgrading connection")
67+
6168
//nolint:bodyclose
6269
conn, brw, hijackErr := http.NewResponseController(rw).Hijack()
6370
if errors.Is(hijackErr, http.ErrNotSupported) {
6471
h.logger.Sugar().Errorf("can't switch protocols using non-Hijacker ResponseWriter type %T", rw)
6572
return
6673
}
6774

75+
if hijackErr != nil {
76+
h.logger.Error("hijack failed on protocol switch", zap.Error(hijackErr))
77+
return
78+
}
79+
6880
// adopted from https://github.com/golang/go/commit/8bcf2834afdf6a1f7937390903a41518715ef6f5
6981
backConnCloseCh := make(chan struct{})
7082
go func() {
@@ -78,17 +90,6 @@ func (h *Handler) handleUpgradeResponse(logger *zap.Logger, rw http.ResponseWrit
7890
}()
7991
defer close(backConnCloseCh)
8092

81-
// write header first, response headers should not be counted in size
82-
// like the rest of handler chain.
83-
copyHeader(rw.Header(), res.Header)
84-
rw.WriteHeader(res.StatusCode)
85-
86-
logger.Debug("upgrading connection")
87-
if hijackErr != nil {
88-
h.logger.Error("hijack failed on protocol switch", zap.Error(hijackErr))
89-
return
90-
}
91-
9293
start := time.Now()
9394
defer func() {
9495
conn.Close()

0 commit comments

Comments
 (0)