getContentLengthLong -1 буцаах үед Java прокси таталт
Проксигоор дамжуулсан Java таталтад үл мэдэгдэх Content-Length-ийг хэмжээний метадата байхгүйг хоосон хариу гэж үзэхгүйгээр шийдвэрлэнэ.
getContentLengthLong() == -1 нь боломжит метадатад мэдэгдэх контентын урт байхгүй гэсэн үг. Урсгалыг үргэлжлүүлэн уншиж, хүлээн авсан байт эсвэл тодорхойгүй явцыг харуулна уу; үүнийг хоосон хариу гэж үзэхгүй, сөрөг хэмжээтэй буфер хуваарилахгүй байх хэрэгтэй.
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 дуудагчийн эзэмшилд байна. Энэ давталтын эргэн тойронд холболт болон уншилтын хугацааны хязгаар, програмын аливаа хэмжээний хязгаарыг хадгална уу. I/O алдаа нь бүтэлгүй таталт бөгөөд цөөн байттай амжилттай дуусах биш.
Уртыг нэг давхаргад харьцуулна уу. HTTP/1.1-ийн chunked кодчилол Content-Length-ийг орлож болох ба HTTP хэрэгжүүлэлт үүнийг тайлна. Прокси дахин хүрээлж болно. Шахах тайлалт нь програмын тайлагдсан байтын тоог кодлогдсон Content-Length-ээс өөр болгож болно.
Transfer-Encoding болон Content-Length хоёулаа гарч ирвэл тохиромжтой тоо сонгохгүй байх хэрэгтэй: HTTP хүрээлэлт нь дамжуулалтын кодчилолд давуу эрх өгч, хослолыг болзошгүй алдаа гэж үздэг. Тэр задлан шинжилгээг тохирох хэрэгжүүлэлтэд үлдээнэ үү.
HTTP гарцаар дамжуулсан FTP URL-ийн хувьд түүний тодорхой URLConnection зан төлөвийг шалгах шаардлагатай; энэ нь JDK бүрт HTTP толгойн хандалт бүр энгийн HTTP URL шиг ажиллана гэдгийг батлахгүй. Метадата чухал газарт урт утгатай length API ашиглаж, дууссан артефактыг бодитоор шаардлагатай урт эсвэл шалгах нийлбэртэй тулгаж баталгаажуулна уу. Биеийг унших нь өмнө байхгүй байсан толгойг гаргаж ирэхгүй.