node-http2-proxy icon indicating copy to clipboard operation
node-http2-proxy copied to clipboard

Connection upgrade support only websocket

Open matus-sabo opened this issue 4 years ago • 1 comments

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]
   } 

matus-sabo avatar Apr 29 '21 12:04 matus-sabo

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);

tjhiggins avatar Dec 03 '21 23:12 tjhiggins