[ 
https://issues.apache.org/jira/browse/HTTPASYNC-143?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Isa Muqattash updated HTTPASYNC-143:
------------------------------------
    Description: 
Recently switched from the (synchronous) HttpClient to HttpAsyncClient, and I'm 
dealing with a HTTP 401 error returned from an HTTP POST that involves NTLM 
authentication.

The issue sporadically occurs, more frequently with HttpAsyncClient 4.1.3, and 
still occurs in 4.1.4 but less frequently.

 The HTTP POST request incorrectly includes a "Content-Type: Application/JSON" 
header and the body is a ZIP file binary, and removing that header seems to 
make the issue go away, or at least I cannot reproduce the random behavior when 
the head is not specified. However, all this worked fine with the synchronous 
HttpClient and it will be difficult to go to many many applications and remove 
that additional header, which I'm not sure why it would cause this issue 
described here.

I enabled context and wire logs, and what I'm seeing is that the three-step 
NTLM handshake takes place. When the issue does not reproduce, all three steps 
occur on the same connection. But when the issue reproduces, the context and 
wire logs show that the connection is closed between each of the three steps.

Furthermore, I looked into this for several days and the issue reproduces more 
frequently with some zip binaries rather than other. The same zip file 
sometimes succeeds but other times fails.

Perhaps there is some JSON parsing taking place that randomly causes issues and 
causes the connection to be closed? (I'm just rambling now but just trying to 
give as much info as possible...)

Sample success and failure handshake logs attached.

Source code I'm using is as follows (stripped down):

 
{code:java}
val httpclientB = HttpAsyncClients.custom().setRedirectStrategy(new 
LaxRedirectStrategy() {
   override def createLocationURI(location: String): URI = {
      super.createLocationURI(location)
}

override def isRedirected(req: HttpRequest, resp: HttpResponse, ctxt: 
HttpContext): Boolean = {
   super.isRedirected(req, resp, ctxt)
} 

override def getRedirect(req: HttpRequest, resp: HttpResponse, ctxt: 
HttpContext): HttpUriRequest = {
   val x = super.getRedirect(req, resp, ctxt)
   if (x.containsHeader("Content-Length")) {
      x.removeHeaders("Content-Length")
   }
   x
}
})

val credsProvider = new BasicCredentialsProvider()
credsProvider.setCredentials(AuthScope.ANY, new NTCredentials("foo", "bar", 
"baz", "domain"))
httpclientB.setDefaultCredentialsProvider(credsProvider)

val httpClient = httpclientB.useSystemProperties().build()
httpClient.start()
val future = httpClient.execute(httpRequest, null)
future.get(Long.MaxValue, TimeUnit.MILLISECONDS))
{code}
 

 

  was:
Recently switched from the (synchronous) HttpClient to HttpAsyncClient, and I'm 
dealing with a HTTP 401 error returned from an HTTP POST that involves NTLM 
authentication.

The issue sporadically occurs, more frequently with HttpAsyncClient 4.1.3, and 
still occurs in 4.1.4 but less frequently.

 

The HTTP POST request incorrectly includes a "Content-Type: Application/JSON" 
header and the body is a ZIP file binary, and removing that header seems to 
make the issue go away, or at least I cannot reproduce the random behavior when 
the head is not specified. However, all this worked fine with the synchronous 
HttpClient and it will be difficult to go to many many applications and remove 
that additional header, which I'm not sure why it would cause this issue 
described here.

 

 

I enabled context and wire logs, and what I'm seeing is that the three-step 
NTLM handshake takes place. When the issue does not reproduce, all three steps 
occur on the same connection. But when the issue reproduces, the context and 
wire logs show that the connection is closed between each of the three steps.

 

Furthermore, I looked into this for several days and the issue reproduces more 
frequently with some zip binaries rather than other. The same zip file 
sometimes succeeds but other times fails.

 

Perhaps there is some JSON parsing taking place that randomly causes issues and 
causes the connection to be closed? (I'm just rambling now but just trying to 
give as much info as possible...)

 

Sample success and failure handshake logs attached.

 

