uri.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 1,924 行 · 第 1/5 页

JAVA
1,924
字号
  * @param p_userinfo the URI userinfo (cannot be specified if host  *                   is null)  * @param p_host the hostname, IPv4 address or IPv6 reference for the URI  * @param p_port the URI port (may be -1 for "unspecified"; cannot  *               be specified if host is null)  * @param p_path the URI path - if the path contains '?' or '#',  *               then the query string and/or fragment will be  *               set from the path; however, if the query and  *               fragment are specified both in the path and as  *               separate parameters, an exception is thrown  * @param p_queryString the URI query string (cannot be specified  *                      if path is null)  * @param p_fragment the URI fragment (cannot be specified if path  *                   is null)  *  * @exception MalformedURIException if any of the parameters violates  *                                  syntax rules or semantic rules  */  public URI(String p_scheme, String p_userinfo,             String p_host, int p_port, String p_path,             String p_queryString, String p_fragment)         throws MalformedURIException {    if (p_scheme == null || p_scheme.trim().length() == 0) {      throw new MalformedURIException("Scheme is required!");    }    if (p_host == null) {      if (p_userinfo != null) {        throw new MalformedURIException(             "Userinfo may not be specified if host is not specified!");      }      if (p_port != -1) {        throw new MalformedURIException(             "Port may not be specified if host is not specified!");      }    }    if (p_path != null) {      if (p_path.indexOf('?') != -1 && p_queryString != null) {        throw new MalformedURIException(          "Query string cannot be specified in path and query string!");      }      if (p_path.indexOf('#') != -1 && p_fragment != null) {        throw new MalformedURIException(          "Fragment cannot be specified in both the path and fragment!");      }    }    setScheme(p_scheme);    setHost(p_host);    setPort(p_port);    setUserinfo(p_userinfo);    setPath(p_path);    setQueryString(p_queryString);    setFragment(p_fragment);  } /**  * Initialize all fields of this URI from another URI.  *  * @param p_other the URI to copy (cannot be null)  */  private void initialize(URI p_other) {    m_scheme = p_other.getScheme();    m_userinfo = p_other.getUserinfo();    m_host = p_other.getHost();    m_port = p_other.getPort();    m_regAuthority = p_other.getRegBasedAuthority();    m_path = p_other.getPath();    m_queryString = p_other.getQueryString();    m_fragment = p_other.getFragment();  } /**  * Initializes this URI from a base URI and a URI specification string.  * See RFC 2396 Section 4 and Appendix B for specifications on parsing  * the URI and Section 5 for specifications on resolving relative URIs  * and relative paths.  *  * @param p_base the base URI (may be null if p_uriSpec is an absolute  *               URI)  * @param p_uriSpec the URI spec string which may be an absolute or  *                  relative URI (can only be null/empty if p_base  *                  is not null)  *  * @exception MalformedURIException if p_base is null and p_uriSpec  *                                  is not an absolute URI or if  *                                  p_uriSpec violates syntax rules  */  private void initialize(URI p_base, String p_uriSpec)                         throws MalformedURIException {	      String uriSpec = p_uriSpec;    int uriSpecLen = (uriSpec != null) ? uriSpec.length() : 0;	    if (p_base == null && uriSpecLen == 0) {      throw new MalformedURIException(                  "Cannot initialize URI with empty parameters.");    }    // just make a copy of the base if spec is empty    if (uriSpecLen == 0) {      initialize(p_base);      return;    }    int index = 0;    // Check for scheme, which must be before '/', '?' or '#'. Also handle    // names with DOS drive letters ('D:'), so 1-character schemes are not    // allowed.    int colonIdx = uriSpec.indexOf(':');    if (colonIdx != -1) {        final int searchFrom = colonIdx - 1;        // search backwards starting from character before ':'.        int slashIdx = uriSpec.lastIndexOf('/', searchFrom);        int queryIdx = uriSpec.lastIndexOf('?', searchFrom);        int fragmentIdx = uriSpec.lastIndexOf('#', searchFrom);               if (colonIdx < 2 || slashIdx != -1 ||             queryIdx != -1 || fragmentIdx != -1) {            // A standalone base is a valid URI according to spec            if (colonIdx == 0 || (p_base == null && fragmentIdx != 0)) {                throw new MalformedURIException("No scheme found in URI.");            }        }        else {            initializeScheme(uriSpec);            index = m_scheme.length()+1;                        // Neither 'scheme:' or 'scheme:#fragment' are valid URIs.            if (colonIdx == uriSpecLen - 1 || uriSpec.charAt(colonIdx+1) == '#') {            	throw new MalformedURIException("Scheme specific part cannot be empty.");	            }        }    }    else if (p_base == null && uriSpec.indexOf('#') != 0) {        throw new MalformedURIException("No scheme found in URI.");        }    // Two slashes means we may have authority, but definitely means we're either    // matching net_path or abs_path. These two productions are ambiguous in that    // every net_path (except those containing an IPv6Reference) is an abs_path.     // RFC 2396 resolves this ambiguity by applying a greedy left most matching rule.     // Try matching net_path first, and if that fails we don't have authority so     // then attempt to match abs_path.    //    // net_path = "//" authority [ abs_path ]    // abs_path = "/"  path_segments    if (((index+1) < uriSpecLen) &&        (uriSpec.charAt(index) == '/' && uriSpec.charAt(index+1) == '/')) {      index += 2;      int startPos = index;      // Authority will be everything up to path, query or fragment      char testChar = '\0';      while (index < uriSpecLen) {        testChar = uriSpec.charAt(index);        if (testChar == '/' || testChar == '?' || testChar == '#') {          break;        }        index++;      }      // Attempt to parse authority. If the section is an empty string      // this is a valid server based authority, so set the host to this      // value.      if (index > startPos) {        // If we didn't find authority we need to back up. Attempt to        // match against abs_path next.        if (!initializeAuthority(uriSpec.substring(startPos, index))) {          index = startPos - 2;        }      }      else {        m_host = "";      }    }    initializePath(uriSpec, index);    // Resolve relative URI to base URI - see RFC 2396 Section 5.2    // In some cases, it might make more sense to throw an exception    // (when scheme is specified is the string spec and the base URI    // is also specified, for example), but we're just following the    // RFC specifications    if (p_base != null) {      // check to see if this is the current doc - RFC 2396 5.2 #2      // note that this is slightly different from the RFC spec in that      // we don't include the check for query string being null      // - this handles cases where the urispec is just a query      // string or a fragment (e.g. "?y" or "#s") -      // see <http://www.ics.uci.edu/~fielding/url/test1.html> which      // identified this as a bug in the RFC      if (m_path.length() == 0 && m_scheme == null &&          m_host == null && m_regAuthority == null) {        m_scheme = p_base.getScheme();        m_userinfo = p_base.getUserinfo();        m_host = p_base.getHost();        m_port = p_base.getPort();        m_regAuthority = p_base.getRegBasedAuthority();        m_path = p_base.getPath();        if (m_queryString == null) {          m_queryString = p_base.getQueryString();        }        return;      }      // check for scheme - RFC 2396 5.2 #3      // if we found a scheme, it means absolute URI, so we're done      if (m_scheme == null) {        m_scheme = p_base.getScheme();      }      else {        return;      }      // check for authority - RFC 2396 5.2 #4      // if we found a host, then we've got a network path, so we're done      if (m_host == null && m_regAuthority == null) {        m_userinfo = p_base.getUserinfo();        m_host = p_base.getHost();        m_port = p_base.getPort();        m_regAuthority = p_base.getRegBasedAuthority();      }      else {        return;      }      // check for absolute path - RFC 2396 5.2 #5      if (m_path.length() > 0 &&          m_path.startsWith("/")) {        return;      }      // if we get to this point, we need to resolve relative path      // RFC 2396 5.2 #6      String path = "";      String basePath = p_base.getPath();      // 6a - get all but the last segment of the base URI path      if (basePath != null && basePath.length() > 0) {        int lastSlash = basePath.lastIndexOf('/');        if (lastSlash != -1) {          path = basePath.substring(0, lastSlash+1);        }      }      else if (m_path.length() > 0) {      	path = "/";      }      // 6b - append the relative URI path      path = path.concat(m_path);      // 6c - remove all "./" where "." is a complete path segment      index = -1;      while ((index = path.indexOf("/./")) != -1) {        path = path.substring(0, index+1).concat(path.substring(index+3));      }      // 6d - remove "." if path ends with "." as a complete path segment      if (path.endsWith("/.")) {        path = path.substring(0, path.length()-1);      }      // 6e - remove all "<segment>/../" where "<segment>" is a complete      // path segment not equal to ".."      index = 1;      int segIndex = -1;      String tempString = null;      while ((index = path.indexOf("/../", index)) > 0) {        tempString = path.substring(0, path.indexOf("/../"));        segIndex = tempString.lastIndexOf('/');        if (segIndex != -1) {          if (!tempString.substring(segIndex).equals("..")) {            path = path.substring(0, segIndex+1).concat(path.substring(index+4));            index = segIndex;          }          else            index += 4;        }        else          index += 4;      }      // 6f - remove ending "<segment>/.." where "<segment>" is a      // complete path segment      if (path.endsWith("/..")) {        tempString = path.substring(0, path.length()-3);        segIndex = tempString.lastIndexOf('/');        if (segIndex != -1) {          path = path.substring(0, segIndex+1);        }      }      m_path = path;    }  } /**  * Initialize the scheme for this URI from a URI string spec.  *  * @param p_uriSpec the URI specification (cannot be null)  *  * @exception MalformedURIException if URI does not have a conformant  *                                  scheme  */  private void initializeScheme(String p_uriSpec)                 throws MalformedURIException {    int uriSpecLen = p_uriSpec.length();    int index = 0;    String scheme = null;    char testChar = '\0';    while (index < uriSpecLen) {      testChar = p_uriSpec.charAt(index);      if (testChar == ':' || testChar == '/' ||          testChar == '?' || testChar == '#') {        break;      }      index++;    }    scheme = p_uriSpec.substring(0, index);    if (scheme.length() == 0) {      throw new MalformedURIException("No scheme found in URI.");    }    else {      setScheme(scheme);    }  } /**  * Initialize the authority (either server or registry based)  * for this URI from a URI string spec.  *  * @param p_uriSpec the URI specification (cannot be null)  *   * @return true if the given string matched server or registry  * based authority  */  private boolean initializeAuthority(String p_uriSpec) {        int index = 0;    int start = 0;    int end = p_uriSpec.length();    char testChar = '\0';    String userinfo = null;    // userinfo is everything up to @    if (p_uriSpec.indexOf('@', start) != -1) {      while (index < end) {        testChar = p_uriSpec.charAt(index);        if (testChar == '@') {          break;        }        index++;      }      userinfo = p_uriSpec.substring(start, index);      index++;    }    // host is everything up to last ':', or up to     // and including ']' if followed by ':'.    String host = null;    start = index;    boolean hasPort = false;    if (index < end) {      if (p_uriSpec.charAt(start) == '[') {      	int bracketIndex = p_uriSpec.indexOf(']', start);      	index = (bracketIndex != -1) ? bracketIndex : end;      	if (index+1 < end && p_uriSpec.charAt(index+1) == ':') {      	  ++index;      	  hasPort = true;      	}      	else {      	  index = end;      	}      }      else {      	int colonIndex = p_uriSpec.lastIndexOf(':', end);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?