Class HttpURI

java.lang.Object
org.eclipse.jetty.http.HttpURI

public class HttpURI extends Object
Http URI. Parse an HTTP URI from a string or byte array. Given a URI http://user@host:port/path;param1/%2e/info;param2?query#fragment this class will split it into the following optional elements:

The path part of the URI is provided in both raw form (getPath()) and decoded form (getDecodedPath()), which has: path parameters removed, percent encoded characters expanded and relative segments resolved. This approach is somewhat contrary to RFC3986 which no longer defines path parameters (removed after RFC2396) and specifies that relative segment normalization should take place before percent encoded character expansion. A literal interpretation of the RFC can result in URI paths with ambiguities when viewed as strings. For example, a URI of /foo%2f..%2fbar is technically a single segment of "/foo/../bar", but could easily be misinterpreted as 3 segments resolving to "/bar" by a file system.

Thus this class avoid and/or detects such ambiguities. Furthermore, by decoding characters and removing parameters before relative path normalization, ambiguous paths will be resolved in such a way to be non-standard-but-non-ambiguous to down stream interpretation of the decoded path string. The violations are recorded and available by API such as hasAmbiguousSegment() so that requests containing them may be rejected in case the non-standard-but-non-ambiguous interpretations are not satisfactory for a given compliance configuration.

Implementations that wish to process ambiguous URI paths must configure the compliance modes to accept them and then perform their own decoding of getPath().

If there are multiple path parameters, only the last one is returned by getParam().

  • Field Details

    • __ambiguousSegments

      private static final Trie<Boolean> __ambiguousSegments
    • _scheme

      private String _scheme
    • _user

      private String _user
    • _host

      private String _host
    • _port

      private int _port
    • _path

      private String _path
    • _param

      private String _param
    • _query

      private String _query
    • _fragment

      private String _fragment
    • _uri

      private String _uri
    • _decodedPath

      private String _decodedPath
    • _violations

      private final EnumSet<HttpURI.Violation> _violations
    • _emptySegment

      private boolean _emptySegment
  • Constructor Details

  • Method Details

    • createHttpURI

      public static HttpURI createHttpURI(String scheme, String host, int port, String path, String param, String query, String fragment)
      Construct a normalized URI. Port is not set if it is the default port.
      Parameters:
      scheme - the URI scheme
      host - the URI hose
      port - the URI port
      path - the URI path
      param - the URI param
      query - the URI query
      fragment - the URI fragment
      Returns:
      the normalized URI
    • clear

      public void clear()
    • parse

      public void parse(String uri)
    • parseRequestTarget

      public void parseRequestTarget(String method, String uri)
      Parse according to https://tools.ietf.org/html/rfc7230#section-5.3
      Parameters:
      method - the request method
      uri - the request uri
    • parseConnect

      @Deprecated public void parseConnect(String uri)
      Deprecated.
    • parse

      public void parse(String uri, int offset, int length)
    • parse

      private void parse(HttpURI.State state, String uri, int offset, int end)
    • checkSegment

      private void checkSegment(String uri, int segment, int end, boolean param)
      Check for ambiguous path segments. An ambiguous path segment is one that is perhaps technically legal, but is considered undesirable to handle due to possible ambiguity. Examples include segments like '..;', '%2e', '%2e%2e' etc.
      Parameters:
      uri - The URI string
      segment - The inclusive starting index of the segment (excluding any '/')
      end - The exclusive end index of the segment
    • hasAmbiguousSegment

      public boolean hasAmbiguousSegment()
      Returns:
      True if the URI has a possibly ambiguous segment like '..;' or '%2e%2e'
    • hasAmbiguousEmptySegment

      public boolean hasAmbiguousEmptySegment()
      Returns:
      True if the URI empty segment that is ambiguous like '//' or '/;param/'.
    • hasAmbiguousSeparator

      public boolean hasAmbiguousSeparator()
      Returns:
      True if the URI has a possibly ambiguous separator of %2f
    • hasAmbiguousParameter

      public boolean hasAmbiguousParameter()
      Returns:
      True if the URI has a possibly ambiguous path parameter like '..;'
    • hasAmbiguousEncoding

      public boolean hasAmbiguousEncoding()
      Returns:
      True if the URI has an encoded '%' character.
    • isAmbiguous

      public boolean isAmbiguous()
      Returns:
      True if the URI has either an hasAmbiguousSegment() or hasAmbiguousEmptySegment() or hasAmbiguousSeparator() or hasAmbiguousParameter()
    • hasViolations

      public boolean hasViolations()
      Returns:
      True if the URI has any Violations.
    • hasViolation

      boolean hasViolation(HttpURI.Violation violation)
    • hasUtf16Encoding

      public boolean hasUtf16Encoding()
      Returns:
      True if the URI encodes UTF-16 characters with '%u'.
    • getScheme

      public String getScheme()
    • getHost

      public String getHost()
    • getPort

      public int getPort()
    • getPath

      public String getPath()
      The parsed Path.
      Returns:
      the path as parsed on valid URI. null for invalid URI.
    • getDecodedPath

      public String getDecodedPath()
      Returns:
      The decoded canonical path.
      See Also:
    • getParam

      public String getParam()
      Get a URI path parameter. Multiple and in segment parameters are ignored and only the last trailing parameter is returned.
      Returns:
      The last path parameter or null
    • setParam

      public void setParam(String param)
    • getQuery

      public String getQuery()
    • hasQuery

      public boolean hasQuery()
    • getFragment

      public String getFragment()
    • decodeQueryTo

      public void decodeQueryTo(MultiMap<String> parameters)
    • decodeQueryTo

      public void decodeQueryTo(MultiMap<String> parameters, String encoding) throws UnsupportedEncodingException
      Throws:
      UnsupportedEncodingException
    • decodeQueryTo

      public void decodeQueryTo(MultiMap<String> parameters, Charset encoding) throws UnsupportedEncodingException
      Throws:
      UnsupportedEncodingException
    • isAbsolute

      public boolean isAbsolute()
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • equals

      public boolean equals(Object o)
      Overrides:
      equals in class Object
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • setScheme

      public void setScheme(String scheme)
    • setAuthority

      public void setAuthority(String host, int port)
      Parameters:
      host - the host
      port - the port
    • isPathValidForAuthority

      private boolean isPathValidForAuthority(String path)
    • setPath

      public void setPath(String path)
      Parameters:
      path - the path
    • setPathQuery

      public void setPathQuery(String pathQuery)
    • hasAuthority

      private boolean hasAuthority()
    • setQuery

      public void setQuery(String query)
    • toURI

      public URI toURI() throws URISyntaxException
      Throws:
      URISyntaxException
    • getPathQuery

      public String getPathQuery()
    • getAuthority

      public String getAuthority()
    • getUser

      public String getUser()