Bir Node HTTP sunucusu sıradan bir proxy isteğini istek geri çağrısıyla işler. CONNECT başka bir yol izler: sunucu istekle, istemci soketiyle ve bir head arabelleğiyle birlikte connect olayını yayar.

Bu olay, HTTP ayrıştırması ile tünel arasındaki devir teslimdir. Tünellenmiş trafik için kullanılmaya devam edilecek sıradan bir ServerResponse nesnesi yoktur.

ArgümanNeyi taşır
reqCONNECT isteği, hedef yetkisi ve başlıkları dahil
clientSocketİstemciye geri dönen bağlantı
headNode'un HTTP başlıklarının ötesinde zaten okuduğu tünel verileri, muhtemelen boş

Baytları aktarmadan önce HTTP kararını tamamlayın

İstenen ana bilgisayarı ve bağlantı noktasını doğrulayın, proxy'nin erişim ve kimlik doğrulama ilkesini uygulayın ve yukarı akış bağlantısını kurun. CONNECT service.example:443 gibi bir yetki tanımlar; bu biçimi her iki noktada körlemesine bölmek yerine IPv6 yetkilerini göz önünde bulundurarak ayrıştırın.

Tünel kabul edildiğinde, başarılı HTTP yanıtını ve ardından onu sonlandıran boş satırı gönderin. Ardından istemci soketinden gelen sonraki baytlarla devam etmeden önce herhangi bir head baytını yukarı akışa iletin. Yeni bir veri dinleyicisi eklemek, işleyiciye zaten ayrı olarak teslim edilmiş bir arabelleği geri getiremez.

Node'un resmi tünelleme örneği, iki akış yönünü bağlamadan önce bu devir teslimi serverSocket.write(head) ile gerçekleştirir. Küçük örneği geçişi gösterir; dağıtılmış bir proxy ayrıca sınırlı bağlantı denemelerine, erişim denetimlerine ve yaşam döngüsü yönetimine ihtiyaç duyar.

Başarıdan sonra baytlar hizmet protokolüne aittir

Başarılı bir CONNECT yanıtı bağlantıyı bir bayt akışına dönüştürür. Hedef bir HTTPS sitesiyse, TLS alışverişi bu akışın içinde gerçekleşir. Yalnızca tünellemek, proxy'nin yedek bir web sitesi sertifikası vermesini gerektirmez.

CONNECT kabul edilmeden önce bir HTTP hatası reddedilme nedenini açıklayabilir. Kabulden sonra akışa HTTP 500 yazmak, tünellenmiş protokole bayt enjekte eder. Bunun yerine sonraki hatalarda uygun bağlantıları sonlandırın veya yok edin.

Her iki yönü geri basınç bilinçli akış işleme ile bağlayın ve end, error ve close olaylarının karşı tarafı nasıl sonlandırdığına karar verin. İlk head arabelleğini aynı sahiplik modelinin parçası olarak koruyun; bunlar uygulama verisidir, atılacak fazladan HTTP başlıkları değil.

İlgili makaleler