[
https://issues.apache.org/jira/browse/HTTPCORE-475?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Oleg Kalnichevski resolved HTTPCORE-475.
----------------------------------------
Resolution: Invalid
Predictably the problem had nothing to do with 204 message handling. Using your
PHP code all it took is to keep the browser idle for a fairly short while and
reload the page. The incoming connection (between the browser and the proxy)
was alive and valid while the outgoing connection (between the proxy and the
origin) was rendered stale by the origin server closing it on its end. All this
time the I/O thread was blocked awaiting a request from the incoming connection
and had no chance to react to I/O events on the outgoing connection. After
receiving a request from the browser the proxy sent a request to the origin
server using the stale connection predictably getting
{{NoHttpResponseException}} as a result. Making the proxy able to cope with
stale outgoing connections fixed the problem for me.
I am very tempted to completely remove ElementalReverseProxy from the
distribution and advise to use the non-blocking reverse proxy example instead.
Oleg
> Occasional issues in handling "204 No Content"
> ----------------------------------------------
>
> Key: HTTPCORE-475
> URL: https://issues.apache.org/jira/browse/HTTPCORE-475
> Project: HttpComponents HttpCore
> Issue Type: Bug
> Components: Examples, HttpCore
> Affects Versions: 4.4.6
> Environment: Windows, Java 8
> Reporter: M.S. Dousti
> Priority: Minor
> Attachments: without-proxy.png, with-proxy.png
>
>
> While testing {{ElementalReverseProxy}}, I noted that occasionally, some
> requests fail. Digging further, it seems that the code has some difficulty in
> handling POST requests whose responses have "204 No Content" status. The bug
> is intermittent, so it is a bit tricky to reproduce. One way is to run the
> proxy against [http://www.bing.com]. (Notice it's HTTP and not HTTPS). Here
> are the steps:
> 1) Change line 274 of {{ElementalReverseProxy}} to further assist in
> debugging, from:
> {code:java}
> System.err.println("I/O error: " + ex.getMessage());
> {code}
> to:
> {code:java}
> ex.printStackTrace(); System.exit(-1);
> {code}
> 2) Add the following lines to your {{hosts}} file ({{/etc/hosts}} in Linux,
> and {{%SystemRoot%\System32\drivers\etc\hosts}} in Windows):
> {code:none}
> 127.0.0.1 bing.com
> 127.0.0.1 www.bing.com
> {code}
> 3) Run {{ElementalReverseProxy}} against one of Bing's IP addresses. I used
> {{204.79.197.200}}.
> 4) Navigate your browser to {{http://www.bing.com:8888}}, and watch the
> output of
> {{ElementalReverseProxy}}. Here's a sample run:
> {noformat}
> Listening on port 8888
> Incoming connection from /127.0.0.1
> Outgoing connection to /204.79.197.200
> New connection thread
> >> Request URI: /
> << Response: HTTP/1.1 200 OK
> Incoming connection from /127.0.0.1
> Outgoing connection to /204.79.197.200
> Incoming connection from /127.0.0.1
> New connection thread
> >> Request URI:
> >> /fd/ls/l?IG=3C1FD9BC348B419DAF07D5D09D135555&CID=3ED5D1926AB96D71082FDB206BCB6CA6&Type=Event.CPT&DATA={%22pp%22:{%22S%22:%22L%22,%22FC%22:-1,%22BC%22:-1,%22SE%22:-1,%22TC%22:-1,%22H%22:116,%22BP%22:134,%22CT%22:169,%22IL%22:1},%22ad%22:[-1,-1,1600,770,1600,770,0]}&P=SERP&DA=Bn2
> Outgoing connection to /204.79.197.200
> New connection thread
> >> Request URI: /fd/ls/lsp.aspx?
> Incoming connection from /127.0.0.1
> Outgoing connection to /204.79.197.200
> New connection thread
> Incoming connection from /127.0.0.1
> >> Request URI:
> >> /notifications/render?bnptrigger=%7B%22PartnerId%22%3A%22HomePage%22%2C%22IID%22%3A%22SERP.2000%22%2C%22Attributes%22%3A%7B%22RawRequestURL%22%3A%22%2F%22%7D%7D&IG=3C1FD9BC348B419DAF07D5D09D135555&IID=SERP.2000
> Outgoing connection to /204.79.197.200
> New connection thread
> Incoming connection from /127.0.0.1
> >> Request URI: /sa/8_01_0_000000/HpbHeaderPopup.js
> << Response: HTTP/1.1 204 OK
> Outgoing connection to /204.79.197.200
> New connection thread
> >> Request URI: /sa/8_01_0_000000/homepageImgViewer_c.js
> << Response: HTTP/1.1 200 OK
> << Response: HTTP/1.1 200 OK
> << Response: HTTP/1.1 200 OK
> >> Request URI:
> >> /HPImageArchive.aspx?format=js&idx=0&n=1&nc=1498898493932&pid=hp
> org.apache.http.NoHttpResponseException: The target server failed to
> respondIncoming connection from /127.0.0.1
> at
> org.apache.http.impl.io.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:131)
> at
> org.apache.http.impl.io.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:53)
> at
> org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
> at
> org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
> at
> org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
> at
> org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
> at
> ElementalReverseProxy$ProxyHandler.handle(ElementalReverseProxy.java:134)
> at
> org.apache.http.protocol.HttpService.doService(HttpService.java:437)
> at
> org.apache.http.protocol.HttpService.handleRequest(HttpService.java:342)
> at
> ElementalReverseProxy$ProxyThread.run(ElementalReverseProxy.java:262)
> {noformat}
> I don't know whether the problem lies within {{ElementalReverseProxy}}, or
> the way HC handles the requests/responses.
> I also wrote a simple PHP/HTML/JavaScript to reproduce the error without
> relying on Bing, which I can provide if needed.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]