CONNECT sonrası boş satırı bekleyin
Durum satırı önce gelse bile, soketi TLS'e devretmeden önce tam HTTP/1 CONNECT yanıtını okuyun.
İstemci 200 Connection Established görür, TLS başlatır ve TLS kaydı olması gereken yerde hemen saçmalık bildirir. Hedefin şifre ayarlarını suçlamadan önce yarım kalmış bir HTTP yanıtı arayın.
Bir HTTP/1 CONNECT alışverişinde durum satırı yanıtın yalnızca başlangıcıdır. Ardından başlık alanları gelebilir. Başarılı bir CONNECT yanıtından sonra başlık bölümünü bitiren boş satır tünele geçişi işaretler.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
Bu baytlar tek bir okumada, birkaç okumada ya da sonraki baytları da içeren bir okumada gelebilir. TCP sunucunun yazma sınırlarını korumaz.
Devri açık bir ayrıştırıcı durumu yapın
- Durum satırını toplayın ve ayrıştırın. Tam bir İngilizce sebep ifadesi yerine sayısal durumu kullanın.
- Başlık bölümünün tam sonlandırıcısı gelene kadar devam edin. Başarılı bir durum satırı kalan alanları yok etmez.
- Başarılı bir CONNECT yanıtında, o sonlandırıcıdan hemen sonraki baytı tünel verisinin başlangıcı sayın. Diğer yanıtlarda uygun HTTP yanıtı ve kimlik doğrulama işlemeyi izleyin.
- Bağlantıyı ve kullanılmamış baytları bir sonraki protokolün desteklediği tamponlu G/Ç arayüzü üzerinden aktarın.
Son adım, iyi bir ayırıcı aramasında bile önemlidir. Tamponlu bir okuyucu soketten ayrıştırıcının istediğinden fazlasını tüketmiş olabilir. O okuyucuyu bırakıp çıplak sokette TLS başlatmak baytları okuyucunun özel tamponunda bırakabilir.
Kurulum için bir son tarih ve başlık boyutu için bir sınır kullanın. Sonlandırıcıdan önceki EOF eksik bir vekil yanıtıdır, sonsuza kadar beklemeye ya da yine de TLS denemeye bir davet değildir.
Birkaç sınırı düşünün
Proxy-Agent: sonrasında biten bir okuma düşünün. Ayrıştırıcının hâlâ daha fazla HTTP başlık baytına ihtiyacı var. Son CRLF dizisinin ortasında biten başka bir okuma düşünün. Bu hâlâ tam bir başlık bölümü değil. Şimdi aynı tamponda tam ve başarılı bir başlık bölümünün ardından tünel baytlarının geldiğini düşünün: bu ekstra baytlar devri atlatmalı.
407 farklı bir sonuçtur. Kimlik doğrulama işlemesi gerektirir; hiç açılmamış bir tünele TLS ClientHello gönderilmesine izin vermez.
El sıkışmasını uygulamak görevin kendisi değilse bakımı yapılan bir bağlayıcıyı tercih edin. Bu sınır burada gösterilen HTTP/1 alışverişine özgüdür. Bir HTTP/2 vekili CONNECT'i farklı çerçevelemeye sahip bir akışta taşır.