URLStreamHandler.java revision b93dbaedd71dae5c1e4fb2faba863acbde1080c2
151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1995, 2006, Oracle and/or its affiliates. All rights reserved. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.net; 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.InputStream; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.File; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.OutputStream; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Hashtable; 34b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamathimport java.util.Objects; 35b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.net.util.IPAddressUtil; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.net.www.ParseUtil; 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The abstract class <code>URLStreamHandler</code> is the common 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * superclass for all stream protocol handlers. A stream protocol 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * handler knows how to make a connection for a particular protocol 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * type, such as <code>http</code>, <code>ftp</code>, or 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>gopher</code>. 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * In most cases, an instance of a <code>URLStreamHandler</code> 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * subclass is not created directly by an application. Rather, the 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * first time a protocol name is encountered when constructing a 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>URL</code>, the appropriate stream protocol handler is 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * automatically loaded. 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author James Gosling 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.URL#URL(java.lang.String, java.lang.String, int, java.lang.String) 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since JDK1.0 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class URLStreamHandler { 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Opens a connection to the object referenced by the 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>URL</code> argument. 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method should be overridden by a subclass. 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>If for the handler's protocol (such as HTTP or JAR), there 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * exists a public, specialized URLConnection subclass belonging 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to one of the following packages or one of their subpackages: 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.lang, java.io, java.util, java.net, the connection 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returned will be of that subclass. For example, for HTTP an 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * HttpURLConnection will be returned, and for JAR a 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * JarURLConnection will be returned. 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u the URL that this connects to. 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>URLConnection</code> object for the <code>URL</code>. 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error occurs while opening the 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connection. 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski abstract protected URLConnection openConnection(URL u) throws IOException; 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Same as openConnection(URL), except that the connection will be 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * made through the specified proxy; Protocol handlers that do not 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * support proxying will ignore the proxy parameter and make a 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * normal connection. 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Calling this method preempts the system's default ProxySelector 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * settings. 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u the URL that this connects to. 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param p the proxy through which the connection will be made. 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If direct connection is desired, Proxy.NO_PROXY 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * should be specified. 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>URLConnection</code> object for the <code>URL</code>. 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IOException if an I/O error occurs while opening the 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connection. 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if either u or p is null, 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or p has the wrong type. 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception UnsupportedOperationException if the subclass that 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implements the protocol doesn't support this method. 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.5 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected URLConnection openConnection(URL u, Proxy p) throws IOException { 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnsupportedOperationException("Method not implemented."); 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Parses the string representation of a <code>URL</code> into a 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>URL</code> object. 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If there is any inherited context, then it has already been 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * copied into the <code>URL</code> argument. 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>parseURL</code> method of <code>URLStreamHandler</code> 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parses the string representation as if it were an 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>http</code> specification. Most URL protocol families have a 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * similar parsing. A stream protocol handler for a protocol that has 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a different syntax must override this routine. 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u the <code>URL</code> to receive the result of parsing 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the spec. 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param spec the <code>String</code> representing the URL that 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * must be parsed. 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param start the character index at which to begin parsing. This is 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * just past the '<code>:</code>' (if there is one) that 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specifies the determination of the protocol name. 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param limit the character position to stop parsing at. This is the 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * end of the string or the position of the 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * "<code>#</code>" character, if present. All information 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * after the sharp sign indicates an anchor. 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void parseURL(URL u, String spec, int start, int limit) { 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // These fields may receive context content if this was relative URL 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String protocol = u.getProtocol(); 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String authority = u.getAuthority(); 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String userInfo = u.getUserInfo(); 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String host = u.getHost(); 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int port = u.getPort(); 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String path = u.getPath(); 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String query = u.getQuery(); 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // This field has already been parsed 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String ref = u.getRef(); 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean isRelPath = false; 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean queryOnly = false; 14306fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // ----- BEGIN android ----- 14406fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak boolean querySet = false; 14506fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // ----- END android ----- 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14706fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // FIX: should not assume query if opaque 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Strip off the query part 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (start < limit) { 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int queryStart = spec.indexOf('?'); 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski queryOnly = queryStart == start; 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((queryStart != -1) && (queryStart < limit)) { 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski query = spec.substring(queryStart+1, limit); 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (limit > queryStart) 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski limit = queryStart; 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski spec = spec.substring(0, queryStart); 15706fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // ----- BEGIN android ----- 15806fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak querySet = true; 15906fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // ----- END android ----- 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int i = 0; 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Parse the authority part if any 16506fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // ----- BEGIN android ----- 16606fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // boolean isUNCName = (start <= limit - 4) && 16706fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // (spec.charAt(start) == '/') && 16806fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // (spec.charAt(start + 1) == '/') && 16906fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // (spec.charAt(start + 2) == '/') && 17006fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // (spec.charAt(start + 3) == '/'); 17106fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak boolean isUNCName = false; 17206fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // ----- END android ----- 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!isUNCName && (start <= limit - 2) && (spec.charAt(start) == '/') && 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (spec.charAt(start + 1) == '/')) { 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski start += 2; 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i = spec.indexOf('/', start); 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (i < 0) { 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i = spec.indexOf('?', start); 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (i < 0) 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i = limit; 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = authority = spec.substring(start, i); 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int ind = authority.indexOf('@'); 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ind != -1) { 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski userInfo = authority.substring(0, ind); 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = authority.substring(ind+1); 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski userInfo = null; 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host != null) { 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // If the host is surrounded by [ and ] then its an IPv6 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // literal address as specified in RFC2732 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host.length()>0 && (host.charAt(0) == '[')) { 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((ind = host.indexOf(']')) > 2) { 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String nhost = host ; 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = nhost.substring(0,ind+1); 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!IPAddressUtil. 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski isIPv6LiteralAddress(host.substring(1, ind))) { 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException( 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "Invalid host: "+ host); 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski port = -1 ; 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (nhost.length() > ind+1) { 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (nhost.charAt(ind+1) == ':') { 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ++ind ; 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // port can be null according to RFC2396 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (nhost.length() > (ind + 1)) { 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski port = Integer.parseInt(nhost.substring(ind+1)); 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException( 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "Invalid authority field: " + authority); 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException( 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "Invalid authority field: " + authority); 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ind = host.indexOf(':'); 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski port = -1; 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ind >= 0) { 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // port can be null according to RFC2396 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host.length() > (ind + 1)) { 22906fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // ----- BEGIN android ----- 23006fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // port = Integer.parseInt(host.substring(ind + 1)); 23106fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak char firstPortChar = host.charAt(ind+1); 23206fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak if (firstPortChar >= '0' && firstPortChar <= '9') { 23306fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak port = Integer.parseInt(host.substring(ind + 1)); 23406fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak } else { 23506fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak throw new IllegalArgumentException("invalid port: " + 23606fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak host.substring(ind + 1)); 23706fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak } 23806fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // ----- END android ----- 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = host.substring(0, ind); 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = ""; 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (port < -1) 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("Invalid port number :" + 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski port); 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski start = i; 25006fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak 25106fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // ----- BEGIN android ----- 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // If the authority is defined then the path is defined by the 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // spec only; See RFC 2396 Section 5.2.4. 25406fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // if (authority != null && authority.length() > 0) 25506fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // path = ""; 25606fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak path = null; 25706fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak if (!querySet) { 25806fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak query = null; 25906fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak } 26006fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak // ----- END android ----- 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host == null) { 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = ""; 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Parse the file path if any 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (start < limit) { 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (spec.charAt(start) == '/') { 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = spec.substring(start, limit); 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (path != null && path.length() > 0) { 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski isRelPath = true; 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int ind = path.lastIndexOf('/'); 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String seperator = ""; 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (ind == -1 && authority != null) 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski seperator = "/"; 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = path.substring(0, ind + 1) + seperator + 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski spec.substring(start, limit); 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String seperator = (authority != null) ? "/" : ""; 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = seperator + spec.substring(start, limit); 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 285e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak // ----- BEGIN android ----- 286e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak //else if (queryOnly && path != null) { 287e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak // int ind = path.lastIndexOf('/'); 288e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak // if (ind < 0) 289e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak // ind = 0; 290e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak // path = path.substring(0, ind) + "/"; 291e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak //} 292e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak // ----- END android ----- 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (path == null) 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = ""; 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 296a53c889dff2031f9eb20594c1a172c6a228c0298Przemyslaw Szczepaniak // ----- BEGIN android ----- 297a53c889dff2031f9eb20594c1a172c6a228c0298Przemyslaw Szczepaniak //if (isRelPath) { 298a53c889dff2031f9eb20594c1a172c6a228c0298Przemyslaw Szczepaniak if (true) { 299a53c889dff2031f9eb20594c1a172c6a228c0298Przemyslaw Szczepaniak // ----- END android ----- 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Remove embedded /./ 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while ((i = path.indexOf("/./")) >= 0) { 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = path.substring(0, i) + path.substring(i + 2); 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Remove embedded /../ if possible 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i = 0; 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while ((i = path.indexOf("/../", i)) >= 0) { 307e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak // ----- BEGIN android ----- 308e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak /* 309e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak * Trailing /../ 310e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak */ 311e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak if (i == 0) { 312e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak path = path.substring(i + 3); 313e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak i = 0; 314e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak // ----- END android ----- 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A "/../" will cancel the previous segment and itself, 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * unless that segment is a "/../" itself 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * i.e. "/a/b/../c" becomes "/a/c" 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * but "/../../a" should stay unchanged 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 321e4dc89b637bb77dc97fb33a84339fbfe83abe567Przemyslaw Szczepaniak } else if (i > 0 && (limit = path.lastIndexOf('/', i - 1)) >= 0 && 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (path.indexOf("/../", limit) != 0)) { 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = path.substring(0, limit) + path.substring(i + 3); 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i = 0; 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i = i + 3; 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Remove trailing .. if possible 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (path.endsWith("/..")) { 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski i = path.indexOf("/.."); 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((limit = path.lastIndexOf('/', i - 1)) >= 0) { 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = path.substring(0, limit+1); 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Remove starting . 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (path.startsWith("./") && path.length() > 2) 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = path.substring(2); 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Remove trailing . 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (path.endsWith("/.")) 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = path.substring(0, path.length() -1); 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setURL(u, protocol, host, port, authority, userInfo, path, query, ref); 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the default port for a URL parsed by this handler. This method 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is meant to be overidden by handlers with default port numbers. 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the default port for a <code>URL</code> parsed by this handler. 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.3 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected int getDefaultPort() { 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return -1; 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Provides the default equals calculation. May be overidden by handlers 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for other protocols that have different requirements for equals(). 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method requires that none of its arguments is null. This is 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * guaranteed by the fact that it is only called by java.net.URL class. 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u1 a URL object 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u2 a URL object 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if the two urls are 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * considered equal, ie. they refer to the same 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * fragment in the same file. 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.3 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected boolean equals(URL u1, URL u2) { 373b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath return Objects.equals(u1.getRef(), u2.getRef()) && 374b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath Objects.equals(u1.getQuery(), u2.getQuery()) && 375b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath // sameFile compares the protocol, file, port & host components of 376b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath // the URLs. 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sameFile(u1, u2); 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Provides the default hash calculation. May be overidden by handlers for 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * other protocols that have different requirements for hashCode 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calculation. 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u a URL object 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an <tt>int</tt> suitable for hash table indexing 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.3 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected int hashCode(URL u) { 389b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath // Hash on the same set of fields that we compare in equals(). 390b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath return Objects.hash( 391b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath u.getRef(), 392b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath u.getQuery(), 393b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath u.getProtocol(), 394b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath u.getFile(), 395b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath u.getHost(), 396b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath u.getPort()); 39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compare two urls to see whether they refer to the same file, 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * i.e., having the same protocol, host, port, and path. 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method requires that none of its arguments is null. This is 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * guaranteed by the fact that it is only called indirectly 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by java.net.URL class. 40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u1 a URL object 40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u2 a URL object 40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return true if u1 and u2 refer to the same file 40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.3 40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected boolean sameFile(URL u1, URL u2) { 41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Compare the protocols. 41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!((u1.getProtocol() == u2.getProtocol()) || 41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (u1.getProtocol() != null && 41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski u1.getProtocol().equalsIgnoreCase(u2.getProtocol())))) 41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Compare the files. 41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(u1.getFile() == u2.getFile() || 41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (u1.getFile() != null && u1.getFile().equals(u2.getFile())))) 42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Compare the ports. 42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int port1, port2; 42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski port1 = (u1.getPort() != -1) ? u1.getPort() : u1.handler.getDefaultPort(); 42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski port2 = (u2.getPort() != -1) ? u2.getPort() : u2.handler.getDefaultPort(); 42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (port1 != port2) 42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Compare the hosts. 43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!hostsEqual(u1, u2)) 43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get the IP address of our host. An empty host field or a DNS failure 43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will result in a null return. 43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u a URL object 44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an <code>InetAddress</code> representing the host 44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * IP address. 44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.3 44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected synchronized InetAddress getHostAddress(URL u) { 44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (u.hostAddress != null) 44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return u.hostAddress; 44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String host = u.getHost(); 45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host == null || host.equals("")) { 45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski u.hostAddress = InetAddress.getByName(host); 45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (UnknownHostException ex) { 45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (SecurityException se) { 45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return u.hostAddress; 46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compares the host components of two URLs. 46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u1 the URL of the first host to compare 46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u2 the URL of the second host to compare 46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if and only if they 46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * are equal, <tt>false</tt> otherwise. 47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.3 47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected boolean hostsEqual(URL u1, URL u2) { 473b93dbaedd71dae5c1e4fb2faba863acbde1080c2Narayan Kamath // Android changed: Don't compare the InetAddresses of the hosts. 47406fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak if (u1.getHost() != null && u2.getHost() != null) 47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return u1.getHost().equalsIgnoreCase(u2.getHost()); 47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else 47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return u1.getHost() == null && u2.getHost() == null; 47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Converts a <code>URL</code> of a specific protocol to a 48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>String</code>. 48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u the URL. 48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a string representation of the <code>URL</code> argument. 48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected String toExternalForm(URL u) { 488f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski return toExternalForm(u, false); 489f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski } 49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 491f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski String toExternalForm(URL u, boolean escapeIllegalCharacters) { 49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // pre-compute length of StringBuffer 49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int len = u.getProtocol().length() + 1; 49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (u.getAuthority() != null && u.getAuthority().length() > 0) 49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski len += 2 + u.getAuthority().length(); 49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (u.getPath() != null) { 49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski len += u.getPath().length(); 49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (u.getQuery() != null) { 50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski len += 1 + u.getQuery().length(); 50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (u.getRef() != null) 50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski len += 1 + u.getRef().length(); 50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 505f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski StringBuilder result = new StringBuilder(len); 50651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski result.append(u.getProtocol()); 50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski result.append(":"); 50806fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak if (u.getAuthority() != null) {// ANDROID: && u.getAuthority().length() > 0) { 50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski result.append("//"); 510f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski if (escapeIllegalCharacters) { 51106fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak URI.AUTHORITY_ENCODER.appendPartiallyEncoded(result, u.getAuthority()); 512f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski } else { 51306fc5c380e77f61adcf02305c5bbea9eac129583Przemyslaw Szczepaniak result.append(u.getAuthority()); 514f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski } 51551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 516f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski String fileAndQuery = u.getFile(); 517f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski if (fileAndQuery != null) { 518f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski if (escapeIllegalCharacters) { 519f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski URI.FILE_AND_QUERY_ENCODER.appendPartiallyEncoded(result, fileAndQuery); 520f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski } else { 521f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski result.append(fileAndQuery); 522f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski } 52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (u.getRef() != null) { 52551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski result.append("#"); 526f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski if (escapeIllegalCharacters) { 527f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski URI.ALL_LEGAL_ENCODER.appendPartiallyEncoded(result, u.getRef()); 528f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski } else { 529f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski result.append(u.getRef()); 530f7ab2bc37debba91864bfec6572a3e7bbe994c58Piotr Jastrzebski } 53151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return result.toString(); 53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Sets the fields of the <code>URL</code> argument to the indicated values. 53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Only classes derived from URLStreamHandler are supposed to be able 53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to call the set method on a URL. 53951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u the URL to modify. 54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param protocol the protocol name. 54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param host the remote host value for the URL. 54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param port the port on the remote machine. 54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param authority the authority part for the URL. 54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param userInfo the userInfo part of the URL. 54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param path the path component of the URL. 54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param query the query part for the URL. 54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param ref the reference. 54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if the protocol handler of the URL is 55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * different from this one 55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.URL#set(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String) 55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.3 55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 55451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void setURL(URL u, String protocol, String host, int port, 55551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String authority, String userInfo, String path, 55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String query, String ref) { 55751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (this != u.handler) { 55851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new SecurityException("handler for url different from " + 55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "this handler"); 56051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 56151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // ensure that no one can reset the protocol on a given URL. 56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski u.set(u.getProtocol(), host, port, authority, userInfo, path, query, ref); 56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Sets the fields of the <code>URL</code> argument to the indicated values. 56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Only classes derived from URLStreamHandler are supposed to be able 56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to call the set method on a URL. 56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param u the URL to modify. 57151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param protocol the protocol name. This value is ignored since 1.2. 57251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param host the remote host value for the URL. 57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param port the port on the remote machine. 57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param file the file. 57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param ref the reference. 57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception SecurityException if the protocol handler of the URL is 57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * different from this one 57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @deprecated Use setURL(URL, String, String, int, String, String, String, 57951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * String); 58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Deprecated 58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void setURL(URL u, String protocol, String host, int port, 58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String file, String ref) { 58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Only old URL handlers call this, so assume that the host 58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * field might contain "user:passwd@host". Fix as necessary. 58751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String authority = null; 58951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String userInfo = null; 59051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (host != null && host.length() != 0) { 59151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski authority = (port == -1) ? host : host + ":" + port; 59251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int at = host.lastIndexOf('@'); 59351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (at != -1) { 59451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski userInfo = host.substring(0, at); 59551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski host = host.substring(at+1); 59651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 59751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 59851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 59951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 60051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Assume file might contain query part. Fix as necessary. 60151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 60251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String path = null; 60351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String query = null; 60451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (file != null) { 60551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int q = file.lastIndexOf('?'); 60651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (q != -1) { 60751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski query = file.substring(q+1); 60851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = file.substring(0, q); 60951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else 61051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski path = file; 61151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 61251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski setURL(u, protocol, host, port, authority, userInfo, path, query, ref); 61351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 61451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 615