Skip to content

Commit 9588664

Browse files
author
Stephane Landelle
committed
Turn AsyncHttpClient into an interface, close #497
1 parent 36dd803 commit 9588664

File tree

14 files changed

+524
-421
lines changed

14 files changed

+524
-421
lines changed

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

Lines changed: 21 additions & 403 deletions
Large diffs are not rendered by default.
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
/*
2+
* Copyright (c) 2014 AsyncHttpClient Project. All rights reserved.
3+
*
4+
* This program is licensed to you under the Apache License Version 2.0,
5+
* and you may not use this file except in compliance with the Apache License Version 2.0.
6+
* You may obtain a copy of the Apache License Version 2.0 at http://www.apache.org/licenses/LICENSE-2.0.
7+
*
8+
* Unless required by applicable law or agreed to in writing,
9+
* software distributed under the Apache License Version 2.0 is distributed on an
10+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
* See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
12+
*/
13+
package org.asynchttpclient;
14+
15+
import org.asynchttpclient.cookie.Cookie;
16+
import org.asynchttpclient.multipart.Part;
17+
18+
import java.io.IOException;
19+
import java.io.InputStream;
20+
import java.util.Collection;
21+
import java.util.Map;
22+
23+
public class BoundRequestBuilder extends RequestBuilderBase<BoundRequestBuilder> {
24+
25+
private final AsyncHttpClient client;
26+
27+
/**
28+
* Calculator used for calculating request signature for the request being
29+
* built, if any.
30+
*/
31+
protected SignatureCalculator signatureCalculator;
32+
33+
/**
34+
* URL used as the base, not including possibly query parameters. Needed for
35+
* signature calculation
36+
*/
37+
protected String baseURL;
38+
39+
public BoundRequestBuilder(AsyncHttpClient client, String reqType, boolean useRawUrl) {
40+
super(BoundRequestBuilder.class, reqType, useRawUrl);
41+
this.client = client;
42+
}
43+
44+
public BoundRequestBuilder(AsyncHttpClient client, Request prototype) {
45+
super(BoundRequestBuilder.class, prototype);
46+
this.client = client;
47+
}
48+
49+
public <T> ListenableFuture<T> execute(AsyncHandler<T> handler) throws IOException {
50+
return client.executeRequest(build(), handler);
51+
}
52+
53+
public ListenableFuture<Response> execute() throws IOException {
54+
return client.executeRequest(build(), new AsyncCompletionHandlerBase());
55+
}
56+
57+
// Note: For now we keep the delegates in place even though they are not needed
58+
// since otherwise Clojure (and maybe other languages) won't be able to
59+
// access these methods - see Clojure tickets 126 and 259
60+
61+
@Override
62+
public BoundRequestBuilder addBodyPart(Part part) {
63+
return super.addBodyPart(part);
64+
}
65+
66+
@Override
67+
public BoundRequestBuilder addCookie(Cookie cookie) {
68+
return super.addCookie(cookie);
69+
}
70+
71+
@Override
72+
public BoundRequestBuilder addHeader(String name, String value) {
73+
return super.addHeader(name, value);
74+
}
75+
76+
@Override
77+
public BoundRequestBuilder addParameter(String key, String value) {
78+
return super.addParameter(key, value);
79+
}
80+
81+
@Override
82+
public BoundRequestBuilder addQueryParameter(String name, String value) {
83+
return super.addQueryParameter(name, value);
84+
}
85+
86+
@Override
87+
public Request build() {
88+
/* Let's first calculate and inject signature, before finalizing actual build
89+
* (order does not matter with current implementation but may in future)
90+
*/
91+
if (signatureCalculator != null) {
92+
String url = baseURL;
93+
// Should not include query parameters, ensure:
94+
int i = url.indexOf('?');
95+
if (i >= 0) {
96+
url = url.substring(0, i);
97+
}
98+
signatureCalculator.calculateAndAddSignature(url, request, this);
99+
}
100+
return super.build();
101+
}
102+
103+
@Override
104+
public BoundRequestBuilder setBody(byte[] data) {
105+
return super.setBody(data);
106+
}
107+
108+
@Override
109+
public BoundRequestBuilder setBody(InputStream stream) {
110+
return super.setBody(stream);
111+
}
112+
113+
@Override
114+
public BoundRequestBuilder setBody(String data) {
115+
return super.setBody(data);
116+
}
117+
118+
@Override
119+
public BoundRequestBuilder setHeader(String name, String value) {
120+
return super.setHeader(name, value);
121+
}
122+
123+
@Override
124+
public BoundRequestBuilder setHeaders(FluentCaseInsensitiveStringsMap headers) {
125+
return super.setHeaders(headers);
126+
}
127+
128+
@Override
129+
public BoundRequestBuilder setHeaders(Map<String, Collection<String>> headers) {
130+
return super.setHeaders(headers);
131+
}
132+
133+
@Override
134+
public BoundRequestBuilder setParameters(Map<String, Collection<String>> parameters) {
135+
return super.setParameters(parameters);
136+
}
137+
138+
@Override
139+
public BoundRequestBuilder setParameters(FluentStringsMap parameters) {
140+
return super.setParameters(parameters);
141+
}
142+
143+
@Override
144+
public BoundRequestBuilder setUrl(String url) {
145+
baseURL = url;
146+
return super.setUrl(url);
147+
}
148+
149+
@Override
150+
public BoundRequestBuilder setVirtualHost(String virtualHost) {
151+
return super.setVirtualHost(virtualHost);
152+
}
153+
154+
public BoundRequestBuilder setSignatureCalculator(SignatureCalculator signatureCalculator) {
155+
this.signatureCalculator = signatureCalculator;
156+
return this;
157+
}
158+
}

0 commit comments

Comments
 (0)