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 წინასიტყვა არასწორ ფენაზე იწყება.

დაკავშირებული სტატიები