1 /*
2  * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/client/utils/URIUtils.java $
3  * $Revision: 653041 $
4  * $Date: 2008-05-03 03:39:28 -0700 (Sat, 03 May 2008) $
5  *
6  * ====================================================================
7  *
8  *  Licensed to the Apache Software Foundation (ASF) under one or more
9  *  contributor license agreements.  See the NOTICE file distributed with
10  *  this work for additional information regarding copyright ownership.
11  *  The ASF licenses this file to You under the Apache License, Version 2.0
12  *  (the "License"); you may not use this file except in compliance with
13  *  the License.  You may obtain a copy of the License at
14  *
15  *      http://www.apache.org/licenses/LICENSE-2.0
16  *
17  *  Unless required by applicable law or agreed to in writing, software
18  *  distributed under the License is distributed on an "AS IS" BASIS,
19  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20  *  See the License for the specific language governing permissions and
21  *  limitations under the License.
22  * ====================================================================
23  *
24  * This software consists of voluntary contributions made by many
25  * individuals on behalf of the Apache Software Foundation.  For more
26  * information on the Apache Software Foundation, please see
27  * <http://www.apache.org/>.
28  *
29  */
30 package org.apache.http.client.utils;
31 
32 import java.net.URI;
33 import java.net.URISyntaxException;
34 
35 import org.apache.http.HttpHost;
36 
37 /**
38  * A collection of utilities for {@link URI URIs}, to workaround
39  * bugs within the class or for ease-of-use features.
40  *
41  * @deprecated Please use {@link java.net.URL#openConnection} instead.
42  *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
43  *     for further details.
44  */
45 @Deprecated
46 public class URIUtils {
47 
48      /**
49          * Constructs a {@link URI} using all the parameters. This should be
50          * used instead of
51          * {@link URI#URI(String, String, String, int, String, String, String)}
52          * or any of the other URI multi-argument URI constructors.
53          *
54          * See <a
55          * href="https://issues.apache.org/jira/browse/HTTPCLIENT-730">HTTPCLIENT-730</a>
56          * for more information.
57          *
58          * @param scheme
59          *            Scheme name
60          * @param host
61          *            Host name
62          * @param port
63          *            Port number
64          * @param path
65          *            Path
66          * @param query
67          *            Query
68          * @param fragment
69          *            Fragment
70          *
71          * @throws URISyntaxException
72          *             If both a scheme and a path are given but the path is
73          *             relative, if the URI string constructed from the given
74          *             components violates RFC&nbsp;2396, or if the authority
75          *             component of the string is present but cannot be parsed
76          *             as a server-based authority
77          */
createURI( final String scheme, final String host, int port, final String path, final String query, final String fragment)78     public static URI createURI(
79             final String scheme,
80             final String host,
81             int port,
82             final String path,
83             final String query,
84             final String fragment) throws URISyntaxException {
85 
86         StringBuilder buffer = new StringBuilder();
87         if (host != null) {
88             if (scheme != null) {
89                 buffer.append(scheme);
90                 buffer.append("://");
91             }
92             buffer.append(host);
93             if (port > 0) {
94                 buffer.append(':');
95                 buffer.append(port);
96             }
97         }
98         if (path == null || !path.startsWith("/")) {
99             buffer.append('/');
100         }
101         if (path != null) {
102             buffer.append(path);
103         }
104         if (query != null) {
105             buffer.append('?');
106             buffer.append(query);
107         }
108         if (fragment != null) {
109             buffer.append('#');
110             buffer.append(fragment);
111         }
112         return new URI(buffer.toString());
113     }
114 
115     /**
116      * A convenience method for creating a new {@link URI} whose scheme, host
117      * and port are taken from the target host, but whose path, query and
118      * fragment are taken from the existing URI. The fragment is only used if
119      * dropFragment is false.
120      *
121      * @param uri
122      *            Contains the path, query and fragment to use.
123      * @param target
124      *            Contains the scheme, host and port to use.
125      * @param dropFragment
126      *            True if the fragment should not be copied.
127      *
128      * @throws URISyntaxException
129      *             If the resulting URI is invalid.
130      */
rewriteURI( final URI uri, final HttpHost target, boolean dropFragment)131     public static URI rewriteURI(
132             final URI uri,
133             final HttpHost target,
134             boolean dropFragment) throws URISyntaxException {
135         if (uri == null) {
136             throw new IllegalArgumentException("URI may nor be null");
137         }
138         if (target != null) {
139             return URIUtils.createURI(
140                     target.getSchemeName(),
141                     target.getHostName(),
142                     target.getPort(),
143                     uri.getRawPath(),
144                     uri.getRawQuery(),
145                     dropFragment ? null : uri.getRawFragment());
146         } else {
147             return URIUtils.createURI(
148                     null,
149                     null,
150                     -1,
151                     uri.getRawPath(),
152                     uri.getRawQuery(),
153                     dropFragment ? null : uri.getRawFragment());
154         }
155     }
156 
157     /**
158      * A convenience method for
159      * {@link URIUtils#rewriteURI(URI, HttpHost, boolean)} that always keeps the
160      * fragment.
161      */
rewriteURI( final URI uri, final HttpHost target)162     public static URI rewriteURI(
163             final URI uri,
164             final HttpHost target) throws URISyntaxException {
165         return rewriteURI(uri, target, false);
166     }
167 
168     /**
169      * Resolves a URI reference against a base URI. Work-around for bug in
170      * java.net.URI (<http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4708535>)
171      *
172      * @param baseURI the base URI
173      * @param reference the URI reference
174      * @return the resulting URI
175      */
resolve(final URI baseURI, final String reference)176     public static URI resolve(final URI baseURI, final String reference) {
177         return URIUtils.resolve(baseURI, URI.create(reference));
178     }
179 
180     /**
181      * Resolves a URI reference against a base URI. Work-around for bug in
182      * java.net.URI (<http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4708535>)
183      *
184      * @param baseURI the base URI
185      * @param reference the URI reference
186      * @return the resulting URI
187      */
resolve(final URI baseURI, URI reference)188     public static URI resolve(final URI baseURI, URI reference){
189         if (baseURI == null) {
190             throw new IllegalArgumentException("Base URI may nor be null");
191         }
192         if (reference == null) {
193             throw new IllegalArgumentException("Reference URI may nor be null");
194         }
195         boolean emptyReference = reference.toString().length() == 0;
196         if (emptyReference) {
197             reference = URI.create("#");
198         }
199         URI resolved = baseURI.resolve(reference);
200         if (emptyReference) {
201             String resolvedString = resolved.toString();
202             resolved = URI.create(resolvedString.substring(0,
203                 resolvedString.indexOf('#')));
204         }
205         return resolved;
206     }
207 
208     /**
209      * This class should not be instantiated.
210      */
URIUtils()211     private URIUtils() {
212     }
213 
214 }
215