HTTP/1.1 ਪ੍ਰੌਕਸੀ CONNECT ਦੇ ਅੰਦਰ ਮੰਜ਼ਿਲ ਦੇ HTTP/2 ਫਰੇਮ ਲੈ ਜਾ ਸਕਦੀ ਹੈ। ਪ੍ਰੌਕਸੀ ਨੂੰ ਉਹ ਅੰਦਰੂਨੀ ਫਰੇਮ ਲਾਗੂ ਕਰਨ ਦੀ ਲੋੜ ਨਹੀਂ, ਪਰ ਕਲਾਇੰਟ ਨੂੰ ਪ੍ਰੋਟੋਕਾਲ ਹੈਂਡਆਫ਼ ਕ੍ਰਮ ਵਿੱਚ ਕਰਨੇ ਪੈਣਗੇ।

ਪੂਰਾ CONNECT ਜਵਾਬ ਜਾਂਚ ਕੇ tunnelSocket ਰੱਖਣ ਤੋਂ ਬਾਅਦ, ਮੰਜ਼ਿਲ ਦਾ TLS ਜੋੜੋ ਅਤੇ ਸਥਾਪਿਤ ਸਟ੍ਰੀਮ HTTP/2 ਨੂੰ ਦਿਓ:

import tls from 'node:tls';
import http2 from 'node:http2';

const secureSocket = tls.connect({
  socket: tunnelSocket,
  servername: 'api.example',
  ALPNProtocols: ['h2'],
});
secureSocket.once('error', failRoute);
secureSocket.once('secureConnect', () => {
  if (secureSocket.alpnProtocol !== 'h2') {
    secureSocket.destroy();
    failRoute(new Error('Destination did not negotiate h2'));
    return;
  }
  const session = http2.connect('https://api.example', {
    createConnection: () => secureSocket,
  });
  session.on('error', failRoute);
  useSession(session);
});

createConnection ਦੂਜਾ ਸਿੱਧਾ ਸਾਕਟ ਖੋਲ੍ਹਣ ਦੀ ਥਾਂ ਉਹ TLS ਸਟ੍ਰੀਮ ਵਾਪਸ ਦਿੰਦਾ ਹੈ ਜੋ ਪ੍ਰੌਕਸੀ ਪਹਿਲਾਂ ਹੀ ਲੈ ਕੇ ਜਾ ਰਹੀ ਹੈ। ਮੰਜ਼ਿਲ ਦਾ servername SNI ਅਤੇ ਸਰਟੀਫਿਕੇਟ ਪਛਾਣ ਦਿੰਦਾ ਹੈ, ਤਸਦੀਕ ਸਰਗਰਮ ਰਹਿੰਦੀ ਹੈ। ALPN ਜਾਂਚ ਉਸ ਮੰਜ਼ਿਲ ਨੂੰ ਰੱਦ ਕਰਦੀ ਹੈ ਜਿਸਨੇ h2 ਤੇ ਗੱਲ ਨਹੀਂ ਕੀਤੀ।

failRoute ਨੂੰ ਰਸਤਾ ਸਾਫ਼ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ; useSession ਬੇਨਤੀਆਂ ਅਤੇ ਸੈਸ਼ਨ ਬੰਦ ਕਰਨ ਦਾ ਮਾਲਕ ਹੈ। ਇਸ ਹਿੱਸੇ ਦੇ ਆਲੇ-ਦੁਆਲੇ ਕਨੈਕਸ਼ਨ ਅਤੇ ਕਾਰਵਾਈ ਦੀਆਂ ਸਮਾਂ-ਸੀਮਾਵਾਂ ਲਗਾਓ।

ਬਾਹਰੀ ਕਨੈਕਟਰ ਅਜੇ ਵੀ host:port CONNECT ਟਾਰਗੇਟਿੰਗ, ਪ੍ਰੌਕਸੀ ਪ੍ਰਮਾਣੀਕਰਨ, ਰੱਦ ਕਰਨ ਦੇ ਪ੍ਰਬੰਧਨ ਅਤੇ ਹੈਡਰਾਂ ਤੋਂ ਬਾਅਦ ਬਫ਼ਰ ਕੀਤੇ ਬਾਈਟਾਂ ਦਾ ਮਾਲਕ ਹੈ। ਸਾਕਟ TLS ਨੂੰ ਦੇਣ ਤੋਂ ਪਹਿਲਾਂ ਉਹ ਪੂਰੇ ਕਰੋ; ਸਿੱਧਾ HTTP/1.1 ਪ੍ਰੌਕਸੀ ਸਰੋਤੇ ਨੂੰ ਭੇਜੀ HTTP/2 ਪ੍ਰਸਤਾਵਨਾ ਗਲਤ ਪਰਤ ਤੋਂ ਸ਼ੁਰੂ ਹੁੰਦੀ ਹੈ।

ਸੰਬੰਧਿਤ ਲੇਖ