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          */
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      */
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      */
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      */
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      */
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      */
211     private URIUtils() {
212     }
213 
214 }
215