villadora / express-http-proxy

Proxy middleware for express/connect
Other
1.22k stars 236 forks source link

`content-length` request header is removed when `parseReqBody` is `false` #545

Open mdmower-csnw opened 1 month ago

mdmower-csnw commented 1 month ago

Problem When option {parseReqBody: false} is used, the original request content-length header is lost when the request is forwarded to the target origin.

Analysis It looks like the header is removed here: https://github.com/villadora/express-http-proxy/blob/b05cb04fe8e87e215c886462aae264dc70f9a3c5/lib/requestOptions.js#L52-L65

But then is only recalculated when parseReqBody is true, here: https://github.com/villadora/express-http-proxy/blob/b05cb04fe8e87e215c886462aae264dc70f9a3c5/app/steps/sendProxyRequest.js#L57

Potential solution When {parseReqBody: false}...

  1. If bodyContent is provided, then content-length could be determined from the size of bodyContent
  2. If bodyContent is not provided (i.e. proxyReq is piped), then the original content-length header could be restored (if defined)

Supposing number item 1 is handled (content-length determined from size of bodyContent), then it may not be necessary to remove content-length from the original request at all. It would be overwritten in sendProxyRequest when appropriate and left alone otherwise.

monkpow commented 4 weeks ago

@mdmower-csnw Thanks for this detailed report. I'll take a look.

monkpow commented 3 weeks ago

@mdmower-csnw Thanks for the report. I ended up following your parenthetical advice and not removing content-length at all.

mdmower-csnw commented 3 weeks ago

Thanks for the quick attention on this, @monkpow!