@@ -554,6 +554,11 @@ private static HttpRequest construct(AsyncHttpClientConfig config,
554
554
if (config .isCompressionEnabled ()) {
555
555
nettyRequest .setHeader (HttpHeaders .Names .ACCEPT_ENCODING , HttpHeaders .Values .GZIP );
556
556
}
557
+ } else {
558
+ List <String > auth = request .getHeaders ().get (HttpHeaders .Names .PROXY_AUTHORIZATION );
559
+ if (auth != null && auth .size () > 0 && auth .get (0 ).startsWith ("NTLM" )) {
560
+ nettyRequest .addHeader (HttpHeaders .Names .PROXY_AUTHORIZATION , auth .get (0 ));
561
+ }
557
562
}
558
563
ProxyServer proxyServer = request .getProxyServer () != null ? request .getProxyServer () : config .getProxyServer ();
559
564
Realm realm = request .getRealm () != null ? request .getRealm () : config .getRealm ();
@@ -626,8 +631,24 @@ private static HttpRequest construct(AsyncHttpClientConfig config,
626
631
}
627
632
628
633
if (proxyServer .getPrincipal () != null ) {
629
- nettyRequest .setHeader (HttpHeaders .Names .PROXY_AUTHORIZATION ,
634
+ if (proxyServer .getNtlmDomain () != null ) {
635
+
636
+ List <String > auth = request .getHeaders ().get (HttpHeaders .Names .PROXY_AUTHORIZATION );
637
+ if (!(auth != null && auth .size () > 0 && auth .get (0 ).startsWith ("NTLM" ))) {
638
+ try {
639
+ String msg = ntlmEngine .generateType1Msg (proxyServer .getNtlmDomain (),
640
+ proxyServer .getHost ());
641
+ nettyRequest .setHeader (HttpHeaders .Names .PROXY_AUTHORIZATION , "NTLM " + msg );
642
+ } catch (NTLMEngineException e ) {
643
+ IOException ie = new IOException ();
644
+ ie .initCause (e );
645
+ throw ie ;
646
+ }
647
+ }
648
+ } else {
649
+ nettyRequest .setHeader (HttpHeaders .Names .PROXY_AUTHORIZATION ,
630
650
AuthenticatorUtils .computeBasicAuthentication (proxyServer ));
651
+ }
631
652
}
632
653
}
633
654
@@ -824,11 +845,12 @@ private <T> ListenableFuture<T> doConnect(final Request request, final AsyncHand
824
845
825
846
boolean useSSl = uri .getScheme ().compareToIgnoreCase (HTTPS ) == 0 && proxyServer == null ;
826
847
if (channel != null && channel .isOpen () && channel .isConnected ()) {
827
- HttpRequest nettyRequest = buildRequest (config , request , uri , false , bufferedBytes );
848
+ HttpRequest nettyRequest = buildRequest (config , request , uri , f == null ? false : f . isConnectAllowed () , bufferedBytes );
828
849
829
850
if (f == null ) {
830
851
f = newFuture (uri , request , asyncHandler , nettyRequest , config , this );
831
852
} else {
853
+ nettyRequest = buildRequest (config , request , uri , f .isConnectAllowed (), bufferedBytes );
832
854
f .setNettyRequest (nettyRequest );
833
855
}
834
856
f .setState (NettyResponseFuture .STATE .POOLED );
@@ -1159,8 +1181,9 @@ public Object call() throws Exception {
1159
1181
log .debug ("Sending proxy authentication to {}" , request .getUrl ());
1160
1182
1161
1183
future .setState (NettyResponseFuture .STATE .NEW );
1162
- if (!proxyAuth .contains ("Kerberos" ) && (proxyAuth .contains ("NTLM" ) || (proxyAuth .contains ("Negotiate" )))) {
1163
- newRealm = ntlmChallenge (proxyAuth , request , proxyServer , headers , realm , future );
1184
+
1185
+ if (!proxyAuth .contains ("Kerberos" ) && (proxyAuth .get (0 ).contains ("NTLM" ) || (proxyAuth .contains ("Negotiate" )))) {
1186
+ newRealm = ntlmProxyChallenge (proxyAuth , request , proxyServer , headers , realm , future );
1164
1187
// SPNEGO KERBEROS
1165
1188
} else if (proxyAuth .contains ("Negotiate" )) {
1166
1189
newRealm = kerberosChallenge (proxyAuth , request , proxyServer , headers , realm , future );
@@ -1169,7 +1192,10 @@ public Object call() throws Exception {
1169
1192
newRealm = future .getRequest ().getRealm ();
1170
1193
}
1171
1194
1172
- nextRequest (builder .setHeaders (headers ).setRealm (newRealm ).build (), future );
1195
+ Request req = builder .setHeaders (headers ).setRealm (newRealm ).build ();
1196
+ future .setReuseChannel (true );
1197
+ future .setConnectAllowed (true );
1198
+ nextRequest (req , future );
1173
1199
return ;
1174
1200
}
1175
1201
@@ -1188,7 +1214,10 @@ public Object call() throws Exception {
1188
1214
} catch (Throwable ex ) {
1189
1215
abort (future , ex );
1190
1216
}
1191
- nextRequest (builder .build (), future );
1217
+ Request req = builder .build ();
1218
+ future .setReuseChannel (true );
1219
+ future .setConnectAllowed (false );
1220
+ nextRequest (req , future );
1192
1221
return ;
1193
1222
}
1194
1223
@@ -1380,10 +1409,43 @@ private Realm ntlmChallenge(List<String> wwwAuth,
1380
1409
realmBuilder = new Realm .RealmBuilder ();
1381
1410
}
1382
1411
newRealm = realmBuilder .setScheme (realm .getAuthScheme ())
1412
+ .setUri (URI .create (request .getUrl ()).getPath ())
1413
+ .setMethodName (request .getMethod ())
1414
+ .build ();
1415
+ }
1416
+
1417
+ return newRealm ;
1418
+ }
1419
+
1420
+ private Realm ntlmProxyChallenge (List <String > wwwAuth ,
1421
+ Request request ,
1422
+ ProxyServer proxyServer ,
1423
+ FluentCaseInsensitiveStringsMap headers ,
1424
+ Realm realm ,
1425
+ NettyResponseFuture <?> future ) throws NTLMEngineException {
1426
+ future .getAndSetAuth (false );
1427
+ headers .remove (HttpHeaders .Names .PROXY_AUTHORIZATION );
1428
+
1429
+ if (wwwAuth .get (0 ).startsWith ("NTLM " )) {
1430
+ String serverChallenge = wwwAuth .get (0 ).trim ().substring ("NTLM " .length ());
1431
+ String challengeHeader = ntlmEngine .generateType3Msg (proxyServer .getPrincipal (),
1432
+ proxyServer .getPassword (),
1433
+ proxyServer .getNtlmDomain (),
1434
+ proxyServer .getHost (),
1435
+ serverChallenge );
1436
+ headers .add (HttpHeaders .Names .PROXY_AUTHORIZATION , "NTLM " + challengeHeader );
1437
+ }
1438
+ Realm newRealm ;
1439
+ Realm .RealmBuilder realmBuilder ;
1440
+ if (realm != null ) {
1441
+ realmBuilder = new Realm .RealmBuilder ().clone (realm );
1442
+ } else {
1443
+ realmBuilder = new Realm .RealmBuilder ();
1444
+ }
1445
+ newRealm = realmBuilder //.setScheme(realm.getAuthScheme())
1383
1446
.setUri (URI .create (request .getUrl ()).getPath ())
1384
1447
.setMethodName (request .getMethod ())
1385
1448
.build ();
1386
- }
1387
1449
1388
1450
return newRealm ;
1389
1451
}
0 commit comments