hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Oleg Kalnichevski (JIRA)" <j...@apache.org>
Subject [jira] Commented: (HTTPCORE-242) NullPointerException in AsyncNHttpClientHandler when server sends reply before request is fully written.
Date Sun, 21 Nov 2010 21:28:04 GMT

    [ https://issues.apache.org/jira/browse/HTTPCORE-242?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12934355#action_12934355

Oleg Kalnichevski commented on HTTPCORE-242:

Hi Michael

So far, no luck. The test app produces the following output for me
Listening on port 7345
Press any key to exit.
Incoming connection from /
New connection thread
Unrecoverable HTTP protocol violation: Invalid request line: 1ff4
Handling authentication
Created new auth scheme: ntlm
Reusing connection for authentication.
I looked at the pcap dump but could not make much out of it. A plain text version would be
very much appreciated. However, a wire log produced by HttpCore itself would still be the
best option for me, as I would enable me to correlate the I/O events triggered on the connection
with the connection state.

What I find very suspicious is that the response does not contain 'Connect: close' directive,
which is the usual practice when a web servers chooses to respond to a request without receiving
the complete request body.


> NullPointerException in AsyncNHttpClientHandler  when server sends reply before request
is fully written.
> ---------------------------------------------------------------------------------------------------------
>                 Key: HTTPCORE-242
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-242
>             Project: HttpComponents HttpCore
>          Issue Type: Bug
>          Components: HttpCore NIO
>    Affects Versions: 4.1
>         Environment: Server:  IIS/7.5 with NTLM authentication.
>            Reporter: Michael Poindexter
>         Attachments: httcore-quickresponse.pcap, HTTPCORE-242.patch, httpcore-connection-reuse-bug.zip,
> I'm seeing a problem with AsyncNHttpClientHandler in v4.1 of HttpCore.  When I submit
a number of requests simultaneously or a single POST with a large body to a server using NTLM
authentication, I get this exception:
> Caused by: java.lang.NullPointerException
> at org.apache.http.nio.protocol.AsyncNHttpClientHandler.outputReady(AsyncNHttpClientHandler.java:268)
> at org.apache.http.nio.protocol.BufferingHttpClientHandler.outputReady(BufferingHttpClientHandler.java:118)
> at org.apache.http.impl.nio.DefaultNHttpClientConnection.produceOutput(DefaultNHttpClientConnection.java:207)
> at org.apache.http.impl.nio.ssl.SSLClientIOEventDispatch.outputReady(SSLClientIOEventDispatch.java:245)
> at com.qumu.cxf.rt.transport.ahttp.MultiProtocolIOEventDispatch.outputReady(MultiProtocolIOEventDispatch.java:49)
> at org.apache.http.impl.nio.reactor.BaseIOReactor.writable(BaseIOReactor.java:185)
> at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:338)
> at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
> at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:275)
> at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
> at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:542)
> at java.lang.Thread.run(Thread.java:680)
> The server I am connecting to is IIS/7.5. I am using NTLM authentication (with JCIFS),
so I need to keep the connection alive through several round trips as the NTLM message exchange
> I dug into the HttpCore code, and here is my analysis of what is occurring:
> 1.) AsyncNHttpClientHandler.connect calls requestReady to send the initial request. 
This sets the request on the connection, and the connection starts writing the request line
in response to write events.
> 2.) The server receives the request line and responds immediately with a 401 Unauthorized.
 At this point the POST body has not been fully sent to the server.
> 3.) AsyncNHttpClientHandler.inputReady is called with the response from the server. 
At this point processResponse is called, and my code executes.  I detect that the request
needs authentication and I need to retransmit my request with an auth header, so my ConnectionReuseStrategy
says to keep the connection alive.
> 4.) When control returns from my code, the code in processResponse calls connState.resetOutput,
clearing the entity and request in connState.  There is still output from the POST body pending.
> 5.)  processResponse calls conn.requestOutput to reenable write events since the connection
is not to be closed.
> 6.)  A write event happens, and DefaultNHttpClientConnection.produceOutput is called.
 Since the output from the initial request never finished, contentEncoder is not null and
so AsyncNHttpClientHandler.outputReady is called instead of requestReady.  Since connState
was reset, the entity is null and this NPE happens.
> I copied the code of AsyncNHttpClientHandler and added a conn.suspendInput() call in
>            if (entityReq != null && entityReq.expectContinue()) {
>                .....
>            } else {
>            conn.suspendInput();
>            }
> and a conn.requestInput call in outputReady:
>            entity.produceContent(encoder, conn);
>            if(encoder.isCompleted()) {
>            conn.requestInput();
>            }
> and this seemed to resolve the issue by not allowing the request and response to overlap,
but I'm not sure this is the best way to fix it.

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org

View raw message