createConnection உடன் HTTP CONNECT வழியாக Node.js HTTP/2
CONNECT-ஐ முடிக்கவும், h2 உடன் இலக்கு TLS-ஐ பேசவும், பின்னர் createConnection பயன்படுத்தி http2.connect அந்த stream-இல் வைத்திருக்கவும்.
HTTP/1.1 ப்ராக்ஸி CONNECT-க்குள் இலக்கின் HTTP/2 பிரேம்களை எடுத்துச் செல்ல முடியும். ப்ராக்ஸி அந்த உள் பிரேம்களை செயல்படுத்த வேண்டியதில்லை, ஆனால் கிளையண்ட் நெறிமுறை கைமாற்றங்களை வரிசையாகச் செய்ய வேண்டும்.
முழு CONNECT பதிலை சரிபார்த்து tunnelSocket வைத்த பிறகு, இலக்கு TLS சேர்த்து நிறுவப்பட்ட stream-ஐ 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 stream-ஐ திருப்பித் தருகிறது. இலக்கின் servername SNI மற்றும் சான்றிதழ் அடையாளத்தை வழங்குகிறது, சரிபார்ப்பு இயக்கத்தில் உள்ளது. ALPN சோதனை h2 பேசாத இலக்கை நிராகரிக்கிறது.
failRoute பாதையை சுத்தம் செய்ய வேண்டும்; useSession கோரிக்கைகள் மற்றும் அமர்வு மூடுதலை வைத்திருக்கிறது. இந்தப் பகுதியைச் சுற்றி இணைப்பு மற்றும் செயல்பாட்டு கால வரம்புகளைப் பயன்படுத்தவும்.
வெளி இணைப்பான் இன்னும் host:port CONNECT இலக்கு, ப்ராக்ஸி அங்கீகாரம், நிராகரிப்பு கையாளுதல் மற்றும் தலைப்புகளுக்குப் பின் இடையகப்படுத்தப்பட்ட பைட்டுகளை வைத்திருக்கிறது. சாக்கெட்டை TLS-க்குக் கொடுக்கும் முன் அவற்றை முடிக்கவும்; நேரடியாக HTTP/1.1 ப்ராக்ஸி கேட்பானுக்கு அனுப்பப்படும் HTTP/2 முன்னுரை தவறான அடுக்கில் தொடங்குகிறது.