Skip to content

Commit 82374aa

Browse files
committed
Make SignatureCalculator both global and per request configurable.
1 parent 044fa33 commit 82374aa

File tree

4 files changed

+89
-35
lines changed

4 files changed

+89
-35
lines changed

src/main/java/com/ning/http/client/AsyncHttpClient.java

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -147,13 +147,6 @@ public class AsyncHttpClient {
147147
private final static Logger logger = LoggerFactory.getLogger(AsyncHttpClient.class);
148148
private final AtomicBoolean isClosed = new AtomicBoolean(false);
149149

150-
/**
151-
* Default signature calculator to use for all requests constructed by this client instance.
152-
*
153-
* @since 1.1
154-
*/
155-
protected SignatureCalculator signatureCalculator;
156-
157150
/**
158151
* Create a new HTTP Asynchronous Client using the default {@link AsyncHttpClientConfig} configuration. The
159152
* default {@link AsyncHttpProvider} will be used ({@link com.ning.http.client.providers.netty.NettyAsyncHttpProvider}
@@ -203,18 +196,12 @@ public AsyncHttpClient(String providerClass, AsyncHttpClientConfig config) {
203196
}
204197

205198
public class BoundRequestBuilder extends RequestBuilderBase<BoundRequestBuilder> {
206-
/**
207-
* Calculator used for calculating request signature for the request being
208-
* built, if any.
209-
*/
210-
protected SignatureCalculator signatureCalculator;
211-
212199
/**
213200
* URL used as the base, not including possibly query parameters. Needed for
214201
* signature calculation
215202
*/
216203
protected String baseURL;
217-
204+
218205
private BoundRequestBuilder(String reqType) {
219206
super(BoundRequestBuilder.class, reqType);
220207
}
@@ -262,18 +249,6 @@ public BoundRequestBuilder addQueryParameter(String name, String value) {
262249

263250
@Override
264251
public Request build() {
265-
/* Let's first calculate and inject signature, before finalizing actual build
266-
* (order does not matter with current implementation but may in future)
267-
*/
268-
if (signatureCalculator != null) {
269-
String url = baseURL;
270-
// Should not include query parameters, ensure:
271-
int i = url.indexOf('?');
272-
if (i >= 0) {
273-
url = url.substring(0, i);
274-
}
275-
signatureCalculator.calculateAndAddSignature(baseURL, request, this);
276-
}
277252
return super.build();
278253
}
279254

@@ -339,8 +314,7 @@ public BoundRequestBuilder setVirtualHost(String virtualHost) {
339314
}
340315

341316
public BoundRequestBuilder setSignatureCalculator(SignatureCalculator signatureCalculator) {
342-
this.signatureCalculator = signatureCalculator;
343-
return this;
317+
return super.setSignatureCalculator(signatureCalculator);
344318
}
345319
}
346320

@@ -382,9 +356,11 @@ public AsyncHttpClientConfig getConfig(){
382356

383357
/**
384358
* Set default signature calculator to use for requests build by this client instance
359+
* @deprecated Please use {@link AsyncHttpClientConfig#setSignatureCalculator(SignatureCalculator)} instead.
385360
*/
361+
@Deprecated
386362
public AsyncHttpClient setSignatureCalculator(SignatureCalculator signatureCalculator) {
387-
this.signatureCalculator = signatureCalculator;
363+
config.setSignatureCalculator(signatureCalculator);
388364
return this;
389365
}
390366

@@ -549,10 +525,20 @@ private final static AsyncHttpProvider<?> loadDefaultProvider(String className,
549525
}
550526

551527
protected BoundRequestBuilder requestBuilder(String reqType, String url) {
552-
return new BoundRequestBuilder(reqType).setUrl(url).setSignatureCalculator(signatureCalculator);
528+
BoundRequestBuilder builder = new BoundRequestBuilder(reqType).setUrl(url);
529+
SignatureCalculator calculator = config.getSignatureCalculator();
530+
if (calculator != null) {
531+
builder.setSignatureCalculator(calculator);
532+
}
533+
return builder;
553534
}
554535

555536
protected BoundRequestBuilder requestBuilder(Request prototype) {
556-
return new BoundRequestBuilder(prototype).setSignatureCalculator(signatureCalculator);
537+
BoundRequestBuilder builder = new BoundRequestBuilder(prototype);
538+
SignatureCalculator calculator = getConfig().getSignatureCalculator();
539+
if (calculator != null) {
540+
builder.setSignatureCalculator(calculator);
541+
}
542+
return builder;
557543
}
558544
}

src/main/java/com/ning/http/client/AsyncHttpClientConfig.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public class AsyncHttpClientConfig {
7474
private final int requestCompressionLevel;
7575
private final int maxRequestRetry;
7676
private final boolean allowSslConnectionPool;
77+
// TODO: make signatureCalculator final once deprecated setSignatureCalculator is removed.
78+
private /*final*/ SignatureCalculator signatureCalculator;
7779

7880
private AsyncHttpClientConfig(int maxTotalConnections,
7981
int maxConnectionPerHost,
@@ -97,7 +99,8 @@ private AsyncHttpClientConfig(int maxTotalConnections,
9799
List<IOExceptionFilter> ioExceptionFilters,
98100
int requestCompressionLevel,
99101
int maxRequestRetry,
100-
boolean allowSslConnectionCaching) {
102+
boolean allowSslConnectionCaching,
103+
SignatureCalculator signatureCalculator) {
101104

102105
this.maxTotalConnections = maxTotalConnections;
103106
this.maxConnectionPerHost = maxConnectionPerHost;
@@ -121,6 +124,7 @@ private AsyncHttpClientConfig(int maxTotalConnections,
121124
this.maxRequestRetry = maxRequestRetry;
122125
this.reaper = reaper;
123126
this.allowSslConnectionPool = allowSslConnectionCaching;
127+
this.signatureCalculator = signatureCalculator;
124128

125129
if (applicationThreadPool == null) {
126130
this.applicationThreadPool = Executors.newCachedThreadPool();
@@ -374,6 +378,19 @@ public boolean isSslConnectionPoolEnabled() {
374378
return allowSslConnectionPool;
375379
}
376380

381+
/**
382+
* TODO: remove once deprecated AHC.setSignatureCalculator is removed.
383+
* @return
384+
* @deprecated Do not use, only added for {@link AsyncHttpClient#setSignatureCalculator(SignatureCalculator)}.
385+
*/
386+
@Deprecated
387+
public SignatureCalculator getSignatureCalculator() {
388+
return signatureCalculator;
389+
}
390+
391+
public void setSignatureCalculator(SignatureCalculator signatureCalculator) {
392+
this.signatureCalculator = signatureCalculator;
393+
}
377394

378395
/**
379396
* Builder for an {@link AsyncHttpClient}
@@ -415,6 +432,7 @@ public Thread newThread(Runnable r) {
415432
private final List<ResponseFilter> responseFilters = new LinkedList<ResponseFilter>();
416433
private final List<IOExceptionFilter> ioExceptionFilters = new LinkedList<IOExceptionFilter>();
417434
private boolean allowSslConnectionPool = true;
435+
private SignatureCalculator signatureCalculator = null;
418436

419437
public Builder() {
420438
}
@@ -762,6 +780,16 @@ public Builder setAllowSslConnectionPool(boolean allowSslConnectionPool) {
762780
return this;
763781
}
764782

783+
/**
784+
* Sets {@link SignatureCalculator} globally.
785+
* @param signatureCalculator Calculator to be used.
786+
* @return Fluid interface.
787+
*/
788+
public Builder setSignatureCalculator(SignatureCalculator signatureCalculator) {
789+
this.signatureCalculator = signatureCalculator;
790+
return this;
791+
}
792+
765793
/**
766794
* Create a config builder with values taken from the given prototype configuration.
767795
*
@@ -790,6 +818,8 @@ public Builder( AsyncHttpClientConfig prototype )
790818

791819
requestFilters.addAll( prototype.getRequestFilters() );
792820
responseFilters.addAll( prototype.getResponseFilters() );
821+
822+
signatureCalculator = prototype.getSignatureCalculator();
793823
}
794824

795825
/**
@@ -821,7 +851,8 @@ public AsyncHttpClientConfig build() {
821851
ioExceptionFilters,
822852
requestCompressionLevel,
823853
maxRequestRetry,
824-
allowSslConnectionPool);
854+
allowSslConnectionPool,
855+
signatureCalculator);
825856
}
826857
}
827858
}

src/main/java/com/ning/http/client/Request.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,5 +177,9 @@ public static interface EntityWriter {
177177
*/
178178
public long getRangeOffset();
179179

180-
180+
/**
181+
* Gets {@link SignatureCalculator} for request.
182+
* @return Calculator for request.
183+
*/
184+
SignatureCalculator getSignatureCalculator();
181185
}

src/main/java/com/ning/http/client/RequestBuilderBase.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ private static final class RequestImpl implements Request {
6363
private boolean followRedirects;
6464
private PerRequestConfig perRequestConfig;
6565
private long rangeOffset = 0;
66+
public SignatureCalculator signatureCalculator;
6667

6768
public RequestImpl() {
6869
}
@@ -90,6 +91,7 @@ public RequestImpl(Request prototype) {
9091
this.followRedirects = prototype.isRedirectEnabled();
9192
this.perRequestConfig = prototype.getPerRequestConfig();
9293
this.rangeOffset = prototype.getRangeOffset();
94+
this.signatureCalculator = prototype.getSignatureCalculator();
9395
}
9496
}
9597

@@ -250,6 +252,10 @@ public long getRangeOffset() {
250252
return rangeOffset;
251253
}
252254

255+
public SignatureCalculator getSignatureCalculator() {
256+
return signatureCalculator;
257+
}
258+
253259
@Override
254260
public String toString() {
255261
StringBuilder sb = new StringBuilder(url);
@@ -276,11 +282,24 @@ protected RequestBuilderBase(Class<T> derived, String method) {
276282
request.method = method;
277283
}
278284

285+
protected RequestBuilderBase(Class<T> derived, String method, SignatureCalculator signatureCalculator) {
286+
this.derived = derived;
287+
request = new RequestImpl();
288+
request.method = method;
289+
request.signatureCalculator = signatureCalculator;
290+
}
291+
279292
protected RequestBuilderBase(Class<T> derived, Request prototype) {
280293
this.derived = derived;
281294
request = new RequestImpl(prototype);
282295
}
283-
296+
297+
protected RequestBuilderBase(Class<T> derived, Request prototype, SignatureCalculator signatureCalculator) {
298+
this.derived = derived;
299+
request = new RequestImpl(prototype);
300+
request.signatureCalculator = signatureCalculator;
301+
}
302+
284303
public T setUrl(String url) {
285304
request.url = buildUrl(url);
286305
return derived.cast(this);
@@ -503,8 +522,22 @@ public T setMethod(String method) {
503522
return derived.cast(this);
504523
}
505524

525+
public T setSignatureCalculator(SignatureCalculator signatureCalculator) {
526+
request.signatureCalculator = signatureCalculator;
527+
return derived.cast(this);
528+
}
506529

507530
public Request build() {
531+
SignatureCalculator calculator = request.signatureCalculator;
532+
if (calculator != null) {
533+
String url = request.url;
534+
calculator.calculateAndAddSignature(
535+
// TODO: validate, previous logic here always used baseURL, but also performed calculations for query params less URL.
536+
url.contains("?") ? url.substring(0, url.indexOf('?')) : url,
537+
request,
538+
this
539+
);
540+
}
508541
if ((request.length < 0) && (request.streamData == null) &&
509542
(("POST".equals(request.method)) || ("PUT".equals(request.method)))) {
510543
// can't concatenate content-length

0 commit comments

Comments
 (0)