URLConnection неправильно обрабатывает длину контента через прокси

Я столкнулся со следующей проблемой: когда URLConnection используется через прокси, длина контента всегда устанавливается равной . ]-1.

Сначала я проверил, что прокси действительно возвращает Content-Length (lynx и wget тоже работают через прокси; нет другого способа выйти в интернет из локальной сети):

$ lynx -source -head ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip
HTTP/1.1 200 OK
Last-Modified: Mon, 09 Jul 2007 17:02:37 GMT
Content-Type: application/x-zip-compressed
Content-Length: 30745
Connection: close
Date: Thu, 02 Feb 2012 17:18:52 GMT

$ wget -S -X HEAD ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip
--2012-04-03 19:36:54--  ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip
Resolving proxy... 10.10.0.12
Connecting to proxy|10.10.0.12|:8080... connected.
Proxy request sent, awaiting response...
  HTTP/1.1 200 OK
  Last-Modified: Mon, 09 Jul 2007 17:02:37 GMT
  Content-Type: application/x-zip-compressed
  Content-Length: 30745
  Connection: close
  Age: 0
  Date: Tue, 03 Apr 2012 17:36:54 GMT
Length: 30745 (30K) [application/x-zip-compressed]
Saving to: `WO2003-104476-001.zip'

В Java я написал:

URL url = new URL("ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip");
int length = url.openConnection().getContentLength();
logger.debug("Got length: " + length);

и получаю -1.Я начал отлаживать FtpURLConnection и получилось из того, что необходимая информация находится в базовом HttpURLConnection.поле responses, однако оно никогда не заполняется должным образом оттуда:

enter image description here (в заголовках есть Content-Length: 30745). Длина содержимого не обновляется, когда вы начинаете читать поток или даже после того, как поток был прочитан. Код:

URL url = new URL("ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip");
URLConnection connection = url.openConnection();

logger.debug("Got length (1): " + connection.getContentLength());

InputStream input = connection.getInputStream();

byte[] buffer = new byte[4096];
int count = 0, len;
while ((len = input.read(buffer)) > 0) {
    count += len;
}

logger.debug("Got length (2): " + connection.getContentLength() + " but wanted " + count);

Вывод:

Got length (1): -1
Got length (2): -1 but wanted 30745

Похоже, это ошибка в JDK6, поэтому я открыл новую ошибку#7168608.

  • Если кто-то может помочь мне написать код, он должен возвращать правильную длину содержимого для прямого FTP-подключения, FTP-подключения через прокси и локальных URL-адресов file:/. Буду признателен.
  • Если данная проблема не может быть решена с помощью JDK6, предложите любую другую библиотеку, которая определенно работает во всех случаях, которые я упомянул (Apache Http Client?).

5
задан dma_k 14 May 2012 в 14:46
поделиться