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 public class URIUtils { 42 43 /** 44 * Constructs a {@link URI} using all the parameters. This should be 45 * used instead of 46 * {@link URI#URI(String, String, String, int, String, String, String)} 47 * or any of the other URI multi-argument URI constructors. 48 * 49 * See <a 50 * href="https://issues.apache.org/jira/browse/HTTPCLIENT-730">HTTPCLIENT-730</a> 51 * for more information. 52 * 53 * @param scheme 54 * Scheme name 55 * @param host 56 * Host name 57 * @param port 58 * Port number 59 * @param path 60 * Path 61 * @param query 62 * Query 63 * @param fragment 64 * Fragment 65 * 66 * @throws URISyntaxException 67 * If both a scheme and a path are given but the path is 68 * relative, if the URI string constructed from the given 69 * components violates RFC 2396, or if the authority 70 * component of the string is present but cannot be parsed 71 * as a server-based authority 72 */ createURI( final String scheme, final String host, int port, final String path, final String query, final String fragment)73 public static URI createURI( 74 final String scheme, 75 final String host, 76 int port, 77 final String path, 78 final String query, 79 final String fragment) throws URISyntaxException { 80 81 StringBuilder buffer = new StringBuilder(); 82 if (host != null) { 83 if (scheme != null) { 84 buffer.append(scheme); 85 buffer.append("://"); 86 } 87 buffer.append(host); 88 if (port > 0) { 89 buffer.append(':'); 90 buffer.append(port); 91 } 92 } 93 if (path == null || !path.startsWith("/")) { 94 buffer.append('/'); 95 } 96 if (path != null) { 97 buffer.append(path); 98 } 99 if (query != null) { 100 buffer.append('?'); 101 buffer.append(query); 102 } 103 if (fragment != null) { 104 buffer.append('#'); 105 buffer.append(fragment); 106 } 107 return new URI(buffer.toString()); 108 } 109 110 /** 111 * A convenience method for creating a new {@link URI} whose scheme, host 112 * and port are taken from the target host, but whose path, query and 113 * fragment are taken from the existing URI. The fragment is only used if 114 * dropFragment is false. 115 * 116 * @param uri 117 * Contains the path, query and fragment to use. 118 * @param target 119 * Contains the scheme, host and port to use. 120 * @param dropFragment 121 * True if the fragment should not be copied. 122 * 123 * @throws URISyntaxException 124 * If the resulting URI is invalid. 125 */ rewriteURI( final URI uri, final HttpHost target, boolean dropFragment)126 public static URI rewriteURI( 127 final URI uri, 128 final HttpHost target, 129 boolean dropFragment) throws URISyntaxException { 130 if (uri == null) { 131 throw new IllegalArgumentException("URI may nor be null"); 132 } 133 if (target != null) { 134 return URIUtils.createURI( 135 target.getSchemeName(), 136 target.getHostName(), 137 target.getPort(), 138 uri.getRawPath(), 139 uri.getRawQuery(), 140 dropFragment ? null : uri.getRawFragment()); 141 } else { 142 return URIUtils.createURI( 143 null, 144 null, 145 -1, 146 uri.getRawPath(), 147 uri.getRawQuery(), 148 dropFragment ? null : uri.getRawFragment()); 149 } 150 } 151 152 /** 153 * A convenience method for 154 * {@link URIUtils#rewriteURI(URI, HttpHost, boolean)} that always keeps the 155 * fragment. 156 */ rewriteURI( final URI uri, final HttpHost target)157 public static URI rewriteURI( 158 final URI uri, 159 final HttpHost target) throws URISyntaxException { 160 return rewriteURI(uri, target, false); 161 } 162 163 /** 164 * Resolves a URI reference against a base URI. Work-around for bug in 165 * java.net.URI (<http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4708535>) 166 * 167 * @param baseURI the base URI 168 * @param reference the URI reference 169 * @return the resulting URI 170 */ resolve(final URI baseURI, final String reference)171 public static URI resolve(final URI baseURI, final String reference) { 172 return URIUtils.resolve(baseURI, URI.create(reference)); 173 } 174 175 /** 176 * Resolves a URI reference against a base URI. Work-around for bug in 177 * java.net.URI (<http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4708535>) 178 * 179 * @param baseURI the base URI 180 * @param reference the URI reference 181 * @return the resulting URI 182 */ resolve(final URI baseURI, URI reference)183 public static URI resolve(final URI baseURI, URI reference){ 184 if (baseURI == null) { 185 throw new IllegalArgumentException("Base URI may nor be null"); 186 } 187 if (reference == null) { 188 throw new IllegalArgumentException("Reference URI may nor be null"); 189 } 190 boolean emptyReference = reference.toString().length() == 0; 191 if (emptyReference) { 192 reference = URI.create("#"); 193 } 194 URI resolved = baseURI.resolve(reference); 195 if (emptyReference) { 196 String resolvedString = resolved.toString(); 197 resolved = URI.create(resolvedString.substring(0, 198 resolvedString.indexOf('#'))); 199 } 200 return resolved; 201 } 202 203 /** 204 * This class should not be instantiated. 205 */ URIUtils()206 private URIUtils() { 207 } 208 209 } 210