Impostazione della lunghezza del contenuto di una richiesta di post HTTP
-
11-12-2019 - |
Domanda
Sto cercando di creare una richiesta di post HTTP usando il client HTTP Apache.Sto cercando di copiare i contenuti di una richiesta di post HTTP (ricevuta alla mia applicazione) a un'altra richiesta di post HTTP (avviata dalla mia applicazione a un altro URL).Il codice è mostrato sotto:
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);
.
Fondamentalmente, sto cercando di implementare un'applicazione proxy che riceverà un URL come parametro, scattando la richiesta all'URL e quindi servono pagine ecc. Nell'aspetto personalizzato.
Qui request
è httpsvletRequest.Sto affrontando il problema nella regolazione della lunghezza del contenuto.Attraverso il debugging ho scoperto che clientToProxyBuf.available()
non mi dà la lunghezza corretta del flusso di input e ricevo l'errore HTTP 400 IE e Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection
in Chrome.
Sto facendo male?C'è qualche altro modo per raggiungerlo?
Soluzione
era piuttosto semplice e molto ovvio.Avevo solo bisogno di ottenere la lunghezza del contenuto dall'intestazione come:
basicHttpEntity.setContentLength(Integer.parseInt(request.getHeader("Content-Length")));
. Altri suggerimenti
La funzione available()
non fornisce la lunghezza effettiva del contenuto del flusso, piuttosto
.Restituisce il numero di byte che possono essere letti da questo flusso di ingresso senza blocco.(Da javadoc )
Ti suggerirei di leggere prima l'intero contenuto dal flusso, quindi impostare il contenuto, anziché passare l'oggetto del flusso.In questo modo, avrai anche la lunghezza effettiva del contenuto.