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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top