createConnection দিয়ে HTTP CONNECT-এর মাধ্যমে Node.js HTTP/2
CONNECT শেষ করুন, h2 দিয়ে গন্তব্যের TLS নিয়ে সমঝোতা করুন, তারপর 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 স্ট্রিম ফেরত দেয়। গন্তব্যের servername SNI ও সার্টিফিকেট পরিচয় দেয়, যাচাই সক্রিয় থাকে। ALPN পরীক্ষা এমন গন্তব্য প্রত্যাখ্যান করে যা h2 নিয়ে সমঝোতা করেনি।
failRoute-কে রুট পরিষ্কার করতে হবে; useSession অনুরোধ ও সেশন বন্ধের মালিক। এই অংশের চারপাশে সংযোগ ও কার্যক্রমের সময়সীমা প্রয়োগ করুন।
বাইরের কানেক্টর এখনও host:port CONNECT লক্ষ্য, প্রক্সি প্রমাণীকরণ, প্রত্যাখ্যান পরিচালনা এবং হেডারের পরে বাফার হওয়া বাইটের মালিক। সকেটটি TLS-কে দেওয়ার আগে সেগুলি শেষ করুন; সরাসরি HTTP/1.1 প্রক্সি লিসেনারে পাঠানো HTTP/2 প্রিফিক্স ভুল স্তরে শুরু হয়।