Source code I'm using is as follows (stripped down):

 
{code:java}
val httpclientB = HttpAsyncClients.custom().setRedirectStrategy(new 
LaxRedirectStrategy() {
   override def createLocationURI(location: String): URI = {
      super.createLocationURI(location)
}

override def isRedirected(req: HttpRequest, resp: HttpResponse, ctxt: 
HttpContext): Boolean = {
   super.isRedirected(req, resp, ctxt)
} 

override def getRedirect(req: HttpRequest, resp: HttpResponse, ctxt: 
HttpContext): HttpUriRequest = {
   val x = super.getRedirect(req, resp, ctxt)
   if (x.containsHeader("Content-Length")) {
      x.removeHeaders("Content-Length")
   }
   x
}
})

val credsProvider = new BasicCredentialsProvider()
credsProvider.setCredentials(AuthScope.ANY, new NTCredentials("foo", "bar", 
"baz", "domain"))
httpclientB.setDefaultCredentialsProvider(credsProvider)

val httpClient = httpclientB.useSystemProperties().build()
httpClient.start()
val future = httpClient.execute(httpRequest, null)
future.get(Long.MaxValue, TimeUnit.MILLISECONDS))
{code}
 

 


> Connection closed randomly during NTLM authorization
> ----------------------------------------------------
>
>                 Key: HTTPASYNC-143
>                 URL: https://issues.apache.org/jira/browse/HTTPASYNC-143
>             Project: HttpComponents HttpAsyncClient
>          Issue Type: Bug
>    Affects Versions: 4.1.4
>            Reporter: Isa Muqattash
>            Priority: Major
>         Attachments: asyncHttpClient_failed.log, asyncHttpClient_success.log
>
>
> Recently switched from the (synchronous) HttpClient to HttpAsyncClient, and 
> I'm dealing with a HTTP 401 error returned from an HTTP POST that involves 
> NTLM authentication.
> The issue sporadically occurs, more frequently with HttpAsyncClient 4.1.3, 
> and still occurs in 4.1.4 but less frequently.
>  The HTTP POST request incorrectly includes a "Content-Type: 
> Application/JSON" header and the body is a ZIP file binary, and removing that 
> header seems to make the issue go away, or at least I cannot reproduce the 
> random behavior when the head is not specified. However, all this worked fine 
> with the synchronous HttpClient and it will be difficult to go to many many 
> applications and remove that additional header, which I'm not sure why it 
> would cause this issue described here.
> I enabled context and wire logs, and what I'm seeing is that the three-step 
> NTLM handshake takes place. When the issue does not reproduce, all three 
> steps occur on the same connection. But when the issue reproduces, the 
> context and wire logs show that the connection is closed between each of the 
> three steps.
> Furthermore, I looked into this for several days and the issue reproduces 
> more frequently with some zip binaries rather than other. The same zip file 
> sometimes succeeds but other times fails.
> Perhaps there is some JSON parsing taking place that randomly causes issues 
> and causes the connection to be closed? (I'm just rambling now but just 
> trying to give as much info as possible...)
> Sample success and failure handshake logs attached.
> Source code I'm using is as follows (stripped down):
>  
> {code:java}
> val httpclientB = HttpAsyncClients.custom().setRedirectStrategy(new 
> LaxRedirectStrategy() {
>    override def createLocationURI(location: String): URI = {
>       super.createLocationURI(location)
> }
> override def isRedirected(req: HttpRequest, resp: HttpResponse, ctxt: 
> HttpContext): Boolean = {
>    super.isRedirected(req, resp, ctxt)
> } 
> override def getRedirect(req: HttpRequest, resp: HttpResponse, ctxt: 
> HttpContext): HttpUriRequest = {
>    val x = super.getRedirect(req, resp, ctxt)
>    if (x.containsHeader("Content-Length")) {
>       x.removeHeaders("Content-Length")
>    }
>    x
> }
> })
> val credsProvider = new BasicCredentialsProvider()
> credsProvider.setCredentials(AuthScope.ANY, new NTCredentials("foo", "bar", 
> "baz", "domain"))
> httpclientB.setDefaultCredentialsProvider(credsProvider)
> val httpClient = httpclientB.useSystemProperties().build()
> httpClient.start()
> val future = httpClient.execute(httpRequest, null)
> future.get(Long.MaxValue, TimeUnit.MILLISECONDS))
> {code}
>  
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to