Node.js HTTP/2 דרך HTTP CONNECT עם createConnection
סיימו את CONNECT, נהלו משא ומתן על TLS של היעד עם h2, ואז השתמשו ב-createConnection כדי להחזיק את http2.connect על אותו זרם.
פרוקסי HTTP/1.1 יכול לשאת מסגרות HTTP/2 של היעד בתוך CONNECT. הפרוקסי אינו חייב לממש את המסגרות הפנימיות הללו, אך הלקוח חייב לבצע את מסירות הפרוטוקול לפי הסדר.
לאחר אימות תגובת 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 מחזיק את הבקשות ואת סגירת הסשן. החילו מועדי חיבור ופעולה סביב הקטע הזה.
המחבר החיצוני עדיין מחזיק את כיווני CONNECT מסוג host:port, את האימות מול הפרוקסי, את הטיפול בדחיות ואת הבתים שנצברו אחרי הכותרות. סיימו אותם לפני מסירת ה-socket ל-TLS; הקדמה של HTTP/2 שנשלחת ישירות למאזין פרוקסי HTTP/1.1 מתחילה בשכבה הלא נכונה.