Definição de comprimento de conteúdo de uma solicitação HTTP POST
-
11-12-2019 - |
Pergunta
Eu estou tentando fazer uma solicitação Http POST usando o apache HTTP do cliente.Eu estou tentando copiar o conteúdo de uma solicitação HTTP POST (recebido em meu aplicativo) para outra solicitação HTTP POST (iniciada a partir do meu aplicativo para outro URL).O código é mostrado abaixo:
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);
Basicamente, eu estou tentando implementar um proxy de aplicativo que vai ter uma url como parâmetro, perverso a solicitação para a URL e, em seguida, servir páginas, etc personalizada olhar e sentir.
Aqui request
é HttpServletRequest.Eu estou enfrentando problema na configuração de comprimento de conteúdo.Por meio de depuração que eu descobri que clientToProxyBuf.available()
não está me dando o comprimento correto do fluxo de entrada e estou recebendo o erro Http 400 IE e Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection
no google chrome.
Estou fazendo de errado?Existe alguma outra maneira de o conseguir?
Solução
Ele foi bastante simples e muito óbvio.Eu apenas o necessário para obter o conteúdo de comprimento de cabeçalho:
basicHttpEntity.setContentLength(Integer.parseInt(request.getHeader("Content-Length")));
Outras dicas
O available()
função não fornece o comprimento real do conteúdo do fluxo, ao invés de
Retorna o número de bytes que pode ser lido a partir desse fluxo de entrada sem bloqueio.(A partir de javadoc)
Eu sugiro que você primeiro leia todo o conteúdo do fluxo e, em seguida, definir que para o conteúdo, em vez de passar o objeto de fluxo.Dessa forma, você também vai ter o comprimento real do conteúdo.