| /* |
| * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/client/utils/URIUtils.java $ |
| * $Revision: 653041 $ |
| * $Date: 2008-05-03 03:39:28 -0700 (Sat, 03 May 2008) $ |
| * |
| * ==================================================================== |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * ==================================================================== |
| * |
| * This software consists of voluntary contributions made by many |
| * individuals on behalf of the Apache Software Foundation. For more |
| * information on the Apache Software Foundation, please see |
| * <http://www.apache.org/>. |
| * |
| */ |
| package org.apache.http.client.utils; |
| |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| |
| import org.apache.http.HttpHost; |
| |
| /** |
| * A collection of utilities for {@link URI URIs}, to workaround |
| * bugs within the class or for ease-of-use features. |
| */ |
| public class URIUtils { |
| |
| /** |
| * Constructs a {@link URI} using all the parameters. This should be |
| * used instead of |
| * {@link URI#URI(String, String, String, int, String, String, String)} |
| * or any of the other URI multi-argument URI constructors. |
| * |
| * See <a |
| * href="https://issues.apache.org/jira/browse/HTTPCLIENT-730">HTTPCLIENT-730</a> |
| * for more information. |
| * |
| * @param scheme |
| * Scheme name |
| * @param host |
| * Host name |
| * @param port |
| * Port number |
| * @param path |
| * Path |
| * @param query |
| * Query |
| * @param fragment |
| * Fragment |
| * |
| * @throws URISyntaxException |
| * If both a scheme and a path are given but the path is |
| * relative, if the URI string constructed from the given |
| * components violates RFC 2396, or if the authority |
| * component of the string is present but cannot be parsed |
| * as a server-based authority |
| */ |
| public static URI createURI( |
| final String scheme, |
| final String host, |
| int port, |
| final String path, |
| final String query, |
| final String fragment) throws URISyntaxException { |
| |
| StringBuilder buffer = new StringBuilder(); |
| if (host != null) { |
| if (scheme != null) { |
| buffer.append(scheme); |
| buffer.append("://"); |
| } |
| buffer.append(host); |
| if (port > 0) { |
| buffer.append(':'); |
| buffer.append(port); |
| } |
| } |
| if (path == null || !path.startsWith("/")) { |
| buffer.append('/'); |
| } |
| if (path != null) { |
| buffer.append(path); |
| } |
| if (query != null) { |
| buffer.append('?'); |
| buffer.append(query); |
| } |
| if (fragment != null) { |
| buffer.append('#'); |
| buffer.append(fragment); |
| } |
| return new URI(buffer.toString()); |
| } |
| |
| /** |
| * A convenience method for creating a new {@link URI} whose scheme, host |
| * and port are taken from the target host, but whose path, query and |
| * fragment are taken from the existing URI. The fragment is only used if |
| * dropFragment is false. |
| * |
| * @param uri |
| * Contains the path, query and fragment to use. |
| * @param target |
| * Contains the scheme, host and port to use. |
| * @param dropFragment |
| * True if the fragment should not be copied. |
| * |
| * @throws URISyntaxException |
| * If the resulting URI is invalid. |
| */ |
| public static URI rewriteURI( |
| final URI uri, |
| final HttpHost target, |
| boolean dropFragment) throws URISyntaxException { |
| if (uri == null) { |
| throw new IllegalArgumentException("URI may nor be null"); |
| } |
| if (target != null) { |
| return URIUtils.createURI( |
| target.getSchemeName(), |
| target.getHostName(), |
| target.getPort(), |
| uri.getRawPath(), |
| uri.getRawQuery(), |
| dropFragment ? null : uri.getRawFragment()); |
| } else { |
| return URIUtils.createURI( |
| null, |
| null, |
| -1, |
| uri.getRawPath(), |
| uri.getRawQuery(), |
| dropFragment ? null : uri.getRawFragment()); |
| } |
| } |
| |
| /** |
| * A convenience method for |
| * {@link URIUtils#rewriteURI(URI, HttpHost, boolean)} that always keeps the |
| * fragment. |
| */ |
| public static URI rewriteURI( |
| final URI uri, |
| final HttpHost target) throws URISyntaxException { |
| return rewriteURI(uri, target, false); |
| } |
| |
| /** |
| * Resolves a URI reference against a base URI. Work-around for bug in |
| * java.net.URI (<http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4708535>) |
| * |
| * @param baseURI the base URI |
| * @param reference the URI reference |
| * @return the resulting URI |
| */ |
| public static URI resolve(final URI baseURI, final String reference) { |
| return URIUtils.resolve(baseURI, URI.create(reference)); |
| } |
| |
| /** |
| * Resolves a URI reference against a base URI. Work-around for bug in |
| * java.net.URI (<http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4708535>) |
| * |
| * @param baseURI the base URI |
| * @param reference the URI reference |
| * @return the resulting URI |
| */ |
| public static URI resolve(final URI baseURI, URI reference){ |
| if (baseURI == null) { |
| throw new IllegalArgumentException("Base URI may nor be null"); |
| } |
| if (reference == null) { |
| throw new IllegalArgumentException("Reference URI may nor be null"); |
| } |
| boolean emptyReference = reference.toString().length() == 0; |
| if (emptyReference) { |
| reference = URI.create("#"); |
| } |
| URI resolved = baseURI.resolve(reference); |
| if (emptyReference) { |
| String resolvedString = resolved.toString(); |
| resolved = URI.create(resolvedString.substring(0, |
| resolvedString.indexOf('#'))); |
| } |
| return resolved; |
| } |
| |
| /** |
| * This class should not be instantiated. |
| */ |
| private URIUtils() { |
| } |
| |
| } |