@@ -181,6 +181,10 @@ public boolean remove(Object o) {
181181 private final Protocol httpProtocol = new HttpProtocol ();
182182 private final Protocol webSocketProtocol = new WebSocketProtocol ();
183183
184+ private static boolean isNTLM (List <String > auth ) {
185+ return isNonEmpty (auth ) && auth .get (0 ).startsWith ("NTLM" );
186+ }
187+
184188 public NettyAsyncHttpProvider (AsyncHttpClientConfig config ) {
185189
186190 if (config .getAsyncHttpProviderConfig () != null && NettyAsyncHttpProviderConfig .class .isAssignableFrom (config .getAsyncHttpProviderConfig ().getClass ())) {
@@ -632,7 +636,7 @@ else if (uri.getRawQuery() != null)
632636 }
633637 } else {
634638 List <String > auth = request .getHeaders ().get (HttpHeaders .Names .PROXY_AUTHORIZATION );
635- if (isNonEmpty (auth ) && auth . get ( 0 ). startsWith ( "NTLM" )) {
639+ if (isNTLM (auth )) {
636640 nettyRequest .addHeader (HttpHeaders .Names .PROXY_AUTHORIZATION , auth .get (0 ));
637641 }
638642 }
@@ -706,7 +710,7 @@ else if (uri.getRawQuery() != null)
706710 if (isNonEmpty (proxyServer .getNtlmDomain ())) {
707711
708712 List <String > auth = request .getHeaders ().get (HttpHeaders .Names .PROXY_AUTHORIZATION );
709- if (!( isNonEmpty ( auth ) && auth . get ( 0 ). startsWith ( "NTLM" ) )) {
713+ if (!isNTLM ( auth )) {
710714 try {
711715 String msg = ntlmEngine .generateType1Msg (proxyServer .getNtlmDomain (), proxyServer .getHost ());
712716 nettyRequest .setHeader (HttpHeaders .Names .PROXY_AUTHORIZATION , "NTLM " + msg );
@@ -1133,14 +1137,26 @@ private Realm kerberosChallenge(List<String> proxyAuth, Request request, ProxySe
11331137 }
11341138 return realmBuilder .setUri (uri .getRawPath ()).setMethodName (request .getMethod ()).setScheme (Realm .AuthScheme .KERBEROS ).build ();
11351139 } catch (Throwable throwable ) {
1136- if (proxyAuth . contains ( "NTLM" )) {
1140+ if (isNTLM ( proxyAuth )) {
11371141 return ntlmChallenge (proxyAuth , request , proxyServer , headers , realm , future );
11381142 }
11391143 abort (future , throwable );
11401144 return null ;
11411145 }
11421146 }
11431147
1148+ private void addType3NTLMAuthorizationHeader (List <String > auth , FluentCaseInsensitiveStringsMap headers , String username , String password , String domain , String workstation )
1149+ throws NTLMEngineException {
1150+ headers .remove (HttpHeaders .Names .AUTHORIZATION );
1151+
1152+ if (isNTLM (auth )) {
1153+ String serverChallenge = auth .get (0 ).trim ().substring ("NTLM " .length ());
1154+ String challengeHeader = ntlmEngine .generateType3Msg (username , password , domain , workstation , serverChallenge );
1155+
1156+ headers .add (HttpHeaders .Names .AUTHORIZATION , "NTLM " + challengeHeader );
1157+ }
1158+ }
1159+
11441160 private Realm ntlmChallenge (List <String > wwwAuth , Request request , ProxyServer proxyServer , FluentCaseInsensitiveStringsMap headers , Realm realm , NettyResponseFuture <?> future ) throws NTLMEngineException {
11451161
11461162 boolean useRealm = (proxyServer == null && realm != null );
@@ -1159,14 +1175,7 @@ private Realm ntlmChallenge(List<String> wwwAuth, Request request, ProxyServer p
11591175 newRealm = new Realm .RealmBuilder ().clone (realm ).setScheme (realm .getAuthScheme ()).setUri (uri .getRawPath ()).setMethodName (request .getMethod ()).setNtlmMessageType2Received (true ).build ();
11601176 future .getAndSetAuth (false );
11611177 } else {
1162- headers .remove (HttpHeaders .Names .AUTHORIZATION );
1163-
1164- if (wwwAuth .get (0 ).startsWith ("NTLM " )) {
1165- String serverChallenge = wwwAuth .get (0 ).trim ().substring ("NTLM " .length ());
1166- String challengeHeader = ntlmEngine .generateType3Msg (principal , password , ntlmDomain , ntlmHost , serverChallenge );
1167-
1168- headers .add (HttpHeaders .Names .AUTHORIZATION , "NTLM " + challengeHeader );
1169- }
1178+ addType3NTLMAuthorizationHeader (wwwAuth , headers , principal , password , ntlmDomain , ntlmHost );
11701179
11711180 Realm .RealmBuilder realmBuilder ;
11721181 Realm .AuthScheme authScheme ;
@@ -1187,11 +1196,8 @@ private Realm ntlmProxyChallenge(List<String> wwwAuth, Request request, ProxySer
11871196 future .getAndSetAuth (false );
11881197 headers .remove (HttpHeaders .Names .PROXY_AUTHORIZATION );
11891198
1190- if (wwwAuth .get (0 ).startsWith ("NTLM " )) {
1191- String serverChallenge = wwwAuth .get (0 ).trim ().substring ("NTLM " .length ());
1192- String challengeHeader = ntlmEngine .generateType3Msg (proxyServer .getPrincipal (), proxyServer .getPassword (), proxyServer .getNtlmDomain (), proxyServer .getHost (), serverChallenge );
1193- headers .add (HttpHeaders .Names .PROXY_AUTHORIZATION , "NTLM " + challengeHeader );
1194- }
1199+ addType3NTLMAuthorizationHeader (wwwAuth , headers , proxyServer .getPrincipal (), proxyServer .getPassword (), proxyServer .getNtlmDomain (), proxyServer .getHost ());
1200+
11951201 Realm newRealm ;
11961202 Realm .RealmBuilder realmBuilder ;
11971203 if (realm != null ) {
@@ -2052,7 +2058,7 @@ public void handle(final ChannelHandlerContext ctx, final MessageEvent e) throws
20522058
20532059 future .setState (NettyResponseFuture .STATE .NEW );
20542060 // NTLM
2055- if (!wwwAuth .contains ("Kerberos" ) && (wwwAuth . contains ( "NTLM" ) || (wwwAuth .contains ("Negotiate" )))) {
2061+ if (!wwwAuth .contains ("Kerberos" ) && (isNTLM ( wwwAuth ) || (wwwAuth .contains ("Negotiate" )))) {
20562062 newRealm = ntlmChallenge (wwwAuth , request , proxyServer , headers , realm , future );
20572063 // SPNEGO KERBEROS
20582064 } else if (wwwAuth .contains ("Negotiate" )) {
@@ -2097,7 +2103,7 @@ public Object call() throws Exception {
20972103
20982104 future .setState (NettyResponseFuture .STATE .NEW );
20992105
2100- if (!proxyAuth .contains ("Kerberos" ) && (proxyAuth . get ( 0 ). contains ( "NTLM" ) || (proxyAuth .contains ("Negotiate" )))) {
2106+ if (!proxyAuth .contains ("Kerberos" ) && (isNTLM ( proxyAuth ) || (proxyAuth .contains ("Negotiate" )))) {
21012107 newRealm = ntlmProxyChallenge (proxyAuth , request , proxyServer , headers , realm , future );
21022108 // SPNEGO KERBEROS
21032109 } else if (proxyAuth .contains ("Negotiate" )) {
0 commit comments