Proksi HTTP/1.1 boleh membawa bingkai HTTP/2 destinasi di dalam CONNECT. Proksi tidak perlu melaksanakan bingkai dalaman itu, tetapi klien mesti melakukan penyerahan protokol mengikut urutan.

Selepas mengesahkan balasan CONNECT lengkap dan mengekalkan tunnelSocket, tambah TLS destinasi dan serahkan strim yang telah terbentuk kepada 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 mengembalikan strim TLS yang sudah dibawa oleh proksi dan bukan membuka soket terus yang lain. servername destinasi membekalkan SNI dan identiti sijil, dengan pengesahan dihidupkan. Semakan ALPN menolak destinasi yang tidak merundingkan h2.

failRoute mesti membersihkan laluan; useSession memiliki permintaan dan penutupan sesi. Gunakan had masa sambungan dan operasi di sekeliling fragmen ini.

Penyambung luar masih memiliki penyasaran CONNECT host:port, pengesahan proksi, pengendalian penolakan dan bait yang dibuffer selepas pengepala. Selesaikan semuanya sebelum menyerahkan soket kepada TLS; mukadimah HTTP/2 yang dihantar terus kepada pendengar proksi HTTP/1.1 bermula pada lapisan yang salah.

Artikel berkaitan