NetworkStream.DataAvailable nie oznacza końca odpowiedzi HTTP
Zapobiegaj obciętym pobieraniom HTTP, używając ramkowania komunikatów zamiast NetworkStream.DataAvailable jako warunku końca.
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.