Λήψεις Java μέσω διακομιστή μεσολάβησης όταν το getContentLengthLong επιστρέφει -1
Χειριστείτε ένα άγνωστο Content-Length σε λήψη Java μέσω διακομιστή μεσολάβησης χωρίς να θεωρήσετε τα απόντα μεταδεδομένα μεγέθους κενή απόκριση.
Το getContentLengthLong() == -1 σημαίνει ότι δεν υπάρχει γνωστό μήκος περιεχομένου στα διαθέσιμα μεταδεδομένα. Συνεχίστε να διαβάζετε τη ροή και εμφανίζετε τα ληφθέντα byte ή αόριστη πρόοδο· μην το θεωρήσετε κενή απόκριση και μην δεσμεύσετε buffer αρνητικού μεγέθους.
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;
}
}
Η σύνδεση είναι ήδη ρυθμισμένη και το output ανήκει στον καλούντα. Διατηρήστε τα χρονικά όρια σύνδεσης και ανάγνωσης και τυχόν όριο μεγέθους της εφαρμογής γύρω από αυτόν τον βρόχο. Ένα σφάλμα E/S είναι αποτυχημένη λήψη, όχι επιτυχής ολοκλήρωση με λιγότερα byte.
Συγκρίνετε μήκη στο ίδιο επίπεδο. Η κωδικοποίηση chunked του HTTP/1.1 μπορεί να αντικαταστήσει το Content-Length και αποκωδικοποιείται από την υλοποίηση HTTP. Ένας διακομιστής μεσολάβησης μπορεί να το επαναπλαισιώσει. Η αποσυμπίεση μπορεί επίσης να κάνει τον αποκωδικοποιημένο αριθμό byte της εφαρμογής να διαφέρει από ένα κωδικοποιημένο Content-Length.
Αν εμφανίζονται και Transfer-Encoding και Content-Length, μην επιλέξετε ένα βολικό νούμερο: η πλαισίωση HTTP δίνει προτεραιότητα στην κωδικοποίηση μεταφοράς και θεωρεί τον συνδυασμό πιθανό σφάλμα. Αφήστε αυτή την ανάλυση σε μια συμβατή υλοποίηση.
Ένα URL FTP μέσω πύλης HTTP απαιτεί έλεγχο της συγκεκριμένης συμπεριφοράς URLConnection· δεν εγγυάται ότι κάθε προσπέλαση κεφαλίδας HTTP συμπεριφέρεται όπως σε ένα συνηθισμένο HTTP URL σε κάθε JDK. Χρησιμοποιήστε το API μήκους με μεγάλη τιμή όπου τα μεταδεδομένα μετρούν και επικυρώστε το ολοκληρωμένο τεχνούργημα ως προς το μήκος ή το άθροισμα ελέγχου που πραγματικά απαιτείται. Η ανάγνωση του σώματος δεν κάνει μια προηγουμένως απούσα κεφαλίδα να εμφανιστεί.