node-http-proxy icon indicating copy to clipboard operation
node-http-proxy copied to clipboard

do not pipe req into proxyReq until socket is connected

Open pepmartinez opened this issue 4 years ago • 2 comments
trafficstars

While building a reverse proxy with ha-lb capabilities I found out that proxy.web() does not play totally well with retries if a request body is present: it turns out the original req is piped into the proxyReq immediately, even before the socket at proxyReq tries to connect; such piping would read some (or even all) of the original req's body even if the socket does not connect; those body bytes would be lost if we choose to proxy.web() the same request onto an alternative target

The patch delays the piping until proxyReq's socket is present, and it's either connected (that is, reused from an agent) or suceeds to connect

pepmartinez avatar Dec 23 '20 18:12 pepmartinez

Don't you need to emit the proxyReq event before the pipe call? If the pipe sends the first chunk then the headers will be sent with it and won't be mutable when the proxyReq event is generated.

chasetec avatar Jan 26 '22 01:01 chasetec

Well, all I did is to defer the pipe() until there's a socket. There were no emit() before, to start with

pepmartinez avatar Jan 26 '22 08:01 pepmartinez