Skip to content

Commit c517098

Browse files
author
Stephane Landelle
committed
Reuse channel for 407 Proxy Auth, close AsyncHttpClient#795
1 parent ec58da8 commit c517098

File tree

2 files changed

+31
-14
lines changed
  • providers

2 files changed

+31
-14
lines changed

providers/netty3/src/main/java/org/asynchttpclient/providers/netty3/handler/HttpProtocol.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,11 @@ private boolean exitAfterHandling401(//
254254
.build();
255255
}
256256

257-
Realm nr = newRealm;
258-
final Request nextRequest = new RequestBuilder(future.getRequest()).setHeaders(request.getHeaders()).setRealm(nr).build();
257+
final Request nextRequest = new RequestBuilder(future.getRequest()).setHeaders(request.getHeaders()).setRealm(newRealm).build();
259258

260259
logger.debug("Sending authentication to {}", request.getUri());
261260
if (future.isKeepAlive()) {
262261
if (HttpHeaders.isTransferEncodingChunked(response)) {
263-
// we must first drain the channel, let's use a fresh one for performing auth
264262
Channels.setAttribute(channel, new Callback(future) {
265263
public void call() throws IOException {
266264
requestSender.drainChannelAndExecuteNextRequest(channel, future, nextRequest);
@@ -295,8 +293,8 @@ private boolean exitAfterHandling100(final Channel channel, final NettyResponseF
295293
}
296294

297295
private boolean exitAfterHandling407(//
298-
Channel channel,//
299-
NettyResponseFuture<?> future,//
296+
final Channel channel,//
297+
final NettyResponseFuture<?> future,//
300298
HttpResponse response,//
301299
Request request,//
302300
int statusCode,//
@@ -319,10 +317,12 @@ private boolean exitAfterHandling407(//
319317
if (!proxyAuthHeaders.contains("Kerberos") && ntlmAuthenticate != null) {
320318
newRealm = ntlmProxyChallenge(ntlmAuthenticate, request, proxyServer, requestHeaders, realm, future, true);
321319
// SPNEGO KERBEROS
320+
322321
} else if (negociate) {
323322
newRealm = kerberosChallenge(channel, proxyAuthHeaders, request, proxyServer, requestHeaders, realm, future, true);
324323
if (newRealm == null)
325324
return true;
325+
326326
} else {
327327
newRealm = new Realm.RealmBuilder().clone(realm)//
328328
.setScheme(realm.getAuthScheme())//
@@ -334,10 +334,24 @@ private boolean exitAfterHandling407(//
334334
.build();
335335
}
336336

337-
future.setReuseChannel(true);
338-
future.setConnectAllowed(true);
339-
Request nextRequest = new RequestBuilder(future.getRequest()).setHeaders(requestHeaders).setRealm(newRealm).build();
340-
requestSender.sendNextRequest(nextRequest, future);
337+
final Request nextRequest = new RequestBuilder(future.getRequest()).setHeaders(request.getHeaders()).setRealm(newRealm).build();
338+
339+
logger.debug("Sending authentication to {}", request.getUri());
340+
if (future.isKeepAlive()) {
341+
future.setReuseChannel(true);
342+
if (HttpHeaders.isTransferEncodingChunked(response)) {
343+
Channels.setAttribute(channel, new Callback(future) {
344+
public void call() throws IOException {
345+
requestSender.drainChannelAndExecuteNextRequest(channel, future, nextRequest);
346+
}
347+
});
348+
} else {
349+
requestSender.sendNextRequest(nextRequest, future);
350+
}
351+
} else {
352+
channelManager.closeChannel(channel);
353+
requestSender.sendNextRequest(nextRequest, future);
354+
}
341355
return true;
342356
}
343357
}

providers/netty4/src/main/java/org/asynchttpclient/providers/netty4/handler/HttpProtocol.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ private boolean exitAfterHandling401(//
239239
return true;
240240

241241
} else {
242+
// BASIC or DIGEST
242243
newRealm = new Realm.RealmBuilder()//
243244
.clone(realm)//
244245
.setScheme(realm.getAuthScheme())//
@@ -249,20 +250,18 @@ private boolean exitAfterHandling401(//
249250
.build();
250251
}
251252

252-
Realm nr = newRealm;
253-
final Request nextRequest = new RequestBuilder(future.getRequest()).setHeaders(request.getHeaders()).setRealm(nr).build();
253+
final Request nextRequest = new RequestBuilder(future.getRequest()).setHeaders(request.getHeaders()).setRealm(newRealm).build();
254254

255255
logger.debug("Sending authentication to {}", request.getUri());
256256
if (future.isKeepAlive()) {
257+
future.setReuseChannel(true);
257258
if (HttpHeaders.isTransferEncodingChunked(response)) {
258-
// we must first drain the channel, let's use a fresh one for performing auth
259259
Channels.setAttribute(channel, new Callback(future) {
260260
public void call() throws IOException {
261261
requestSender.drainChannelAndExecuteNextRequest(channel, future, nextRequest);
262262
}
263263
});
264264
} else {
265-
future.setReuseChannel(true);
266265
requestSender.sendNextRequest(nextRequest, future);
267266
}
268267
} else {
@@ -312,13 +311,17 @@ private boolean exitAfterHandling407(//
312311
boolean negociate = proxyAuthHeaders.contains("Negotiate");
313312
String ntlmAuthenticate = getNTLM(proxyAuthHeaders);
314313
if (!proxyAuthHeaders.contains("Kerberos") && ntlmAuthenticate != null) {
314+
// NTLM
315315
newRealm = ntlmProxyChallenge(ntlmAuthenticate, request, proxyServer, requestHeaders, realm, future, true);
316-
// SPNEGO KERBEROS
316+
317317
} else if (negociate) {
318+
// SPNEGO KERBEROS
318319
newRealm = kerberosChallenge(channel, proxyAuthHeaders, request, proxyServer, requestHeaders, realm, future, true);
319320
if (newRealm == null)
320321
return true;
322+
321323
} else {
324+
// BASIC or DIGEST
322325
newRealm = new Realm.RealmBuilder().clone(realm)//
323326
.setScheme(realm.getAuthScheme())//
324327
.setUri(request.getUri())//

0 commit comments

Comments
 (0)