Το NetworkStream.DataAvailable == false σημαίνει ότι δεν υπάρχουν byte έτοιμα για άμεση ανάγνωση. Δεν σημαίνει ότι μια απόκριση HTTP έχει ολοκληρωθεί. Ένας βρόχος που σταματά εκεί μπορεί να κόψει μια απόλυτα κανονική λήψη μέσω SOCKS κατά τη διάρκεια ενός κενού μεταξύ πακέτων.

Αφού το SOCKS δημιουργήσει τη σύνδεση TCP, η πλαισίωση HTTP εξακολουθεί να παρέχει τον κανόνα ολοκλήρωσης:

  • Ένα σώμα Content-Length τελειώνει μετά τα δηλωμένα byte περιεχομένου.
  • Μια απόκριση chunked χρειάζεται το τελικό chunk και τα σχετικά trailers.
  • Μια απόκριση που ορίζεται από τη σύνδεση τελειώνει μαζί με τη σύνδεση.
  • Ορισμένες καταστάσεις και αποκρίσεις σε HEAD δεν έχουν σώμα.

Διαβάστε την κατάσταση και τις κεφαλίδες για να προσδιορίσετε τον ισχύοντα κανόνα. Η αναμονή μόνο για κλείσιμο δεν είναι γενική λύση, επειδή μια πλήρης απόκριση HTTP μπορεί να αφήσει τη σύνδεση ανοιχτή. Η χωρητικότητα ενός buffer είναι εξίσου άσχετη με το μήκος της απόκρισης.

Χρησιμοποιήστε την υλοποίηση πλαισίωσης του πελάτη HTTP όταν υποστηρίζει τη μεταφορά μέσω του επιλεγμένου proxy. Σε ένα συμβατό σύγχρονο runtime .NET, εξετάστε την εγγενή υποστήριξη SOCKS του HttpClient. Μια ακατέργαστη υλοποίηση πρέπει να διατηρεί κατάσταση ανάλυσης κατά μήκος μερικών κεφαλίδων και αναγνώσεων σώματος και να διακρίνει την επιτυχή ολοκλήρωση από ακύρωση, λήξη χρόνου και απρόσμενο EOF. Για ένα αίτημα ανάγνωσης που δεν είναι κενό, μηδέν byte που διαβάστηκαν σημαίνει ότι η ροή έληξε· αυτό διαφέρει από το ότι αυτή τη στιγμή δεν υπάρχουν byte στην ουρά.

Ο proxy μπορεί να κάνει τα κενά χρόνου αισθητά, αλλά δεν μετατρέπει μια κενή ουρά λήψης σε δείκτη τέλους μηνύματος.

Σχετικά άρθρα