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