49 lines
1.2 KiB
JavaScript
49 lines
1.2 KiB
JavaScript
'use strict';
|
|
const http = require('http');
|
|
const https = require('https');
|
|
const Http2OverHttpX = require('./h2-over-hx.js');
|
|
const getAuthorizationHeaders = require('./get-auth-headers.js');
|
|
|
|
const getStream = request => new Promise((resolve, reject) => {
|
|
const onConnect = (response, socket, head) => {
|
|
socket.unshift(head);
|
|
|
|
request.off('error', reject);
|
|
resolve([socket, response.statusCode, response.statusMessage]);
|
|
};
|
|
|
|
request.once('error', reject);
|
|
request.once('connect', onConnect);
|
|
});
|
|
|
|
class Http2OverHttp extends Http2OverHttpX {
|
|
async _getProxyStream(authority) {
|
|
const {proxyOptions} = this;
|
|
const {url, headers} = this.proxyOptions;
|
|
|
|
const network = url.protocol === 'https:' ? https : http;
|
|
|
|
// `new URL('https://localhost/httpbin.org:443')` results in
|
|
// a `/httpbin.org:443` path, which has an invalid leading slash.
|
|
const request = network.request({
|
|
...proxyOptions,
|
|
hostname: url.hostname,
|
|
port: url.port,
|
|
path: authority,
|
|
headers: {
|
|
...getAuthorizationHeaders(this),
|
|
...headers,
|
|
host: authority
|
|
},
|
|
method: 'CONNECT'
|
|
}).end();
|
|
|
|
return getStream(request);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
Http2OverHttp,
|
|
Http2OverHttps: Http2OverHttp
|
|
};
|