Skip to content

Commit 683e24c

Browse files
author
Stephane Landelle
committed
Better proxy auth
1 parent 4a87ef7 commit 683e24c

File tree

5 files changed

+45
-33
lines changed

5 files changed

+45
-33
lines changed

api/src/main/java/org/asynchttpclient/Realm.java

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,15 @@ public class Realm {
5353
private final Charset charset;
5454
private final boolean useAbsoluteURI;
5555
private final boolean omitQuery;
56+
private final boolean targetProxy;
5657

5758
public enum AuthScheme {
5859
DIGEST, BASIC, NTLM, SPNEGO, KERBEROS, NONE
5960
}
6061

6162
private Realm(AuthScheme scheme, String principal, String password, String realmName, String nonce, String algorithm, String response,
6263
String qop, String nc, String cnonce, UriComponents uri, String method, boolean usePreemptiveAuth, String ntlmDomain, String enc,
63-
String host, boolean messageType2Received, String opaque, boolean useAbsoluteURI, boolean omitQuery) {
64+
String host, boolean messageType2Received, String opaque, boolean useAbsoluteURI, boolean omitQuery, boolean targetProxy) {
6465

6566
this.principal = principal;
6667
this.password = password;
@@ -83,6 +84,7 @@ private Realm(AuthScheme scheme, String principal, String password, String realm
8384
this.charset = enc != null ? Charset.forName(enc) : null;
8485
this.useAbsoluteURI = useAbsoluteURI;
8586
this.omitQuery = omitQuery;
87+
this.targetProxy = targetProxy;
8688
}
8789

8890
public String getPrincipal() {
@@ -188,7 +190,11 @@ public boolean isUseAbsoluteURI() {
188190
public boolean isOmitQuery() {
189191
return omitQuery;
190192
}
191-
193+
194+
public boolean isTargetProxy() {
195+
return targetProxy;
196+
}
197+
192198
@Override
193199
public boolean equals(Object o) {
194200
if (this == o)
@@ -271,20 +277,21 @@ public static class RealmBuilder {
271277
private String cnonce = "";
272278
private UriComponents uri;
273279
private String methodName = "GET";
274-
private boolean usePreemptive = false;
275-
private String domain = System.getProperty("http.auth.ntlm.domain", "");
280+
private boolean usePreemptive;
281+
private String ntlmDomain = System.getProperty("http.auth.ntlm.domain", "");
276282
private String enc = StandardCharsets.UTF_8.name();
277283
private String host = "localhost";
278-
private boolean messageType2Received = false;
284+
private boolean messageType2Received;
279285
private boolean useAbsoluteURI = true;
280-
private boolean omitQuery = false;
286+
private boolean omitQuery;
287+
private boolean targetProxy;
281288

282289
public String getNtlmDomain() {
283-
return domain;
290+
return ntlmDomain;
284291
}
285292

286-
public RealmBuilder setNtlmDomain(String domain) {
287-
this.domain = domain;
293+
public RealmBuilder setNtlmDomain(String ntlmDomain) {
294+
this.ntlmDomain = ntlmDomain;
288295
return this;
289296
}
290297

@@ -436,7 +443,16 @@ public RealmBuilder setOmitQuery(boolean omitQuery) {
436443
this.omitQuery = omitQuery;
437444
return this;
438445
}
439-
446+
447+
public boolean isTargetProxy() {
448+
return targetProxy;
449+
}
450+
451+
public RealmBuilder setTargetProxy(boolean targetProxy) {
452+
this.targetProxy = targetProxy;
453+
return this;
454+
}
455+
440456
public RealmBuilder parseWWWAuthenticateHeader(String headerLine) {
441457
setRealmName(match(headerLine, "realm"));
442458
setNonce(match(headerLine, "nonce"));
@@ -464,6 +480,7 @@ public RealmBuilder parseProxyAuthenticateHeader(String headerLine) {
464480
} else {
465481
setScheme(AuthScheme.BASIC);
466482
}
483+
setTargetProxy(true);
467484
return this;
468485
}
469486

@@ -484,6 +501,9 @@ public RealmBuilder clone(Realm clone) {
484501
setNtlmDomain(clone.getNtlmDomain());
485502
setNtlmHost(clone.getNtlmHost());
486503
setNtlmMessageType2Received(clone.isNtlmMessageType2Received());
504+
setUseAbsoluteURI(clone.isUseAbsoluteURI());
505+
setOmitQuery(clone.isOmitQuery());
506+
setTargetProxy(clone.isTargetProxy());
487507
return this;
488508
}
489509

@@ -511,8 +531,8 @@ private String match(String headerLine, String token) {
511531

512532
// = to skip
513533
match += token.length() + 1;
514-
int traillingComa = headerLine.indexOf(",", match);
515-
String value = headerLine.substring(match, traillingComa > 0 ? traillingComa : headerLine.length());
534+
int trailingComa = headerLine.indexOf(",", match);
535+
String value = headerLine.substring(match, trailingComa > 0 ? trailingComa : headerLine.length());
516536
value = value.length() > 0 && value.charAt(value.length() - 1) == '"' ? value.substring(0, value.length() - 1) : value;
517537
return value.charAt(0) == '"' ? value.substring(1) : value;
518538
}
@@ -609,7 +629,7 @@ public Realm build() {
609629
}
610630

611631
return new Realm(scheme, principal, password, realmName, nonce, algorithm, response, qop, nc, cnonce, uri, methodName,
612-
usePreemptive, domain, enc, host, messageType2Received, opaque, useAbsoluteURI, omitQuery);
632+
usePreemptive, ntlmDomain, enc, host, messageType2Received, opaque, useAbsoluteURI, omitQuery, targetProxy);
613633
}
614634
}
615635
}

api/src/main/java/org/asynchttpclient/uri/UriComponents.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
*/
1313
package org.asynchttpclient.uri;
1414

15-
import static org.asynchttpclient.util.MiscUtils.isNonEmpty;
16-
1715
import java.net.URI;
1816
import java.net.URISyntaxException;
1917

@@ -121,15 +119,6 @@ public UriComponents withNewScheme(String newScheme) {
121119
query);
122120
}
123121

124-
public UriComponents withNewPath(String newPath) {
125-
return new UriComponents(scheme,//
126-
userInfo,//
127-
host,//
128-
port,//
129-
newPath,//
130-
query);
131-
}
132-
133122
public UriComponents withNewQuery(String newQuery) {
134123
return new UriComponents(scheme,//
135124
userInfo,//

api/src/main/java/org/asynchttpclient/util/AuthenticatorUtils.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,17 @@ public static String computeBasicAuthentication(ProxyServer proxyServer) {
3333
}
3434

3535
private static String computeRealmURI(Realm realm) {
36-
UriComponents uri = realm.getUri();
37-
boolean omitQuery = realm.isOmitQuery() && MiscUtils.isNonEmpty(uri.getQuery());
38-
if (realm.isUseAbsoluteURI()) {
39-
return omitQuery ? uri.withNewQuery(null).toUrl() : uri.toUrl();
36+
if (realm.isTargetProxy()) {
37+
return "/";
4038
} else {
41-
String path = uri.getPath();
42-
return omitQuery ? path : path + "?" + uri.getQuery();
39+
UriComponents uri = realm.getUri();
40+
boolean omitQuery = realm.isOmitQuery() && MiscUtils.isNonEmpty(uri.getQuery());
41+
if (realm.isUseAbsoluteURI()) {
42+
return omitQuery ? uri.withNewQuery(null).toUrl() : uri.toUrl();
43+
} else {
44+
String path = uri.getPath();
45+
return omitQuery ? path : path + "?" + uri.getQuery();
46+
}
4347
}
4448
}
4549

providers/grizzly/src/main/java/org/asynchttpclient/providers/grizzly/statushandler/ProxyAuthorizationHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public boolean handleStatus(final HttpResponsePacket responsePacket, final HttpT
6060
.select(req.getURI());
6161
String principal = proxyServer.getPrincipal();
6262
String password = proxyServer.getPassword();
63-
Realm realm = new Realm.RealmBuilder().setPrincipal(principal).setPassword(password).setUri(req.getURI().withNewPath("/")).setOmitQuery(true)
63+
Realm realm = new Realm.RealmBuilder().setPrincipal(principal).setPassword(password).setUri(req.getURI()).setOmitQuery(true)
6464
.setMethodName(Method.CONNECT.getMethodString()).setUsePreemptiveAuth(true).parseProxyAuthenticateHeader(proxyAuth).build();
6565
String proxyAuthLowerCase = proxyAuth.toLowerCase(Locale.ENGLISH);
6666
if (proxyAuthLowerCase.startsWith("basic")) {

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import static io.netty.handler.codec.http.HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED;
2121
import static io.netty.handler.codec.http.HttpResponseStatus.UNAUTHORIZED;
2222
import static org.asynchttpclient.providers.netty.util.HttpUtil.isNTLM;
23-
import static org.asynchttpclient.util.AsyncHttpProviderUtils.getNonEmptyPath;
2423
import static org.asynchttpclient.util.MiscUtils.isNonEmpty;
2524

2625
import org.asynchttpclient.AsyncHandler;
@@ -300,7 +299,7 @@ private boolean handleProxyAuthenticationRequiredAndExit(int statusCode,//
300299
} else {
301300
newRealm = new Realm.RealmBuilder().clone(realm)//
302301
.setScheme(realm.getAuthScheme())//
303-
.setUri(request.getURI().withNewPath("/"))//
302+
.setUri(request.getURI())//
304303
.setOmitQuery(true)//
305304
.setMethodName(HttpMethod.CONNECT.name())//
306305
.setUsePreemptiveAuth(true)//

0 commit comments

Comments
 (0)