@@ -78,7 +78,7 @@ private Realm.RealmBuilder newRealmBuilder(Realm realm) {
78
78
}
79
79
80
80
private Realm kerberosChallenge (List <String > proxyAuth , Request request , ProxyServer proxyServer ,
81
- FluentCaseInsensitiveStringsMap headers , Realm realm , NettyResponseFuture <?> future ) throws NTLMEngineException {
81
+ FluentCaseInsensitiveStringsMap headers , Realm realm , NettyResponseFuture <?> future , boolean proxyInd ) throws NTLMEngineException {
82
82
83
83
URI uri = request .getURI ();
84
84
String host = request .getVirtualHost () == null ? AsyncHttpProviderUtils .getHost (uri ) : request .getVirtualHost ();
@@ -96,19 +96,23 @@ private Realm kerberosChallenge(List<String> proxyAuth, Request request, ProxySe
96
96
97
97
} catch (Throwable throwable ) {
98
98
if (isNTLM (proxyAuth )) {
99
- return ntlmChallenge (proxyAuth , request , proxyServer , headers , realm , future );
99
+ return ntlmChallenge (proxyAuth , request , proxyServer , headers , realm , future , proxyInd );
100
100
}
101
101
channels .abort (future , throwable );
102
102
return null ;
103
103
}
104
104
}
105
105
106
- private void addNTLMAuthorizationHeader (FluentCaseInsensitiveStringsMap headers , String challengeHeader ) {
107
- headers .add (HttpHeaders .Names .AUTHORIZATION , "NTLM " + challengeHeader );
106
+ private String authorizationHeaderName (boolean proxyInd ) {
107
+ return proxyInd ? HttpHeaders .Names .PROXY_AUTHORIZATION : HttpHeaders .Names .AUTHORIZATION ;
108
+ }
109
+
110
+ private void addNTLMAuthorizationHeader (FluentCaseInsensitiveStringsMap headers , String challengeHeader , boolean proxyInd ) {
111
+ headers .add (authorizationHeaderName (proxyInd ), "NTLM " + challengeHeader );
108
112
}
109
113
110
114
private Realm ntlmChallenge (List <String > wwwAuth , Request request , ProxyServer proxyServer , FluentCaseInsensitiveStringsMap headers ,
111
- Realm realm , NettyResponseFuture <?> future ) throws NTLMEngineException {
115
+ Realm realm , NettyResponseFuture <?> future , boolean proxyInd ) throws NTLMEngineException {
112
116
113
117
boolean useRealm = proxyServer == null && realm != null ;
114
118
@@ -121,7 +125,7 @@ private Realm ntlmChallenge(List<String> wwwAuth, Request request, ProxyServer p
121
125
String challengeHeader = NTLMEngine .INSTANCE .generateType1Msg (ntlmDomain , ntlmHost );
122
126
123
127
URI uri = request .getURI ();
124
- addNTLMAuthorizationHeader (headers , challengeHeader );
128
+ addNTLMAuthorizationHeader (headers , challengeHeader , proxyInd );
125
129
future .getAndSetAuth (false );
126
130
return newRealmBuilder (realm )//
127
131
.setScheme (realm .getAuthScheme ())//
@@ -131,7 +135,7 @@ private Realm ntlmChallenge(List<String> wwwAuth, Request request, ProxyServer p
131
135
.build ();
132
136
133
137
} else {
134
- addType3NTLMAuthorizationHeader (wwwAuth , headers , principal , password , ntlmDomain , ntlmHost );
138
+ addType3NTLMAuthorizationHeader (wwwAuth , headers , principal , password , ntlmDomain , ntlmHost , proxyInd );
135
139
Realm .AuthScheme authScheme = realm != null ? realm .getAuthScheme () : Realm .AuthScheme .NTLM ;
136
140
return newRealmBuilder (realm )//
137
141
.setScheme (authScheme )//
@@ -142,12 +146,12 @@ private Realm ntlmChallenge(List<String> wwwAuth, Request request, ProxyServer p
142
146
}
143
147
144
148
private Realm ntlmProxyChallenge (List <String > wwwAuth , Request request , ProxyServer proxyServer ,
145
- FluentCaseInsensitiveStringsMap headers , Realm realm , NettyResponseFuture <?> future ) throws NTLMEngineException {
149
+ FluentCaseInsensitiveStringsMap headers , Realm realm , NettyResponseFuture <?> future , boolean proxyInd ) throws NTLMEngineException {
146
150
future .getAndSetAuth (false );
147
151
headers .remove (HttpHeaders .Names .PROXY_AUTHORIZATION );
148
152
149
153
addType3NTLMAuthorizationHeader (wwwAuth , headers , proxyServer .getPrincipal (), proxyServer .getPassword (),
150
- proxyServer .getNtlmDomain (), proxyServer .getHost ());
154
+ proxyServer .getNtlmDomain (), proxyServer .getHost (), proxyInd );
151
155
152
156
return newRealmBuilder (realm )//
153
157
// .setScheme(realm.getAuthScheme())
@@ -156,13 +160,13 @@ private Realm ntlmProxyChallenge(List<String> wwwAuth, Request request, ProxySer
156
160
}
157
161
158
162
private void addType3NTLMAuthorizationHeader (List <String > auth , FluentCaseInsensitiveStringsMap headers , String username ,
159
- String password , String domain , String workstation ) throws NTLMEngineException {
160
- headers .remove (HttpHeaders . Names . AUTHORIZATION );
163
+ String password , String domain , String workstation , boolean proxyInd ) throws NTLMEngineException {
164
+ headers .remove (authorizationHeaderName ( proxyInd ) );
161
165
162
166
if (isNonEmpty (auth ) && auth .get (0 ).startsWith ("NTLM " )) {
163
167
String serverChallenge = auth .get (0 ).trim ().substring ("NTLM " .length ());
164
168
String challengeHeader = NTLMEngine .INSTANCE .generateType3Msg (username , password , domain , workstation , serverChallenge );
165
- addNTLMAuthorizationHeader (headers , challengeHeader );
169
+ addNTLMAuthorizationHeader (headers , challengeHeader , proxyInd );
166
170
}
167
171
}
168
172
@@ -236,10 +240,10 @@ private boolean handleUnauthorizedAndExit(int statusCode, Realm realm, final Req
236
240
// NTLM
237
241
boolean negociate = authenticateHeaders .contains ("Negotiate" );
238
242
if (!authenticateHeaders .contains ("Kerberos" ) && (isNTLM (authenticateHeaders ) || negociate )) {
239
- newRealm = ntlmChallenge (authenticateHeaders , request , proxyServer , request .getHeaders (), realm , future );
243
+ newRealm = ntlmChallenge (authenticateHeaders , request , proxyServer , request .getHeaders (), realm , future , false );
240
244
// SPNEGO KERBEROS
241
245
} else if (negociate ) {
242
- newRealm = kerberosChallenge (authenticateHeaders , request , proxyServer , request .getHeaders (), realm , future );
246
+ newRealm = kerberosChallenge (authenticateHeaders , request , proxyServer , request .getHeaders (), realm , future , false );
243
247
if (newRealm == null ) {
244
248
return true ;
245
249
}
@@ -305,10 +309,10 @@ private boolean handleProxyAuthenticationRequiredAndExit(int statusCode,//
305
309
306
310
boolean negociate = proxyAuthenticateHeaders .contains ("Negotiate" );
307
311
if (!proxyAuthenticateHeaders .contains ("Kerberos" ) && (isNTLM (proxyAuthenticateHeaders ) || negociate )) {
308
- newRealm = ntlmProxyChallenge (proxyAuthenticateHeaders , request , proxyServer , request .getHeaders (), realm , future );
312
+ newRealm = ntlmProxyChallenge (proxyAuthenticateHeaders , request , proxyServer , request .getHeaders (), realm , future , true );
309
313
// SPNEGO KERBEROS
310
314
} else if (negociate ) {
311
- newRealm = kerberosChallenge (proxyAuthenticateHeaders , request , proxyServer , request .getHeaders (), realm , future );
315
+ newRealm = kerberosChallenge (proxyAuthenticateHeaders , request , proxyServer , request .getHeaders (), realm , future , true );
312
316
if (newRealm == null )
313
317
return true ;
314
318
} else {
@@ -459,10 +463,12 @@ && handleResponseAndExit(channel, future, handler, nettyRequest.getHttpRequest()
459
463
460
464
try {
461
465
channels .abort (future , t );
466
+ } catch (Exception abortException ) {
467
+ LOGGER .debug ("Abort failed" , abortException );
462
468
} finally {
463
469
finishUpdate (future , channel , false );
464
- throw t ;
465
470
}
471
+ throw t ;
466
472
}
467
473
}
468
474
0 commit comments