NetworkStream.DataAvailable אינו מסמן את סוף תגובת HTTP
מנע הורדות HTTP קטועות באמצעות מסגור הודעות במקום NetworkStream.DataAvailable כתנאי סיום.
NetworkStream.DataAvailable == false פירושו שאין בייטים מוכנים לקריאה מיידית. אין פירושו שתגובת HTTP הושלמה. לולאה שעוצרת שם עלולה לחתוך הורדת SOCKS תקינה לחלוטין במהלך פער בין מנות.
לאחר ש-SOCKS מקים את חיבור ה-TCP, מסגור ה-HTTP עדיין מספק את כלל ההשלמה:
- גוף עם Content-Length מסתיים לאחר בייטי התוכן המוצהרים.
- תגובת chunked זקוקה ל-chunk המסיים ול-trailers הרלוונטיים.
- תגובה המוגבלת על ידי החיבור מסתיימת עם החיבור.
- לחלק מהסטטוסים ולתגובות ל-HEAD אין גוף.
קרא את הסטטוס והכותרות כדי לקבוע את הכלל החל. המתנה לסגירה בלבד אינה פתרון כללי, מפני שתגובת HTTP שלמה יכולה להשאיר את החיבור פתוח. גם קיבולת של מאגר אחד אינה קשורה לאורך התגובה.
השתמש במימוש המסגור של לקוח ה-HTTP כאשר הוא תומך בהעברה דרך הפרוקסי שנבחר. בסביבת .NET מודרנית תואמת, שקול את התמיכה המובנית ב-SOCKS של HttpClient. מימוש גולמי חייב לשמור מצב פירוק על פני כותרות חלקיות וקריאות גוף, ולהבחין בין השלמה מוצלחת לביטול, לפגיעת זמן ולסיום בלתי צפוי של הזרם. בבקשת קריאה שאינה ריקה, אפס בייטים שנקראו פירושם שהזרם הסתיים; זה שונה מכך שאין כרגע בייטים בתור.
הפרוקסי יכול להבליט פערי תזמון, אך הוא אינו הופך תור קליטה ריק לסימן סוף הודעה.