Клиент Джерси (2.4) — PUT InputStream, но Content-Length = 0

Я пытаюсь сделать запрос к Jersey REST service, который принимает InputStream как сущность, используя метод PUT.

Когда я это делаю, клиент из Джерси устанавливает для заголовка Content-Length значение 0.

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

org.apache.http.ProtocolException: заголовок Content-Length уже присутствует

Обратите внимание: исключение не выдается, когда я добавляю заголовок Content-Length (в этот момент этот заголовок не существует), оно выдается (я предполагаю), когда Jersey / Apache HTTPClient пытается добавить значение заголовка 0 позже.

Стек, если это поможет:

Вызвано: org.apache.http.client.ClientProtocolException в org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909) в org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient. java:827) на org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:326) ... еще 40

Вызвано: org.apache.http.ProtocolException: заголовок Content-Length уже присутствует в org.apache.http.protocol.RequestContent.process(RequestContent.java:96) в org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor .java:109) в org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java:176) в org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:518) в org.apache. http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) ... еще 42

Итак, любые идеи, почему Jersey / Apache HTTP Client устанавливает заголовок Content-Length в 0 и почему я не могу переопределить заголовок Content-Length

Я использую:

Jersey 2.4.1 с ApacheConnector

заранее спасибо

Буду


person Will    schedule 03.01.2014    source источник


Ответы (1)


Просто чтобы ответить на это:

Это проблема с ApacheConnector, который всегда будет возвращать -1 для размера содержимого, гарантируя, что это значение никогда не будет установлено. (Это жестко закодировано в методе getHttpEntity)

Следовательно, если требуется заголовок длины содержимого, необходимо либо повторно реализовать ApacheConnector, как описано здесь или используйте другой соединитель.

Я сообщил об этом на jira Джерси.

https://java.net/jira/browse/JERSEY-2373

person Will    schedule 30.01.2014