הורדות Java דרך פרוקסי כאשר getContentLengthLong מחזיר -1
טפל ב-Content-Length לא ידוע בהורדת Java דרך פרוקסי בלי להתייחס למטא-נתוני גודל חסרים כתגובה ריקה.
getContentLengthLong() == -1 פירושו שאין אורך תוכן ידוע במטא-נתונים הזמינים. המשך לקרוא את הזרם והצג בייטים שהתקבלו או התקדמות בלתי מוגדרת; אל תתייחס לזה כתגובה ריקה ואל תקצה מאגר בגודל שלילי.
long expected = connection.getContentLengthLong();
long received = 0;
byte[] buffer = new byte[8192];
try (InputStream input = connection.getInputStream()) {
int count;
while ((count = input.read(buffer)) != -1) {
output.write(buffer, 0, count);
received += count;
}
}
החיבור כבר מוגדר והקורא הוא הבעלים של output. שמור על פסקי זמן לחיבור ולקריאה ועל כל מגבלת גודל של היישום סביב הלולאה הזו. שגיאת קלט/פלט היא הורדה שנכשלה, לא השלמה מוצלחת עם פחות בייטים.
השווה אורכים באותה שכבה. קידוד chunked של HTTP/1.1 יכול להחליף את Content-Length והוא מפוענח על ידי מימוש ה-HTTP. פרוקסי עשוי למסגר אותו מחדש. גם פריסה יכולה לגרום למספר הבייטים המפוענחים ביישום להיות שונה מ-Content-Length מקודד.
אם מופיעים גם Transfer-Encoding וגם Content-Length, אל תבחר מספר נוח: מסגור HTTP נותן עדיפות לקידוד התעבורה ורואה בשילוב שגיאה אפשרית. השאר את הפענוח הזה למימוש תואם.
כתובת FTP דרך שער HTTP דורשת בדיקה של התנהגות URLConnection הקונקרטית שלה; היא אינה מבטיחה שכל גישה לכותרת HTTP תתנהג כמו בכתובת HTTP רגילה בכל JDK. השתמש ב-API האורך עם ערך ארוך היכן שהמטא-נתונים חשובים, ואמת את המוצר המוגמר מול האורך או סכום הבדיקה הנדרשים בפועל. קריאת הגוף אינה גורמת לכותרת שנעדרה קודם להופיע.