Skip to content

Commit 8f18bea

Browse files
author
Stephane Landelle
committed
NTLM WWW-Authenticate header is not always the first one, close AsyncHttpClient#736
1 parent bf2bb02 commit 8f18bea

File tree

3 files changed

+24
-15
lines changed

3 files changed

+24
-15
lines changed

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import static io.netty.handler.codec.http.HttpResponseStatus.OK;
1818
import static io.netty.handler.codec.http.HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED;
1919
import static io.netty.handler.codec.http.HttpResponseStatus.UNAUTHORIZED;
20-
import static org.asynchttpclient.providers.netty.util.HttpUtils.isNTLM;
20+
import static org.asynchttpclient.providers.netty.util.HttpUtils.getNTLM;
2121
import static org.asynchttpclient.util.AsyncHttpProviderUtils.getDefaultPort;
2222
import io.netty.buffer.ByteBuf;
2323
import io.netty.channel.Channel;
@@ -81,8 +81,9 @@ private Realm kerberosChallenge(Channel channel, List<String> proxyAuth, Request
8181
.build();
8282

8383
} catch (Throwable throwable) {
84-
if (isNTLM(proxyAuth)) {
85-
return ntlmChallenge(proxyAuth.get(0), request, proxyServer, headers, realm, future, proxyInd);
84+
String ntlmAuthenticate = getNTLM(proxyAuth);
85+
if (ntlmAuthenticate != null) {
86+
return ntlmChallenge(ntlmAuthenticate, request, proxyServer, headers, realm, future, proxyInd);
8687
}
8788
requestSender.abort(channel, future, throwable);
8889
return null;
@@ -204,9 +205,10 @@ private boolean exitAfterHandling401(//
204205
future.setState(NettyResponseFuture.STATE.NEW);
205206
Realm newRealm = null;
206207
boolean negociate = wwwAuthHeaders.contains("Negotiate");
207-
if (!wwwAuthHeaders.contains("Kerberos") && (isNTLM(wwwAuthHeaders) || negociate)) {
208+
String ntlmAuthenticate = getNTLM(wwwAuthHeaders);
209+
if (!wwwAuthHeaders.contains("Kerberos") && ntlmAuthenticate != null) {
208210
// NTLM
209-
newRealm = ntlmChallenge(wwwAuthHeaders.get(0), request, proxyServer, request.getHeaders(), realm, future, false);
211+
newRealm = ntlmChallenge(ntlmAuthenticate, request, proxyServer, request.getHeaders(), realm, future, false);
210212

211213
// don't forget to reuse channel: NTLM authenticates a connection
212214
future.setReuseChannel(true);
@@ -290,8 +292,9 @@ private boolean exitAfterHandling407(//
290292
FluentCaseInsensitiveStringsMap requestHeaders = request.getHeaders();
291293

292294
boolean negociate = proxyAuthHeaders.contains("Negotiate");
293-
if (!proxyAuthHeaders.contains("Kerberos") && (isNTLM(proxyAuthHeaders) || negociate)) {
294-
newRealm = ntlmProxyChallenge(proxyAuthHeaders.get(0), request, proxyServer, requestHeaders, realm, future, true);
295+
String ntlmAuthenticate = getNTLM(proxyAuthHeaders);
296+
if (!proxyAuthHeaders.contains("Kerberos") && ntlmAuthenticate != null) {
297+
newRealm = ntlmProxyChallenge(ntlmAuthenticate, request, proxyServer, requestHeaders, realm, future, true);
295298
// SPNEGO KERBEROS
296299
} else if (negociate) {
297300
newRealm = kerberosChallenge(channel, proxyAuthHeaders, request, proxyServer, requestHeaders, realm, future, true);

providers/netty/src/main/java/org/asynchttpclient/providers/netty/request/NettyRequestFactory.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*/
1414
package org.asynchttpclient.providers.netty.request;
1515

16-
import static org.asynchttpclient.providers.netty.util.HttpUtils.isNTLM;
16+
import static org.asynchttpclient.providers.netty.util.HttpUtils.getNTLM;
1717
import static org.asynchttpclient.providers.netty.util.HttpUtils.isSecure;
1818
import static org.asynchttpclient.providers.netty.util.HttpUtils.isWebSocket;
1919
import static org.asynchttpclient.providers.netty.util.HttpUtils.useProxyConnect;
@@ -157,13 +157,14 @@ public String firstRequestOnlyProxyAuthorizationHeader(Request request, ProxySer
157157

158158
if (method == HttpMethod.CONNECT) {
159159
List<String> auth = request.getHeaders().get(HttpHeaders.Names.PROXY_AUTHORIZATION);
160-
if (isNTLM(auth)) {
161-
proxyAuthorization = auth.get(0);
160+
String ntlmHeader = getNTLM(auth);
161+
if (ntlmHeader != null) {
162+
proxyAuthorization = ntlmHeader;
162163
}
163164

164165
} else if (proxyServer != null && proxyServer.getPrincipal() != null && isNonEmpty(proxyServer.getNtlmDomain())) {
165166
List<String> auth = request.getHeaders().get(HttpHeaders.Names.PROXY_AUTHORIZATION);
166-
if (!isNTLM(auth)) {
167+
if (getNTLM(auth) == null) {
167168
String msg = NTLMEngine.INSTANCE.generateType1Msg();
168169
proxyAuthorization = "NTLM " + msg;
169170
}

providers/netty/src/main/java/org/asynchttpclient/providers/netty/util/HttpUtils.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
*/
1313
package org.asynchttpclient.providers.netty.util;
1414

15-
import static org.asynchttpclient.util.MiscUtils.isNonEmpty;
16-
1715
import java.util.List;
1816

1917
import org.asynchttpclient.uri.Uri;
@@ -28,8 +26,15 @@ public final class HttpUtils {
2826
private HttpUtils() {
2927
}
3028

31-
public static boolean isNTLM(List<String> auth) {
32-
return isNonEmpty(auth) && auth.get(0).startsWith("NTLM");
29+
public static String getNTLM(List<String> authenticateHeaders) {
30+
if (authenticateHeaders != null) {
31+
for (String authenticateHeader: authenticateHeaders) {
32+
if (authenticateHeader.startsWith("NTLM"))
33+
return authenticateHeader;
34+
}
35+
}
36+
37+
return null;
3338
}
3439

3540
public static boolean isWebSocket(String scheme) {

0 commit comments

Comments
 (0)