Мы пытаемся отправить 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 ). Кажется, это помогает. Может ли кто-нибудь объяснить, является ли это решением и почему оно одно. Спасибо.
http
илиajp
для подключения к Tomcat? Вы используете mod_proxy_balancer? - person rustyx   schedule 07.09.2020