Проблема gzipping тела HttpPost с помощью Apache Client 4.1.1 - PullRequest
1 голос
/ 11 мая 2011

Мне нужно отправить HTTPPost с телом gzipped, сервер также принимает данные не gzipped, но предпочел бы, чтобы они были сжаты, поэтому я пытаюсь преобразовать некоторый существующий рабочий код для использования gzip. В настоящее время данные установлены с

    httpMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));

Я попытался создать подкласс HttpEntityWrapper

static class GzipWrapper extends HttpEntityWrapper
{
    public GzipWrapper(HttpEntity wrapped)
    {
        super(wrapped);
    }

    public void writeTo(OutputStream outstream)
         throws IOException
    {
        GZIPOutputStream gzip = new GZIPOutputStream(outstream);
        super.writeTo(gzip);
    }
}

и изменился на

    httpMethod.setEntity(new GzipWrapper(
          new UrlEncodedFormEntity(nameValuePairs)));

и добавил

    if (!httpMethod.containsHeader("Accept-Encoding"))
    {
        httpMethod.addHeader("Accept-Encoding", "gzip");
    }

, но теперь мой запрос просто время ожидания, я думаю, что должночто-то не так с моим GZIpWrapper, но я не уверен, что.

В другой заметке я посмотрел на пример http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java..Помимо того, что мне не нравятся перехватчики, потому что трудно следить за ходом программы, для меня это не имеет смысла, потому что заголовок запроса настроен на указание серверу принимать данные gzip, но нигде он фактически не кодирует любые данные gzip, он только распаковывает файлыответ.

1 Ответ

2 голосов
/ 11 мая 2011

(1) Реализация GzipWrapper неверна.Он преобразует содержимое сущности при записи его в выходной поток, но все равно возвращает Content-Length обернутой сущности, в результате чего сервер ожидает большего ввода, чем фактически передано клиентом.

(2) Выполностью неправильно понимает назначение заголовка Accept-Encoding

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

(3) Образец ClientGZipContentCompression верен.Он не сжимает объект исходящего запроса, потому что не предназначен для этого.См. Пункт (2)

...