http-party/node-http-proxy

HTTP2 support

risacher opened this issue ยท 9 comments

Now that HTTP2 is in core, it should be supported by node-http-proxy.

My initial efforts to try to make this work result in the following errror:

_http_outgoing.js:490
    throw new TypeError(`Header name must be a valid HTTP Token ["${name}"]`);
    ^

TypeError: Header name must be a valid HTTP Token [":path"]

I think this is because in http-proxy/lib/http-proxy/common.js, setupOutgoing() is basically copying headers from the incoming request to the outgoing request, and HTTP2 headers start with colons, but HTTP1 headers cannot.

q.v. https://tools.ietf.org/html/rfc7540#section-8.1.2.3

This has some specific guidance on how to convert HTTP/2 pseudo headers into HTTP/1.1 headers. E.g. "An intermediary that converts an HTTP/2 request to HTTP/1.1 MUST create a Host header field if one is not present in a request by copying the value of the ":authority" pseudo-header field."

You could check maybe Redbird implementation of it. https://github.com/OptimalBits/redbird

Interesting. From what I can tell, Redbird uses the 'spdy' module in place of the https module if HTTP/2 is enabled, and apparently that's sufficient. The relevant code from redbird/proxy.js is this:

if (sslOpts.http2) {
    https = sslOpts.serverModule || require('spdy');
    if(_.isObject(sslOpts.http2)){
      sslOpts.spdy = sslOpts.http2;
    }
  } else {
    https = sslOpts.serverModule || require('https');
  }

Nice, I didn't know the spdy module could be used as a drop-in replacement for https, but unfortunately it's no longer being maintained.

spdy apparently does not work for node versions above 10.5, so its suitability as a workaround is diminishing.

Any updates here ?

Can it support HTTP/3.0? (I'm not a devil)