@marcel91200 / caddy Mirror · read-only / commits / 1b9042bc
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 12, 13:15 UTC

reverseproxy: handle buffered data during hijack (#6274)

WeidiDeng committed Apr 26, 2024 at 23:09 UTC 1b9042bcdd03b4edea8447355f970e1c5aff8c10
2 files changed +13
modules/caddyhttp/responsewriter.go
+2
@@ -263,6 +263,8 @@ func (rr *responseRecorder) Hijack() (net.Conn, *bufio.ReadWriter, error) {
263 conn.(*hijackedConn).updateReadSize(buffered)
264 data, _ := brw.Peek(buffered)
265 brw.Reader.Reset(io.MultiReader(bytes.NewReader(data), conn))
266 + // peek to make buffered data appear, as Reset will make it 0
267 + _, _ = brw.Peek(buffered)
268 } else {
269 brw.Reader.Reset(conn)
270 }
modules/caddyhttp/reverseproxy/streaming.go
+11
@@ -101,6 +101,17 @@ func (h *Handler) handleUpgradeResponse(logger *zap.Logger, wg *sync.WaitGroup,
101 return
102 }
103
104 + // There may be buffered data in the *bufio.Reader
105 + // see: https://github.com/caddyserver/caddy/issues/6273
106 + if buffered := brw.Reader.Buffered(); buffered > 0 {
107 + data, _ := brw.Peek(buffered)
108 + _, err := backConn.Write(data)
109 + if err != nil {
110 + logger.Debug("backConn write failed", zap.Error(err))
111 + return
112 + }
113 + }
114 +
115 // Ensure the hijacked client connection, and the new connection established
116 // with the backend, are both closed in the event of a server shutdown. This
117 // is done by registering them. We also try to gracefully close connections