Download Java tramite proxy quando getContentLengthLong restituisce -1
Gestisci un Content-Length sconosciuto in un download Java tramite proxy senza trattare i metadati di dimensione mancanti come una risposta vuota.
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.