Node HTTP serveri oddiy proksi so'rovini so'rov callback'i orqali boshqaradi. CONNECT boshqa yo'l tutadi: server connect hodisasini so'rov, mijoz soketi va head buferi bilan birga chiqaradi.

Bu hodisa HTTP tahlili va tunnel o'rtasidagi topshirishdir. Tunnel qilingan trafik uchun foydalanishni davom ettirish mumkin bo'lgan oddiy ServerResponse ob'ekti yo'q.

ArgumentNimani olib yuradi
reqCONNECT so'rovi, uning maqsad vakolati va sarlavhalari bilan birga
clientSocketMijozga qaytadigan ulanish
headNode HTTP sarlavhalaridan keyin allaqachon o'qigan tunnel ma'lumotlari, bo'sh bo'lishi mumkin

Baytlarni uzatishdan oldin HTTP qarorini yakunlang

So'ralgan host va portni tekshiring, proksi-ning kirish va autentifikatsiya siyosatini qo'llang va yuqori oqim ulanishini o'rnating. CONNECT service.example:443 kabi vakolatni aniqlaydi; bu shaklni har ikki nuqtada ko'r-ko'rona bo'lish o'rniga IPv6 vakolatlarini hisobga olib tahlil qiling.

Tunnel qabul qilinganda, muvaffaqiyatli HTTP javobini va uni tugatuvchi bo'sh qatorni yuboring. So'ngra mijoz soketidan keladigan keyingi baytlar bilan davom etishdan oldin har qanday head baytini yuqoriga uzating. Yangi ma'lumot tinglovchisini ulash orqali ishlovchiga allaqachon alohida berilgan buferni qaytarib bo'lmaydi.

Node-ning rasmiy tunnel misoli ikki oqim yo'nalishini ulashdan oldin bu topshirishni serverSocket.write(head) bilan amalga oshiradi. Uning kichik misoli o'tishni ko'rsatadi; joylashtirilgan proksi shuningdek cheklangan ulanish urinishlari, kirish nazorati va hayot tsiklini boshqarishni talab qiladi.

Muvaffaqiyatdan keyin baytlar xizmat protokoliga tegishli

Muvaffaqiyatli CONNECT javobi ulanishni bayt oqimiga aylantiradi. Agar maqsad HTTPS sayt bo'lsa, uning TLS almashinuvi shu oqim ichida kechadi. Faqat tunnel qilish proksidan almashtiruvchi veb-sayt sertifikatini berishni talab qilmaydi.

CONNECT qabul qilinishidan oldin, HTTP xatosi rad etish sababini tushuntirishi mumkin. Qabul qilingandan keyin oqimga HTTP 500 yozish tunnel protokoliga bayt kiritadi. Buning o'rniga keyingi nosozliklarda tegishli ulanishlarni tugating yoki yo'q qiling.

Ikkala yo'nalishni orqaga bosimni hisobga oluvchi oqim boshqaruvi bilan ulang va end, error va close hodisalari hamrohni qanday tugatishini hal qiling. Boshlang'ich head buferini o'sha egalik modelining qismi sifatida saqlang; bu dastur ma'lumotlari, tashlab yuboriladigan ortiqcha HTTP sarlavhalari emas.

O'xshash maqolalar