getContentLengthLong() == -1 mövcud metadatada məlum məzmun uzunluğunun olmadığını bildirir. Axını oxumağa davam edin və alınan baytları və ya qeyri-müəyyən irəliləyişi göstərin; bunu boş cavab kimi qəbul etməyin və mənfi ölçülü bufer 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ı artıq konfiqurasiya edilib və output çağıranın mülkiyyətindədir. Bağlantı və oxuma taym-autlarını, həmçinin tətbiqin istənilən ölçü limitini bu dövrənin ətrafında saxlayın. Giriş/çıxış xətası uğursuz yükləmədir, daha az baytla uğurlu tamamlanma deyil.

Uzunluqları eyni qatda müqayisə edin. HTTP/1.1 chunked kodlaşdırması Content-Length-i əvəz edə bilər və HTTP tətbiqi tərəfindən dekodlanır. Proksi onu yenidən çərçivəyə sala bilər. Dekompressiya da tətbiqin dekodlanmış bayt sayını kodlanmış Content-Length-dən fərqli edə bilər.

Əgər həm Transfer-Encoding, həm də Content-Length varsa, rahat rəqəm seçməyin: HTTP çərçivələməsi ötürmə kodlaşdırmasına üstünlük verir və birləşməni mümkün xəta sayır. Bu təhlili uyğun tətbiqə buraxın.

HTTP şlüzü vasitəsilə FTP URL-i üçün onun konkret URLConnection davranışı yoxlanılmalıdır; hər JDK-da hər HTTP başlıq girişinin adi HTTP URL-dəki kimi davranacağına zəmanət vermir. Metadata vacib olduqda uzun dəyərli length API-dən istifadə edin və tamamlanmış artefaktı faktiki tələb olunan uzunluq və ya yoxlama cəmi ilə doğrulayın. Gövdəni oxumaq əvvəl olmayan başlığı yaratmır.

Əlaqəli məqalələr