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