Установка длины содержимого запроса HTTP POST
-
11-12-2019 - |
Вопрос
Я пытаюсь выполнить запрос Http POST с помощью HTTP-клиента Apache.Я пытаюсь скопировать содержимое запроса HTTP POST (полученного моим приложением) в другой запрос HTTP POST (инициированный моим приложением на другой URL-адрес).Код показан ниже:
httpPost = new HttpPost(inputURL);
// copy headers
for (Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements();) {
String headerName = e.nextElement().toString();
httpPost.setHeader(headerName, request.getHeader(headerName));
}
BufferedInputStream clientToProxyBuf = new BufferedInputStream(request.getInputStream());
BasicHttpEntity basicHttpEntity = new BasicHttpEntity();
basicHttpEntity.setContent(clientToProxyBuf);
basicHttpEntity.setContentLength(clientToProxyBuf.available());
httpPost.setEntity(basicHttpEntity);
HttpResponse responseFromWeb = httpclient.execute(httpPost);
По сути, я пытаюсь реализовать прокси-приложение, которое будет получать URL-адрес в качестве параметра, перенаправлять запрос на URL-адрес, а затем обслуживать страницы и т. д. в индивидуальном стиле.
Здесь request
это HttpServletRequest.Я столкнулся с проблемой установки длины контента.Путем отладки я узнал, что clientToProxyBuf.available()
не дает мне правильную длину входного потока, и я получаю ошибку Http 400 IE и Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection
в хроме.
Я делаю это неправильно?Есть ли другой способ добиться этого?
Решение
Это было довольно просто и очень очевидно.Мне просто нужно было получить длину контента из заголовка как:
basicHttpEntity.setContentLength(Integer.parseInt(request.getHeader("Content-Length")));
Другие советы
А available()
функция не предоставляет фактическую длину содержимого потока, а скорее
Возвращает количество байтов, которые можно прочитать из этого входного потока без блокировки.(От Javadoc)
Я бы предложил вам сначала прочитать весь контент из потока, а затем установить его в контент, а не передавать объект потока.Таким образом, вы также получите фактическую длину контента.