NetworkStream.DataAvailable == false oznacza, że nie ma bajtów gotowych do natychmiastowego odczytu. Nie oznacza to, że odpowiedź HTTP jest kompletna. Pętla, która się tam zatrzyma, może obciąć całkowicie normalne pobieranie przez SOCKS w przerwie między pakietami.

Po tym, jak SOCKS ustanowi połączenie TCP, regułę zakończenia nadal wyznacza ramkowanie HTTP:

  • Treść z Content-Length kończy się po zadeklarowanych bajtach zawartości.
  • Odpowiedź chunked wymaga końcowego chunku i odpowiednich trailerów.
  • Odpowiedź ograniczona połączeniem kończy się wraz z połączeniem.
  • Niektóre statusy i odpowiedzi na HEAD nie mają treści.

Przeczytaj status i nagłówki, aby ustalić obowiązującą regułę. Czekanie wyłącznie na zamknięcie nie jest ogólnym rozwiązaniem, ponieważ kompletna odpowiedź HTTP może pozostawić połączenie otwarte. Pojemność jednego bufora jest równie niezwiązana z długością odpowiedzi.

Użyj implementacji ramkowania klienta HTTP, gdy obsługuje wybrany transport przez proxy. W zgodnym nowoczesnym środowisku uruchomieniowym .NET rozważ natywną obsługę SOCKS w HttpClient. Surowa implementacja musi zachować stan analizy między częściowymi nagłówkami i odczytami treści oraz odróżniać udane zakończenie od anulowania, przekroczenia limitu czasu i nieoczekiwanego EOF. W niepustym żądaniu odczytu zero odczytanych bajtów oznacza, że strumień się zakończył; różni się to od braku bajtów w kolejce w tej chwili.

Proxy może uwidocznić przerwy czasowe, ale nie zamienia pustej kolejki odbioru w znacznik końca komunikatu.

Powiązane artykuły