18
18
import static com .ning .http .util .MiscUtil .isNonEmpty ;
19
19
20
20
import com .ning .http .client .Request .EntityWriter ;
21
+ import com .ning .http .util .AsyncHttpProviderUtils ;
21
22
import com .ning .http .util .UTF8UrlEncoder ;
22
23
import org .slf4j .Logger ;
23
24
import org .slf4j .LoggerFactory ;
38
39
39
40
/**
40
41
* Builder for {@link Request}
41
- *
42
+ *
42
43
* @param <T>
43
44
*/
44
45
public abstract class RequestBuilderBase <T extends RequestBuilderBase <T >> {
45
46
private final static Logger logger = LoggerFactory .getLogger (RequestBuilderBase .class );
46
47
48
+ private static final URI DEFAULT_REQUEST_URL = URI .create ("http://localhost" );
49
+
47
50
private static final class RequestImpl implements Request {
48
51
private String method ;
49
- private String url = null ;
52
+ private URI originalUri = null ;
53
+ private URI uri = null ;
54
+ private URI rawUri = null ;
50
55
private InetAddress address = null ;
51
56
private InetAddress localAddress = null ;
52
57
private FluentCaseInsensitiveStringsMap headers = new FluentCaseInsensitiveStringsMap ();
@@ -78,9 +83,7 @@ public RequestImpl(boolean useRawUrl) {
78
83
public RequestImpl (Request prototype ) {
79
84
if (prototype != null ) {
80
85
this .method = prototype .getMethod ();
81
- String prototypeUrl = prototype .getUrl ();
82
- int pos = prototypeUrl .indexOf ("?" );
83
- this .url = pos > 0 ? prototypeUrl .substring (0 , pos ) : prototypeUrl ;
86
+ this .originalUri = prototype .getOriginalURI ();
84
87
this .address = prototype .getInetAddress ();
85
88
this .localAddress = prototype .getLocalAddress ();
86
89
this .headers = new FluentCaseInsensitiveStringsMap (prototype .getHeaders ());
@@ -117,12 +120,6 @@ public String getMethod() {
117
120
return method ;
118
121
}
119
122
120
- /* @Override */
121
-
122
- public String getUrl () {
123
- return toUrl (true );
124
- }
125
-
126
123
public InetAddress getInetAddress () {
127
124
return address ;
128
125
}
@@ -131,34 +128,66 @@ public InetAddress getLocalAddress() {
131
128
return localAddress ;
132
129
}
133
130
134
- private String toUrl (boolean encode ) {
131
+ private String removeTrailingSlash (URI uri ) {
132
+ String uriString = uri .toString ();
133
+ if (uriString .endsWith ("/" )) {
134
+ return uriString .substring (0 , uriString .length () - 1 );
135
+ } else {
136
+ return uriString ;
137
+ }
138
+ }
135
139
136
- if (url == null ) {
140
+ /* @Override */
141
+ public String getUrl () {
142
+ return removeTrailingSlash (getURI ());
143
+ }
144
+
145
+ /* @Override */
146
+ public String getRawUrl () {
147
+ return removeTrailingSlash (getRawURI ());
148
+ }
149
+
150
+ public URI getOriginalURI () {
151
+ return originalUri ;
152
+ }
153
+
154
+ public URI getURI () {
155
+ if (uri == null )
156
+ uri = toURI (true );
157
+ return uri ;
158
+ }
159
+
160
+ public URI getRawURI () {
161
+ if (rawUri == null )
162
+ rawUri = toURI (false );
163
+ return rawUri ;
164
+ }
165
+
166
+ private URI toURI (boolean encode ) {
167
+
168
+ if (originalUri == null ) {
137
169
logger .debug ("setUrl hasn't been invoked. Using http://localhost" );
138
- url = "http://localhost/" ;
170
+ originalUri = DEFAULT_REQUEST_URL ;
139
171
}
140
172
141
- String uri = url ;
142
- if (!uri .startsWith ("ws" )) {
143
- try {
144
- uri = URI .create (url ).toURL ().toString ();
145
- } catch (Throwable e ) {
146
- throw new IllegalArgumentException ("Illegal URL: " + url , e );
147
- }
173
+ AsyncHttpProviderUtils .validateSupportedScheme (originalUri );
174
+
175
+ StringBuilder builder = new StringBuilder ();
176
+ builder .append (originalUri .getScheme ()).append ("://" ).append (originalUri .getAuthority ());
177
+ if (isNonEmpty (originalUri .getRawPath ())) {
178
+ builder .append (originalUri .getRawPath ());
179
+ } else {
180
+ builder .append ("/" );
148
181
}
149
182
150
183
if (isNonEmpty (queryParams )) {
151
184
152
- StringBuilder builder = new StringBuilder ();
153
- if (!url .substring (8 ).contains ("/" )) { // no other "/" than http[s]:// -> http://localhost:1234
154
- builder .append ("/" );
155
- }
156
185
builder .append ("?" );
157
186
158
- for (Iterator <Entry <String , List <String >>> i = queryParams .iterator (); i .hasNext (); ) {
187
+ for (Iterator <Entry <String , List <String >>> i = queryParams .iterator (); i .hasNext ();) {
159
188
Map .Entry <String , List <String >> param = i .next ();
160
189
String name = param .getKey ();
161
- for (Iterator <String > j = param .getValue ().iterator (); j .hasNext (); ) {
190
+ for (Iterator <String > j = param .getValue ().iterator (); j .hasNext ();) {
162
191
String value = j .next ();
163
192
if (encode ) {
164
193
UTF8UrlEncoder .appendEncoded (builder , name );
@@ -181,14 +210,9 @@ private String toUrl(boolean encode) {
181
210
builder .append ('&' );
182
211
}
183
212
}
184
- uri += builder .toString ();
185
213
}
186
- return uri ;
187
- }
188
214
189
- /* @Override */
190
- public String getRawUrl () {
191
- return toUrl (false );
215
+ return URI .create (builder .toString ());
192
216
}
193
217
194
218
/* @Override */
@@ -292,12 +316,12 @@ public String getBodyEncoding() {
292
316
}
293
317
294
318
public ConnectionPoolKeyStrategy getConnectionPoolKeyStrategy () {
295
- return connectionPoolKeyStrategy ;
296
- }
297
-
319
+ return connectionPoolKeyStrategy ;
320
+ }
321
+
298
322
@ Override
299
323
public String toString () {
300
- StringBuilder sb = new StringBuilder (url );
324
+ StringBuilder sb = new StringBuilder (getURI (). toString () );
301
325
302
326
sb .append ("\t " );
303
327
sb .append (method );
@@ -346,7 +370,7 @@ protected RequestBuilderBase(Class<T> derived, Request prototype) {
346
370
}
347
371
348
372
public T setUrl (String url ) {
349
- request .url = buildUrl (url );
373
+ request .originalUri = buildURI (url );
350
374
return derived .cast (this );
351
375
}
352
376
@@ -360,7 +384,7 @@ public T setLocalInetAddress(InetAddress address) {
360
384
return derived .cast (this );
361
385
}
362
386
363
- private String buildUrl (String url ) {
387
+ private URI buildURI (String url ) {
364
388
URI uri = URI .create (url );
365
389
StringBuilder buildedUrl = new StringBuilder ();
366
390
@@ -380,7 +404,7 @@ private String buildUrl(String url) {
380
404
if (url .indexOf ("://" ) == -1 ) {
381
405
String s = buildedUrl .toString ();
382
406
url = s + url .substring (uri .getScheme ().length () + 1 );
383
- return buildUrl (url );
407
+ return buildURI (url );
384
408
} else {
385
409
throw new IllegalArgumentException ("Invalid url " + uri .toString ());
386
410
}
@@ -395,7 +419,7 @@ private String buildUrl(String url) {
395
419
addQueryParameter (query , null );
396
420
} else {
397
421
try {
398
- if (this . useRawUrl ) {
422
+ if (useRawUrl ) {
399
423
addQueryParameter (query .substring (0 , pos ), query .substring (pos + 1 ));
400
424
} else {
401
425
addQueryParameter (URLDecoder .decode (query .substring (0 , pos ), "UTF-8" ), URLDecoder .decode (query .substring (pos + 1 ), "UTF-8" ));
@@ -406,10 +430,9 @@ private String buildUrl(String url) {
406
430
}
407
431
}
408
432
}
409
- return buildedUrl . toString () ;
433
+ return uri ;
410
434
}
411
435
412
-
413
436
public T setVirtualHost (String virtualHost ) {
414
437
request .virtualHost = virtualHost ;
415
438
return derived .cast (this );
@@ -612,8 +635,8 @@ public T setBodyEncoding(String charset) {
612
635
}
613
636
614
637
public T setConnectionPoolKeyStrategy (ConnectionPoolKeyStrategy connectionPoolKeyStrategy ) {
615
- request .connectionPoolKeyStrategy = connectionPoolKeyStrategy ;
616
- return derived .cast (this );
638
+ request .connectionPoolKeyStrategy = connectionPoolKeyStrategy ;
639
+ return derived .cast (this );
617
640
}
618
641
619
642
public Request build () {
@@ -633,13 +656,7 @@ public Request build() {
633
656
}
634
657
635
658
private boolean allowBody (String method ) {
636
- if (method .equalsIgnoreCase ("GET" ) || method .equalsIgnoreCase ("OPTIONS" )
637
- && method .equalsIgnoreCase ("TRACE" )
638
- && method .equalsIgnoreCase ("HEAD" )) {
639
- return false ;
640
- } else {
641
- return true ;
642
- }
659
+ return !(method .equalsIgnoreCase ("GET" ) || method .equalsIgnoreCase ("OPTIONS" ) || method .equalsIgnoreCase ("TRACE" ) || method .equalsIgnoreCase ("HEAD" ));
643
660
}
644
661
645
662
public T addOrReplaceCookie (Cookie cookie ) {
0 commit comments