Class HttpURI


  • public class HttpURI
    extends java.lang.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().

    • Constructor Detail

      • HttpURI

        public HttpURI()
      • HttpURI

        public HttpURI​(java.lang.String scheme,
                       java.lang.String host,
                       int port,
                       java.lang.String path,
                       java.lang.String param,
                       java.lang.String query,
                       java.lang.String fragment)
      • HttpURI

        public HttpURI​(HttpURI uri)
      • HttpURI

        public HttpURI​(java.lang.String uri)
      • HttpURI

        public HttpURI​(java.net.URI uri)
      • HttpURI

        public HttpURI​(java.lang.String scheme,
                       java.lang.String host,
                       int port,
                       java.lang.String pathQuery)
    • Method Detail

      • createHttpURI

        public static HttpURI createHttpURI​(java.lang.String scheme,
                                            java.lang.String host,
                                            int port,
                                            java.lang.String path,
                                            java.lang.String param,
                                            java.lang.String query,
                                            java.lang.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​(java.lang.String uri)
      • parseRequestTarget

        public void parseRequestTarget​(java.lang.String method,
                                       java.lang.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​(java.lang.String uri)
        Deprecated.
      • parse

        public void parse​(java.lang.String uri,
                          int offset,
                          int length)
      • 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.
      • hasViolations

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

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

        public java.lang.String getScheme()
      • getHost

        public java.lang.String getHost()
      • getPort

        public int getPort()
      • getPath

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

        public java.lang.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​(java.lang.String param)
      • getQuery

        public java.lang.String getQuery()
      • hasQuery

        public boolean hasQuery()
      • getFragment

        public java.lang.String getFragment()
      • decodeQueryTo

        public void decodeQueryTo​(MultiMap<java.lang.String> parameters)
      • decodeQueryTo

        public void decodeQueryTo​(MultiMap<java.lang.String> parameters,
                                  java.lang.String encoding)
                           throws java.io.UnsupportedEncodingException
        Throws:
        java.io.UnsupportedEncodingException
      • decodeQueryTo

        public void decodeQueryTo​(MultiMap<java.lang.String> parameters,
                                  java.nio.charset.Charset encoding)
                           throws java.io.UnsupportedEncodingException
        Throws:
        java.io.UnsupportedEncodingException
      • isAbsolute

        public boolean isAbsolute()
      • toString

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

        public boolean equals​(java.lang.Object o)
        Overrides:
        equals in class java.lang.Object
      • hashCode

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

        public void setScheme​(java.lang.String scheme)
      • setAuthority

        public void setAuthority​(java.lang.String host,
                                 int port)
        Parameters:
        host - the host
        port - the port
      • setPath

        public void setPath​(java.lang.String path)
        Parameters:
        path - the path
      • setPathQuery

        public void setPathQuery​(java.lang.String pathQuery)
      • setQuery

        public void setQuery​(java.lang.String query)
      • toURI

        public java.net.URI toURI()
                           throws java.net.URISyntaxException
        Throws:
        java.net.URISyntaxException
      • getPathQuery

        public java.lang.String getPathQuery()
      • getAuthority

        public java.lang.String getAuthority()
      • getUser

        public java.lang.String getUser()