getContentLengthLong() == -1 significa che non esiste una lunghezza del contenuto nota nei metadati disponibili. Continua a leggere lo stream e mostra i byte ricevuti o un avanzamento indeterminato; non trattarlo come una risposta vuota e non allocare un buffer di dimensione negativa.

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

La connessione è già configurata e output appartiene al chiamante. Mantieni i timeout di connessione e lettura e qualsiasi limite di dimensione dell'applicazione attorno a questo ciclo. Un errore di I/O è un download fallito, non un completamento riuscito con meno byte.

Confronta le lunghezze allo stesso livello. La codifica chunked di HTTP/1.1 può sostituire Content-Length ed è decodificata dall'implementazione HTTP. Un proxy può reinquadrarla. Anche la decompressione può far differire il conteggio dei byte decodificati dell'applicazione da un Content-Length codificato.

Se compaiono sia Transfer-Encoding sia Content-Length, non scegliere un numero comodo: l'inquadratura HTTP dà precedenza alla codifica di trasferimento e considera la combinazione un possibile errore. Lascia quell'analisi a un'implementazione conforme.

Un URL FTP attraverso un gateway HTTP richiede la verifica del comportamento concreto di URLConnection; non garantisce che ogni accesso all'intestazione HTTP si comporti come su un normale URL HTTP in ogni JDK. Usa l'API di lunghezza a valore lungo dove i metadati contano, e convalida l'artefatto completato rispetto alla lunghezza o al checksum effettivamente richiesti. Leggere il corpo non fa comparire un'intestazione prima assente.

Articoli correlati