Apache 2.4.6 - отправка содержимого GZIP ИНОГДА приводит к чтению большего количества байтов тела запроса, чем ожидалось

Мы пытаемся отправить GZIP-контент в ваше веб-приложение, которое размещено на Tomcat за Apache 2, с помощью директив mod_proxy ProxyPass и ProxyPassReverse. В большинстве случаев это работает, но иногда Apache отклоняет эти пакеты, и мы получаем следующие ошибки в наших журналах ошибок Apache:

[proxy_http:error] ... AH01086: read more bytes of request body than expected (got 16384, expected 1562)  
[proxy_http:error] ... AH01097: pass request body failed to x.x.x.x:8080 (x.x.x.x) from x (x.x.x.x)

Код, отправляющий данные, основан на HttpsURLConnection и выполняется с устройства Android. Это выглядит примерно так:

URL url = new URL(Constants.URL);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();

con.setRequestMethod("POST");
con.setUseCaches(false);
con.setDoInput(true);
con.setDoOutput(true);
con.setRequestProperty("Content-Encoding", "gzip");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("User-Agent", "MyApp 1.0");

OutputStream outputStream = con.getOutputStream();
outputStream.write( zipStringToBytes("Some possibly long content.") );

outputStream.flush();
outputStream.close();

int responseCode = con.getResponseCode();

И эта функция создает нашу строку GZIP:

private static byte[] zipStringToBytes(String input) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    //use PrintStream to avod converting a String into byte array, that can cause out of memory error
    final PrintStream printStream = new PrintStream(new GZIPOutputStream(bos));
    printStream.print(input);
    printStream.close();

    byte[] retval = bos.toByteArray();
    bos.close();
    return retval;
}

Нам пока не удалось выяснить причину этого. Тем более, что это происходит спорадически. Это заставляет нас думать, что это может быть проблема с Content-Length или нашим кодом, отправляющим данные в целом, но мы не знаем и не можем найти и связанные с этим проблемы. Если у вас есть какие-либо указания по этому поводу, мы будем очень признательны.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Обновление: мы обнаружили, что ожидаемый размер всегда один и тот же: 16384, но ожидаемый размер варьируется. Может быть, это поможет.

Обновление 2: в настоящее время мы отключили режим фрагментирования: con.setChunkedStreamingMode ( 0 ). Кажется, это помогает. Может ли кто-нибудь объяснить, является ли это решением и почему оно одно. Спасибо.


person Martin Becker    schedule 30.09.2015    source источник
comment
У меня такая же проблема, но я не могу контролировать код на стороне клиента. Если кто-нибудь знает решение на стороне сервера (например, настройку apache), я был бы очень признателен.   -  person jwilner    schedule 17.05.2017
comment
Вы используете http или ajp для подключения к Tomcat? Вы используете mod_proxy_balancer?   -  person rustyx    schedule 07.09.2020


Ответы (1)


Хорошо, на данный момент мы смогли решить проблему, отключив отправку данных в режиме фрагментов.

con.setChunkedStreamingMode ( 0 )

Хотя у нас есть некоторые идеи, почему это решает проблему, мы не придумали подробного объяснения.

Пока ни у кого нет лучшего решения или объяснения, я принимаю это решение.

person Martin Becker    schedule 12.10.2015