URIUtils.java revision d42abb2fd917184764daf22f5f299e848b8701d7
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 */
30package org.apache.http.client.utils;
31
32import java.net.URI;
33import java.net.URISyntaxException;
34
35import 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
46public 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