http2-client icon indicating copy to clipboard operation
http2-client copied to clipboard

HTTP/2 on HTTP/1.1 Tunnel

Open frank-trampe opened this issue 5 years ago • 4 comments

I apologize for making an issue if this turns out to be more of a question.

I'm trying to tunnel HTTP/2 over HTTP/1.1, but feeding an agent from the tunnel library to http2Client.request does not seem to do anything, and it seems that the agent gets ignored/discarded in HttpRequestManager.makeRequest. As an easy test, you can pass in a bad agent, and an HTTP/2 request still succeeds.

Is there some way presently to do that (HTTP/2 over HTTP/1.1)?

I am running version 1.3.3, by the way.

frank-trampe avatar Oct 09 '19 23:10 frank-trampe

Hey,

More information is required:

  • Which tunnel lib?
  • The server is using which protocol?
  • The agent you are using.. is it http1 / http2 agent?

Any other information can help to understand your issue, like code example.

hisco avatar Oct 17 '19 00:10 hisco

I was using the "tunnel" tunnel library, which supports only HTTP/1.1. The end server uses HTTP/2. The proxies support only HTTP/1.1.

frank-trampe avatar Oct 17 '19 16:10 frank-trampe

Hey,

Please provide an example of your usage.

Thanks.

hisco avatar Oct 30 '19 20:10 hisco

Here is some abbreviated code to give an idea. If it is not enough, I can put together a test environment.

const tunnel = require("tunnel");
const http2Client = require("http2-client");

function uri_split(uri) {
	var pieces = uri.match(/^([A-Za-z0-9]+):\/\/([A-Za-z0-9.-]+)(:([0-9]+))?(\/([A-Za-z0-9_+%&$=/.-]*)(\?([A-Za-z0-9_+%&$=/.-]*))?)?/);
	if (pieces)
		return {protocol: pieces[1], host: pieces[2], port: pieces[4],
				fullHost: pieces[2] + (pieces[3] || ""), path: pieces[6],
				query: pieces[8]};
	return null;
}

function agent_from_proxy(proxy, target) {
	var agent_options = {};
	if (typeof(proxy.host) == "string")
		agent_options.host = proxy.host;
	if (frankenlib.type_number_or_string_not_blank(proxy.port) && !isNaN(proxy.port))
		agent_options.port = proxy.port;
	if (typeof(proxy.user_name) == "string" && typeof(proxy.password) == "string")
		agent_options.proxyAuth = encodeURIComponent(proxy.user_name) +
			":" + encodeURIComponent(proxy.password);
	const uriPieces = frankenlib.uri_split(target);
	if (!uriPieces)
		return null;
	if (uriPieces.protocol.toLowerCase() == "https") {
		if (proxy.https_support)
			return tunnel.httpsOverHttps(agent_options);
		else
			return tunnel.httpsOverHttp(agent_options);
	} else {
		if (proxy.https_support)
			return tunnel.httpOverHttps(agent_options);
		else
			return tunnel.httpOverHttp(agent_options);
	}
	return null;
}

var request_options = {uri: "https://google.com"};
request_options.agent =
		agent_from_proxy({host: "arbitrary.proxy.com", request_options.uri);
http2Client.request(request_options, function (res) { ... });

frank-trampe avatar Oct 30 '19 21:10 frank-trampe