http-party / node-http-proxy

A full-featured http proxy for node.js
https://github.com/http-party/node-http-proxy
Other
13.94k stars 1.97k forks source link

HTTP2 support #1237

Open risacher opened 6 years ago

risacher commented 6 years ago

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.

risacher commented 6 years ago

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."

safizn commented 6 years ago

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

risacher commented 6 years ago

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');
  }
nadeemkhedr commented 6 years ago

+1

skerit commented 6 years ago

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.

risacher commented 5 years ago

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

risacher commented 5 years ago

compare to: https://github.com/nxtedition/node-http2-proxy

ashubham commented 4 years ago

Any updates here ?

zhe-he commented 10 months ago

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