Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Mirrored from https://github.com/Slazee/caddy.git
Synced Nov 13, 00:30 UTC
reverseproxy: Fix hijack ordering which broke websockets (#5679)
WeidiDeng committed
Aug 3, 2023 at 12:08 UTC
e2fc08bd34cc17b8cbb6ac364fa1ec41c4c643b9
1 file changed
+12
-11
modules/caddyhttp/reverseproxy/streaming.go
+12
-11
@@ -58,6 +58,13 @@ func (h *Handler) handleUpgradeResponse(logger *zap.Logger, rw http.ResponseWrit
58
return
59
}
60
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
+
68
//nolint:bodyclose
69
conn, brw, hijackErr := http.NewResponseController(rw).Hijack()
70
if errors.Is(hijackErr, http.ErrNotSupported) {
@@ -65,6 +72,11 @@ func (h *Handler) handleUpgradeResponse(logger *zap.Logger, rw http.ResponseWrit
72
return
73
}
74
75
+ if hijackErr != nil {
76
+ h.logger.Error("hijack failed on protocol switch", zap.Error(hijackErr))
77
+ return
78
+ }
79
+
80
// adopted from https://github.com/golang/go/commit/8bcf2834afdf6a1f7937390903a41518715ef6f5
81
backConnCloseCh := make(chan struct{})
82
go func() {
@@ -78,17 +90,6 @@ func (h *Handler) handleUpgradeResponse(logger *zap.Logger, rw http.ResponseWrit
90
}()
91
defer close(backConnCloseCh)
92
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
-
93
start := time.Now()
94
defer func() {
95
conn.Close()