NetworkStream.DataAvailable не пазначае канец адказу HTTP
Пазбягайце абрэзаных спампоўвак HTTP, выкарыстоўваючы фарміраванне паведамленняў замест NetworkStream.DataAvailable як умовы завяршэння.
NetworkStream.DataAvailable == false азначае, што няма байтаў, гатовых да неадкладнага чытання. Гэта не азначае, што адказ HTTP завершаны. Цыкл, які спыняецца тут, можа абрэзаць цалкам нармальнае спампоўванне праз SOCKS падчас прамежку паміж пакетамі.
Пасля таго як SOCKS усталюе злучэнне TCP, правіла завяршэння ўсё яшчэ задае фарміраванне HTTP:
- Цела Content-Length сканчаецца пасля абвешчаных байтаў змесціва.
- Адказу chunked патрэбны завяршальны фрагмент і адпаведныя trailers.
- Адказ, абмежаваны злучэннем, сканчаецца разам зі злучэннем.
- Некаторыя статусы і адказы на HEAD не маюць цела.
Чытайце статус і загалоўкі, каб вызначыць адпаведнае правіла. Чаканне толькі закрыцця не з'яўляецца агульным рашэннем, бо поўны адказ HTTP можа пакінуць злучэнне адкрытым. Ёмістасць аднага буфера гэтак жа не звязана з даўжынёй адказу.
Выкарыстоўвайце рэалізацыю фарміравання HTTP-кліента, калі яна падтрымлівае абраны транспарт праз проксі. На сумяшчальным сучасным асяроддзі .NET разгледзьце уласную падтрымку SOCKS ў HttpClient. Сырая рэалізацыя павінна захоўваць стан разбору паміж частковымі загалоўкамі і чытаннямі цела і адрозніваць паспяховае завяршэнне ад адмены, тайм-аўту і нечаканага EOF. Для непустога запыту на чытанне нуль прачытаных байтаў азначае, што паток скончыўся; гэта адрозніваецца ад адсутнасці байтаў у чарзе ў дадзены момант.
Проксі можа зрабіць часовыя прамежкі прыкметнымі, але ён не ператварае пустую чаргу прыёму ў маркер канца паведамлення.