Skip to content

do not pipe req into proxyReq until socket is connected#1495

Open
pepmartinez wants to merge 1 commit intohttp-party:masterfrom
pepmartinez:master
Open

do not pipe req into proxyReq until socket is connected#1495
pepmartinez wants to merge 1 commit intohttp-party:masterfrom
pepmartinez:master

Conversation

@pepmartinez
Copy link
Copy Markdown

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

(allows retry of proxy.web() on connection refused, for example
@chasetec
Copy link
Copy Markdown

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.

@pepmartinez
Copy link
Copy Markdown
Author

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

pi0 added a commit to unjs/httpxy that referenced this pull request Mar 25, 2026
Avoid piping request body into proxyReq before the underlying socket is
connected. Piping eagerly can consume the request stream, causing body
data loss when retrying the same request to an alternate target.

Ref: http-party/node-http-proxy#1495
@pi0
Copy link
Copy Markdown

pi0 commented Mar 25, 2026

This issue has been fixed in unjs/httpxy#111.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants