node-http2-proxy
node-http2-proxy copied to clipboard
Connection upgrade support only websocket
Following code accept only upgrade header equal to websocket, thats not correct as stated in link
https://github.com/nxtedition/node-http2-proxy/blob/999b05fd4c5365b7de8d6bb8aa125f9cc90a50bf/index.js#L30-L58
For example, the client might send a GET request as shown, listing the preferred protocols to switch to (in this case "example/1" and "foo/2"):
GET /index.html HTTP/1.1
Host: www.example.com
Connection: upgrade
Upgrade: example/1, foo/2
Send back a 101 Switching Protocols response status with an Upgrade header that specifies the protocol(s) being switched to. For example:
HTTP/1.1 101 Switching Protocols
Upgrade: foo/2
Connection: Upgrade
Simple fix example
async function proxy (
{ req, socket, res = socket, head, proxyName },
onReq,
onRes
) {
if (req.aborted) {
return
}
const headers = getRequestHeaders(req, proxyName)
if (head !== undefined) {
if (req.method !== 'GET') {
throw new HttpError('only GET request allowed', null, 405)
}
if (req.headers[UPGRADE] === undefined) {
throw new HttpError('missing upgrade header', null, 400)
}
if (head && head.length) {
res.unshift(head)
}
setupSocket(res)
headers[CONNECTION] = 'upgrade'
headers[UPGRADE] = req.headers[UPGRADE]
}
A tmp workaround is to do the following:
const upgrade = req.headers.upgrade;
// https://github.com/nxtedition/node-http2-proxy/issues/56
req.method = 'GET';
req.headers.upgrade = 'websocket';
proxy.ws(req, socket, head, {
hostname,
port,
onReq: (req, { headers }) => {
// https://github.com/nxtedition/node-http2-proxy/issues/56
headers!.upgrade = upgrade;
},
}, defaultWsHandler);