Skip to content

Commit 2ada7f0

Browse files
authored
Merge pull request #122 from SenseUnit/proper_hijack
handler: handle buffer leftover properly during hijack
2 parents 33382de + 5c659ed commit 2ada7f0

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

handler/handler.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (s *ProxyHandler) HandleTunnel(wr http.ResponseWriter, req *http.Request, u
9595

9696
if req.ProtoMajor == 0 || req.ProtoMajor == 1 {
9797
// Upgrade client connection
98-
localconn, _, err := hijack(wr)
98+
localconn, rw, err := hijack(wr)
9999
if err != nil {
100100
s.logger.Error("Can't hijack client connection: %v", err)
101101
http.Error(wr, "Can't hijack client connection", http.StatusInternalServerError)
@@ -106,6 +106,18 @@ func (s *ProxyHandler) HandleTunnel(wr http.ResponseWriter, req *http.Request, u
106106
// Inform client connection is built
107107
fmt.Fprintf(localconn, "HTTP/%d.%d 200 OK\r\n\r\n", req.ProtoMajor, req.ProtoMinor)
108108

109+
if buffered := rw.Reader.Buffered(); buffered > 0 {
110+
s.logger.Debug("saving %d bytes buffered in bufio.ReadWriter", buffered)
111+
s.forward(
112+
req.Context(),
113+
username,
114+
wrapH1ReqBody(io.NopCloser(io.LimitReader(rw.Reader, int64(buffered)))),
115+
wrapH1RespWriter(conn),
116+
)
117+
} else {
118+
s.logger.Debug("not rescuing remaining data in bufio.ReadWriter")
119+
}
120+
109121
s.forward(req.Context(), username, localconn, conn)
110122
} else if req.ProtoMajor == 2 {
111123
wr.Header()["Date"] = nil

0 commit comments

Comments
 (0)