createConnection ഉപയോഗിച്ച് HTTP CONNECT വഴി Node.js HTTP/2
CONNECT പൂർത്തിയാക്കി, h2 ഉപയോഗിച്ച് ലക്ഷ്യത്തിന്റെ TLS സംസാരിക്കുക, തുടർന്ന് createConnection ഉപയോഗിച്ച് http2.connect ആ സ്ട്രീമിൽ നിലനിർത്തുക.
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 പ്രിയാംബിൾ തെറ്റായ പാളിയിൽ തുടങ്ങുന്നു.