Téléchargements Java via proxy lorsque getContentLengthLong renvoie -1
Gérez un Content-Length inconnu dans un téléchargement Java via proxy sans traiter l'absence de métadonnées de taille comme une réponse vide.
getContentLengthLong() == -1 signifie qu'aucune longueur de contenu connue ne figure dans les métadonnées disponibles. Continuez à lire le flux et affichez les octets reçus ou une progression indéterminée ; ne le traitez pas comme une réponse vide et n'allouez pas de tampon de taille négative.
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 connexion est déjà configurée et output appartient à l'appelant. Conservez les délais de connexion et de lecture ainsi que toute limite de taille de l'application autour de cette boucle. Une erreur d'E/S est un téléchargement échoué, pas un achèvement réussi avec moins d'octets.
Comparez les longueurs au même niveau. L'encodage chunked de HTTP/1.1 peut remplacer Content-Length et il est décodé par l'implémentation HTTP. Un proxy peut le réencadrer. La décompression peut aussi faire différer le nombre d'octets décodés de l'application d'un Content-Length encodé.
Si Transfer-Encoding et Content-Length apparaissent tous deux, ne choisissez pas un nombre commode : le cadrage HTTP donne la priorité à l'encodage de transfert et considère la combinaison comme une erreur possible. Laissez cette analyse à une implémentation conforme.
Une URL FTP via une passerelle HTTP exige de vérifier le comportement concret de URLConnection ; elle ne garantit pas que chaque accesseur d'en-tête HTTP se comporte comme sur une URL HTTP ordinaire dans toutes les JDK. Utilisez l'API de longueur à valeur longue là où les métadonnées comptent, et validez l'artefact terminé par rapport à la longueur ou à la somme de contrôle réellement requise. Lire le corps ne fait pas apparaître un en-tête auparavant absent.