Forward mode blocks indefinitely upon certain content-disposition header value #546
Labels
backend
Issues related to the platform backend.
bug
Something isn't working.
low priority
Low priority issues to be done eventually.
t-platform
Issues with this label are in the ownership of the platform team.
Overview
proxy-chain
is observed to block indefinitely when certain conditions are met:content-disposition
header that contains certain non-ASCII content.content-length
header.The root cause of issue is believed to originate from Node.js. Before an upstream fix is made (which might take time)
proxy-chain
here could apply some mitigation.Upstream Issue:
ServerResponse.writeHead
may throw an errorThere are already several upstream issue reports, one of which is nodejs/node#50213
Mostly relevant is this section of code https://github.com/nodejs/node/blob/v20.16.0/lib/_http_outgoing.js#L554-L567 where the improper type change later involves implicit type conversion and unexpected charset decoding at https://github.com/nodejs/node/blob/v20.16.0/lib/_http_common.js#L216-L225
A minimal example for the decoding error:
/[^\t\x20-\x7e\x80-\xff]/v.test(Buffer.from('à', 'latin1'))
This then result in an invalid character error to be thrown (code) duringServerResponse.writeHead
.Impact to
proxy-chain
As of the current revision, said issue would cause an error thrown from this call:
proxy-chain/src/forward.ts
Lines 97 to 101 in a1ac3f2
It is then silently ignore here therefore the observed blocking:
proxy-chain/src/forward.ts
Lines 110 to 113 in a1ac3f2
In earlier versions of
proxy-chain
(that is used when I noticed this issue), said error is not caught thus exposed. This leads to the error as reported here: #20Sample Steps to Reproduce the Issue
Target web server:
$ socat -v -v TCP-LISTEN:8080,fork,reuseaddr,crlf SYSTEM:'echo HTTP/1.1 200 OK; echo "content-length: 6"; echo -e "content-disposition: \\\\xe0"; echo; echo -n "foobar"'
proxy-chain
instance (just the minimal example fromREADME.md
):Sending the request:
$ curl -v -x localhost:8000 'http://localhost:8080'
Expected result: The request shall finish. (see also:
curl -v 'http://localhost:8080'
)Observed result: The request blocks indefinitely.
(checked with Node.js v20.16.0 which is the active LTS)
Proposed Actions
I'm afraid that it's unlikely that the upstream will make a fix soon, considering how long their tickets have been around (e.g. nodejs/node#50213).
There are a few proposals on what could be done here:
content-disposition
header ahead, so that the call ofServerResponse.writeHead
no longer fails.The text was updated successfully, but these errors were encountered: