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: В настоящее время мы отключили режим chunked: con.setChunkedStreamingMode ( 0) Это, кажется, помогает. Может кто-нибудь может объяснить, если это решение и почему это так. Благодарю.
1 ответ
Хорошо, на данный момент мы смогли решить эту проблему, отключив отправку данных в чанкованном режиме.
con.setChunkedStreamingMode ( 0 )
В то время как у нас есть некоторые идеи, почему это решает проблему, у нас нет подробного объяснения.
Пока ни у кого нет лучшего решения или объяснения, я принимаю это решение.