Küçük bir proxy sarmalayıcısı HTTPS ile çalışıp ardından sunucusu önce konuşan bir protokol için yeniden kullanıldığında takılabilir. Şüpheli satır genellikle alma tamponunun \r\n\r\n ile bitmesini bekleyen satırdır.

TCP istemciye bir akış verir. Tek bir alma çağrısı HTTP durum satırının yarısını, tam bir CONNECT yanıtını ya da o yanıtı hemen izleyen tünel verisini döndürebilir. Okumanın başlıkların sonunda duracağına dair bir söz yoktur.

Sınırı tamponun içinde bulun

HTTP/1.1 CONNECT alışverişi için, başlık sonlandırıcısı tamponun herhangi bir yerinde görünene kadar bayt biriktirin. İlk görüldüğü yerden ayırın. Durum satırını ve başlıkları ilk bölümden ayrıştırın; sınırdan sonraki her şeyi ayrı tutun. Beklerken bir başlık boyut sınırı ve zaman aşımı uygulayın ve boş soket okumasını döngüye yeni bir davet değil, kapanmış bağlantı olarak değerlendirin.

Son başarılı 2xx yanıtı, bağlantıyı bu başlıklardan hemen sonra tünel moduna geçirir. Ardından gelen baytlar zaten tünel baytlarıdır. Onları atmayın, CONNECT yanıt gövdesini beklemeyin ve Content-Length alanını yeni protokolün bir bölümünü tüketme izni olarak yorumlamayın. Bilgilendirici yanıtlar varsa, o son yanıttan önce ele alınmalıdır.

Sarmalayıcı artıklarını devretmelidir

Yalnızca alttaki soketi döndürmek, el sıkışma ayrıştırıcısının ondan zaten çektiği baytları kaybeder. Sonraki okuyucu, önce saklanan kuyruğu veren ve ardından soket okumalarını sürdüren tamponlu bir akışa ihtiyaç duyar. Sunucunun önce konuştuğu bir protokolde, o ilk selamlamanın kaybedilmesi iki tarafı da sonsuza kadar bekletebilir.

Tersine, başarısız bir CONNECT yanıtından gelen baytlar tünel selamı değildir. 407 hâlâ proxy alışverişine aittir ve kimlik doğrulama işlemi gerektirir; başka bir başarısız durum uygun bir hata yoluna ihtiyaç duyar.

Bu, özellikle bir FTP veya SSH istemcisini HTTP proxy üzerinden uyarlarken önemlidir. Proxy ayrıca istenen hedef bağlantı noktasına izin vermelidir ve FTP ek veri bağlantılarına ihtiyaç duyabilir. Doğru başlık ayrıştırma akış devrini çözer; CONNECT izni veremez veya FTP'nin ikinci kanalını sağlayamaz.

İlgili makaleler