Java UrlConnection HTTP 1.0 - PullRequest
       13

Java UrlConnection HTTP 1.0

1 голос
/ 05 апреля 2009

Я пытаюсь загрузить файл из моего приложения Java. Но поскольку UrlConnection использует протокол HTTP 1.1, я получаю ответ Tranfer Encoding: chunked, в этом случае я не могу определить размер файла (длина содержимого не установлена). Из того, что я мог найти, HTTP-версия жестко запрограммирована в классе, и изменить ее невозможно. Можно ли каким-то образом изменить версию обратно на одну или указать серверу не использовать chunked-кодировку при отправке файла?

Изменить: я не пытаюсь получить динамический контент, мое приложение является менеджером загрузки. Файлы, которые я загружаю, являются статическими. Другие загрузчики, которые я проверял, wget, igetter, curl используют Http 1.0, и они получают информацию о размере от большинства серверов. Но мое приложение и Firefox, выдающие Http 1.1, всегда получают кусочную кодировку. Я понимаю, что длина контента не всегда присутствует, но я бы хотел получить ее большую часть времени.

Ответы [ 3 ]

3 голосов
/ 05 апреля 2009

HTTP-клиент Jakarta Commons содержит «предпочтительную архитектуру», которая обеспечивает некоторый детальный контроль над особенностями HTTP-соединения. Смотри http://hc.apache.org/httpclient-3.x/preference-api.html

3 голосов
/ 05 апреля 2009

Весьма вероятно, что сервер не может указать допустимую длину содержимого, даже если вы указываете HTTP / 1.0. Когда контент создается динамически, сервер должен буферизовать его все, чтобы измерить его общую длину. Не все серверы смогут использовать это менее эффективное поведение.

Если буферизация ответа является разумной, почему бы не сделать это в своем клиенте, где у вас есть полный контроль? Это безопаснее, чем полагаться на сервер.

Считайте ответ без обработки, просто вставив данные в ByteArrayOutputStream. Когда вы закончите, измерьте длину полученного байтового массива. Затем создайте ByteArrayInputStream и обработайте этот поток вместо потока, полученного из URLConnection.

0 голосов
/ 05 апреля 2009

Два способа мыслить:

  • Используйте HTTPClient вместо UrlConnection, но вам нужно установить параметр HTTPClient.forceHTTP_1.0=true для обеспечения HTTP1.0
  • Используйте сокет TCP и установите http поверх него (не так уж сложно). Я бы лично пошел с этим решением: P
...