Node.js HTTP/2 HTTP CONNECT-ით createConnection-ის გამოყენებით
დაასრულეთ CONNECT, შეათანხმეთ დანიშნულების TLS h2-თან, შემდეგ გამოიყენეთ 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 ნაკადს, რომელსაც პროქსი უკვე გადასცემს, ნაცვლად კიდევ ერთი პირდაპირი socket-ის გახსნისა. დანიშნულების servername აწვდის SNI-სა და სერტიფიკატის იდენტობას, შემოწმება ჩართულია. ALPN შემოწმება უარყოფს დანიშნულებას, რომელმაც h2 არ შეათანხმა.
failRoute-მა უნდა გაასუფთავოს მარშრუტი; useSession ფლობს მოთხოვნებსა და სესიის დახურვას. ამ ფრაგმენტის გარშემო გამოიყენეთ კავშირისა და ოპერაციის ვადები.
გარე კონექტორი კვლავ ფლობს host:port CONNECT სამიზნეს, პროქსის ავთენტიფიკაციას, უარყოფების დამუშავებას და სათაურების შემდეგ ბუფერირებულ ბაიტებს. დაასრულეთ ისინი socket-ის TLS-ზე გადაცემამდე; პირდაპირ HTTP/1.1 პროქსის მსმენელზე გაგზავნილი HTTP/2 წინასიტყვა არასწორ ფენაზე იწყება.