1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.hc.client5.http.utils;
28
29 import java.net.URI;
30 import java.net.URISyntaxException;
31 import java.util.ArrayList;
32 import java.util.Iterator;
33 import java.util.List;
34 import java.util.Locale;
35
36 import org.apache.hc.core5.http.HttpHost;
37 import org.apache.hc.core5.http.URIScheme;
38 import org.apache.hc.core5.net.URIAuthority;
39 import org.apache.hc.core5.net.URIBuilder;
40 import org.apache.hc.core5.util.Args;
41 import org.apache.hc.core5.util.TextUtils;
42
43
44
45
46
47
48
49 public class URIUtils {
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 @Deprecated
70 public static URI rewriteURI(
71 final URI uri,
72 final HttpHost target,
73 final boolean dropFragment) throws URISyntaxException {
74 Args.notNull(uri, "URI");
75 if (uri.isOpaque()) {
76 return uri;
77 }
78 final URIBuilder uribuilder = new URIBuilder(uri);
79 if (target != null) {
80 uribuilder.setScheme(target.getSchemeName());
81 uribuilder.setHost(target.getHostName());
82 uribuilder.setPort(target.getPort());
83 } else {
84 uribuilder.setScheme(null);
85 uribuilder.setHost((String) null);
86 uribuilder.setPort(-1);
87 }
88 if (dropFragment) {
89 uribuilder.setFragment(null);
90 }
91 final List<String> originalPathSegments = uribuilder.getPathSegments();
92 final List<String> pathSegments = new ArrayList<>(originalPathSegments);
93 for (final Iterator<String> it = pathSegments.iterator(); it.hasNext(); ) {
94 final String pathSegment = it.next();
95 if (pathSegment.isEmpty() && it.hasNext()) {
96 it.remove();
97 }
98 }
99 if (pathSegments.size() != originalPathSegments.size()) {
100 uribuilder.setPathSegments(pathSegments);
101 }
102 if (pathSegments.isEmpty()) {
103 uribuilder.setPathSegments("");
104 }
105 return uribuilder.build();
106 }
107
108
109
110
111
112
113
114
115 @Deprecated
116 public static URI rewriteURI(
117 final URI uri,
118 final HttpHost target) throws URISyntaxException {
119 return rewriteURI(uri, target, false);
120 }
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 @Deprecated
136 public static URI rewriteURI(final URI uri) throws URISyntaxException {
137 Args.notNull(uri, "URI");
138 if (uri.isOpaque()) {
139 return uri;
140 }
141 final URIBuilder uribuilder = new URIBuilder(uri);
142 if (uribuilder.getUserInfo() != null) {
143 uribuilder.setUserInfo(null);
144 }
145 if (uribuilder.isPathEmpty()) {
146 uribuilder.setPathSegments("");
147 }
148 if (uribuilder.getHost() != null) {
149 uribuilder.setHost(uribuilder.getHost().toLowerCase(Locale.ROOT));
150 }
151 uribuilder.setFragment(null);
152 return uribuilder.build();
153 }
154
155
156
157
158
159
160
161
162
163 public static URI resolve(final URI baseURI, final String reference) {
164 return resolve(baseURI, URI.create(reference));
165 }
166
167
168
169
170
171
172
173
174
175 public static URI resolve(final URI baseURI, final URI reference) {
176 Args.notNull(baseURI, "Base URI");
177 Args.notNull(reference, "Reference URI");
178 final String s = reference.toASCIIString();
179 if (s.startsWith("?")) {
180 String baseUri = baseURI.toASCIIString();
181 final int i = baseUri.indexOf('?');
182 baseUri = i > -1 ? baseUri.substring(0, i) : baseUri;
183 return URI.create(baseUri + s);
184 }
185 final boolean emptyReference = s.isEmpty();
186 URI resolved;
187 if (emptyReference) {
188 resolved = baseURI.resolve(URI.create("#"));
189 final String resolvedString = resolved.toASCIIString();
190 resolved = URI.create(resolvedString.substring(0, resolvedString.indexOf('#')));
191 } else {
192 resolved = baseURI.resolve(reference);
193 }
194 try {
195 return normalizeSyntax(resolved);
196 } catch (final URISyntaxException ex) {
197 throw new IllegalArgumentException(ex);
198 }
199 }
200
201
202
203
204
205
206
207 static URI normalizeSyntax(final URI uri) throws URISyntaxException {
208 if (uri.isOpaque() || uri.getAuthority() == null) {
209
210 return uri;
211 }
212 final URIBuilder builder = new URIBuilder(uri);
213 final String scheme = builder.getScheme();
214 if (scheme == null) {
215 builder.setScheme(URIScheme.HTTP.id);
216 } else {
217 builder.setScheme(TextUtils.toLowerCase(scheme));
218 }
219 final String host = builder.getHost();
220 if (host != null) {
221 builder.setHost(TextUtils.toLowerCase(host));
222 }
223 if (builder.isPathEmpty()) {
224 builder.setPathSegments("");
225 }
226 return builder.build();
227 }
228
229
230
231
232
233
234
235
236
237
238 public static HttpHost extractHost(final URI uri) {
239 if (uri == null) {
240 return null;
241 }
242 final URIBuilder uriBuilder = new URIBuilder(uri);
243 final String scheme = uriBuilder.getScheme();
244 final String host = uriBuilder.getHost();
245 final int port = uriBuilder.getPort();
246 if (!TextUtils.isBlank(host)) {
247 try {
248 return new HttpHost(scheme, host, port);
249 } catch (final IllegalArgumentException ignore) {
250 }
251 }
252 return null;
253 }
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271 public static URI resolve(
272 final URI originalURI,
273 final HttpHost target,
274 final List<URI> redirects) throws URISyntaxException {
275 Args.notNull(originalURI, "Request URI");
276 final URIBuilder uribuilder;
277 if (redirects == null || redirects.isEmpty()) {
278 uribuilder = new URIBuilder(originalURI);
279 } else {
280 uribuilder = new URIBuilder(redirects.get(redirects.size() - 1));
281 String frag = uribuilder.getFragment();
282
283 for (int i = redirects.size() - 1; frag == null && i >= 0; i--) {
284 frag = redirects.get(i).getFragment();
285 }
286 uribuilder.setFragment(frag);
287 }
288
289 if (uribuilder.getFragment() == null) {
290 uribuilder.setFragment(originalURI.getFragment());
291 }
292
293 if (target != null && !uribuilder.isAbsolute()) {
294 uribuilder.setScheme(target.getSchemeName());
295 uribuilder.setHost(target.getHostName());
296 uribuilder.setPort(target.getPort());
297 }
298 return uribuilder.build();
299 }
300
301
302
303
304
305
306
307
308 @Deprecated
309 public static URI create(final HttpHost host, final String path) throws URISyntaxException {
310 final URIBuilder builder = new URIBuilder(path);
311 if (host != null) {
312 builder.setHost(host.getHostName()).setPort(host.getPort()).setScheme(host.getSchemeName());
313 }
314 return builder.build();
315 }
316
317
318
319
320
321
322
323
324 @Deprecated
325 public static URI create(final String scheme, final URIAuthority host, final String path) throws URISyntaxException {
326 final URIBuilder builder = new URIBuilder(path);
327 if (scheme != null) {
328 builder.setScheme(scheme);
329 }
330 if (host != null) {
331 builder.setHost(host.getHostName()).setPort(host.getPort());
332 }
333 return builder.build();
334 }
335
336
337
338
339 private URIUtils() {
340 }
341
342 }