NetworkStream.DataAvailable == false פירושו שאין בייטים מוכנים לקריאה מיידית. אין פירושו שתגובת HTTP הושלמה. לולאה שעוצרת שם עלולה לחתוך הורדת SOCKS תקינה לחלוטין במהלך פער בין מנות.

לאחר ש-SOCKS מקים את חיבור ה-TCP, מסגור ה-HTTP עדיין מספק את כלל ההשלמה:

  • גוף עם Content-Length מסתיים לאחר בייטי התוכן המוצהרים.
  • תגובת chunked זקוקה ל-chunk המסיים ול-trailers הרלוונטיים.
  • תגובה המוגבלת על ידי החיבור מסתיימת עם החיבור.
  • לחלק מהסטטוסים ולתגובות ל-HEAD אין גוף.

קרא את הסטטוס והכותרות כדי לקבוע את הכלל החל. המתנה לסגירה בלבד אינה פתרון כללי, מפני שתגובת HTTP שלמה יכולה להשאיר את החיבור פתוח. גם קיבולת של מאגר אחד אינה קשורה לאורך התגובה.

השתמש במימוש המסגור של לקוח ה-HTTP כאשר הוא תומך בהעברה דרך הפרוקסי שנבחר. בסביבת .NET מודרנית תואמת, שקול את התמיכה המובנית ב-SOCKS של HttpClient. מימוש גולמי חייב לשמור מצב פירוק על פני כותרות חלקיות וקריאות גוף, ולהבחין בין השלמה מוצלחת לביטול, לפגיעת זמן ולסיום בלתי צפוי של הזרם. בבקשת קריאה שאינה ריקה, אפס בייטים שנקראו פירושם שהזרם הסתיים; זה שונה מכך שאין כרגע בייטים בתור.

הפרוקסי יכול להבליט פערי תזמון, אך הוא אינו הופך תור קליטה ריק לסימן סוף הודעה.

מאמרים קשורים