@marcel91200 / caddy Mirror · read-only / commits / e2fc08bd
Fork 0

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()