getContentLengthLong() == -1, kullanılabilir üstveride bilinen bir içerik uzunluğu olmadığı anlamına gelir. Akışı okumaya devam edin ve alınan baytları veya belirsiz ilerlemeyi gösterin; bunu boş yanıt olarak değerlendirmeyin ve negatif boyutlu tampon ayırmayın.

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;
    }
}

Bağlantı zaten yapılandırılmıştır ve output çağırana aittir. Bu döngü çevresinde bağlantı ve okuma zaman aşımlarını ve uygulamanın herhangi bir boyut sınırını koruyun. G/Ç hatası başarısız bir indirmedir, daha az baytla başarılı tamamlanma değildir.

Uzunlukları aynı katmanda karşılaştırın. HTTP/1.1 chunked kodlaması Content-Length'in yerini alabilir ve HTTP uygulaması tarafından çözülür. Bir proxy bunu yeniden çerçeveleyebilir. Sıkıştırma açma da uygulamanın çözülmüş bayt sayısını kodlanmış Content-Length'ten farklı kılabilir.

Hem Transfer-Encoding hem de Content-Length görünüyorsa uygun bir sayı seçmeyin: HTTP çerçevelemesi aktarım kodlamasına öncelik verir ve bu birleşimi olası bir hata olarak değerlendirir. Bu ayrıştırmayı uyumlu bir uygulamaya bırakın.

HTTP geçidi üzerinden bir FTP URL'si somut URLConnection davranışının denetlenmesini gerektirir; her HTTP başlık erişimcisinin her JDK'da sıradan bir HTTP URL'sindeki gibi davrandığını garanti etmez. Üstverinin önemli olduğu yerlerde uzun değerli length API'sini kullanın ve tamamlanan artefaktı gerçekten gereken uzunluk veya sağlama toplamına göre doğrulayın. Gövdeyi okumak önceden olmayan bir başlığı ortaya çıkarmaz.

İlgili makaleler