createConnection සමඟ HTTP CONNECT හරහා Node.js HTTP/2
CONNECT අවසන් කරන්න, h2 සමඟ ගමනාන්ත TLS සාකච්ඡා කරන්න, පසුව createConnection භාවිතයෙන් http2.connect එම stream මත තබන්න.
HTTP/1.1 proxy එකකට CONNECT තුළ ගමනාන්තයේ HTTP/2 frames රැගෙන යා හැක. proxy එකට එම අභ්යන්තර frames ක්රියාත්මක කිරීමට අවශ්ය නැත, නමුත් client එකට protocol මාරු කිරීම් පිළිවෙලට කළ යුතුය.
සම්පූර්ණ 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 තවත් සෘජු socket එකක් විවෘත කරනවා වෙනුවට proxy දැනටමත් රැගෙන යන TLS stream එක ආපසු දෙයි. ගමනාන්තයේ servername SNI සහ සහතික අනන්යතාව ලබා දෙයි, සත්යාපනය සක්රීයයි. ALPN පරීක්ෂාව h2 සාකච්ඡා නොකළ ගමනාන්තය ප්රතික්ෂේප කරයි.
failRoute මාර්ගය පිරිසිදු කළ යුතුය; useSession ඉල්ලීම් සහ session වැසීම හිමිකර ගනී. මෙම කොටස වටා සම්බන්ධතා සහ ක්රියාකාරී කාල සීමා යොදන්න.
පිටත connector තවමත් host:port CONNECT ඉලක්කගත කිරීම, proxy සත්යාපනය, ප්රතික්ෂේප කිරීම් හැසිරවීම සහ headersෙන් පසු buffer වූ bytes හිමිකර ගනී. socket එක TLS ට දීමට පෙර ඒවා අවසන් කරන්න; සෘජුවම HTTP/1.1 proxy ශ්රෝතාවට යවන HTTP/2 පූර්විකාව වැරදි ස්ථරයකින් ආරම්භ වේ.