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 האורך עם ערך ארוך היכן שהמטא-נתונים חשובים, ואמת את המוצר המוגמר מול האורך או סכום הבדיקה הנדרשים בפועל. קריאת הגוף אינה גורמת לכותרת שנעדרה קודם להופיע.

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