uri.java

来自「JAVA 所有包」· Java 代码 · 共 1,653 行 · 第 1/4 页

JAVA
1,653
字号
      while (index < uriSpecLen)      {        testChar = uriSpec.charAt(index);        if (testChar == '/' || testChar == '?' || testChar == '#')        {          break;        }        index++;      }      // if we found authority, parse it out, otherwise we set the      // host to empty string      if (index > startPos)      {        initializeAuthority(uriSpec.substring(startPos, index));      }      else      {        m_host = "";      }    }    initializePath(uriSpec.substring(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_scheme = p_base.getScheme();        m_userinfo = p_base.getUserinfo();        m_host = p_base.getHost();        m_port = p_base.getPort();        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();      }      // 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_userinfo = p_base.getUserinfo();        m_host = p_base.getHost();        m_port = p_base.getPort();      }      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 = new String();      String basePath = p_base.getPath();      // 6a - get all but the last segment of the base URI path      if (basePath != null)      {        int lastSlash = basePath.lastIndexOf('/');        if (lastSlash != -1)        {          path = basePath.substring(0, lastSlash + 1);        }      }      // 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("/../")) > 0)      {        tempString = path.substring(0, path.indexOf("/../"));        segIndex = tempString.lastIndexOf('/');        if (segIndex != -1)        {          if (!tempString.substring(segIndex++).equals(".."))          {            path = path.substring(0, segIndex).concat(path.substring(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)   *   * @throws 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(Utils.messages.createMessage(MsgKey.ER_NO_SCHEME_INURI, null)); //"No scheme found in URI.");    }    else    {      setScheme(scheme);    }  }  /**   * Initialize the authority (userinfo, host and port) for this   * URI from a URI string spec.   *   * @param p_uriSpec the URI specification (cannot be null)   *   * @throws MalformedURIException if p_uriSpec violates syntax rules   */  private void initializeAuthority(String p_uriSpec)          throws MalformedURIException  {    int index = 0;    int start = 0;    int end = p_uriSpec.length();    char testChar = '\0';    String userinfo = null;    // userinfo is everything up @    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 ':'    String host = null;    start = index;    while (index < end)    {      testChar = p_uriSpec.charAt(index);      if (testChar == ':')      {        break;      }      index++;    }    host = p_uriSpec.substring(start, index);    int port = -1;    if (host.length() > 0)    {      // port      if (testChar == ':')      {        index++;        start = index;        while (index < end)        {          index++;        }        String portStr = p_uriSpec.substring(start, index);        if (portStr.length() > 0)        {          for (int i = 0; i < portStr.length(); i++)          {            if (!isDigit(portStr.charAt(i)))            {              throw new MalformedURIException(                portStr + " is invalid. Port should only contain digits!");            }          }          try          {            port = Integer.parseInt(portStr);          }          catch (NumberFormatException nfe)          {            // can't happen          }        }      }    }    setHost(host);    setPort(port);    setUserinfo(userinfo);  }  /**   * Initialize the path for this URI from a URI string spec.   *   * @param p_uriSpec the URI specification (cannot be null)   *   * @throws MalformedURIException if p_uriSpec violates syntax rules   */  private void initializePath(String p_uriSpec) throws MalformedURIException  {    if (p_uriSpec == null)    {      throw new MalformedURIException(        "Cannot initialize path from null string!");    }    int index = 0;    int start = 0;    int end = p_uriSpec.length();    char testChar = '\0';    // path - everything up to query string or fragment    while (index < end)    {      testChar = p_uriSpec.charAt(index);      if (testChar == '?' || testChar == '#')      {        break;      }      // check for valid escape sequence      if (testChar == '%')      {        if (index + 2 >= end ||!isHex(p_uriSpec.charAt(index + 1))                ||!isHex(p_uriSpec.charAt(index + 2)))        {          throw new MalformedURIException(            Utils.messages.createMessage(MsgKey.ER_PATH_CONTAINS_INVALID_ESCAPE_SEQUENCE, null)); //"Path contains invalid escape sequence!");        }      }      else if (!isReservedCharacter(testChar)               &&!isUnreservedCharacter(testChar))      {        if ('\\' != testChar)          throw new MalformedURIException(Utils.messages.createMessage(MsgKey.ER_PATH_INVALID_CHAR, new Object[]{String.valueOf(testChar)})); //"Path contains invalid character: "                                          //+ testChar);      }      index++;    }    m_path = p_uriSpec.substring(start, index);    // query - starts with ? and up to fragment or end    if (testChar == '?')    {      index++;      start = index;      while (index < end)      {        testChar = p_uriSpec.charAt(index);        if (testChar == '#')        {          break;        }        if (testChar == '%')        {          if (index + 2 >= end ||!isHex(p_uriSpec.charAt(index + 1))                  ||!isHex(p_uriSpec.charAt(index + 2)))          {            throw new MalformedURIException(              "Query string contains invalid escape sequence!");          }        }        else if (!isReservedCharacter(testChar)                 &&!isUnreservedCharacter(testChar))        {          throw new MalformedURIException(            "Query string contains invalid character:" + testChar);        }        index++;      }      m_queryString = p_uriSpec.substring(start, index);    }    // fragment - starts with #    if (testChar == '#')    {      index++;      start = index;      while (index < end)      {        testChar = p_uriSpec.charAt(index);        if (testChar == '%')        {          if (index + 2 >= end ||!isHex(p_uriSpec.charAt(index + 1))                  ||!isHex(p_uriSpec.charAt(index + 2)))          {            throw new MalformedURIException(              "Fragment contains invalid escape sequence!");          }        }

⌨️ 快捷键说明

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