Class HttpURI
- java.lang.Object
-
- org.eclipse.jetty.http.HttpURI
-
public class HttpURI extends java.lang.Object
Http URI. Parse an HTTP URI from a string or byte array. Given a URIhttp://user@host:port/path;param1/%2e/info;param2?query#fragment
this class will split it into the following optional elements:getScheme()
- http:getAuthority()
- //name@host:portgetHost()
- hostgetPort()
- portgetPath()
- /path;param1/%2e/info;param2getDecodedPath()
- /path/infogetParam()
- param2getQuery()
- querygetFragment()
- fragment
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 Summary
Constructors Constructor Description HttpURI()
HttpURI(java.lang.String uri)
HttpURI(java.lang.String scheme, java.lang.String host, int port, java.lang.String pathQuery)
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(java.net.URI uri)
HttpURI(HttpURI uri)
HttpURI(HttpURI schemeHostPort, HttpURI uri)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description void
clear()
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.void
decodeQueryTo(MultiMap<java.lang.String> parameters)
void
decodeQueryTo(MultiMap<java.lang.String> parameters, java.lang.String encoding)
void
decodeQueryTo(MultiMap<java.lang.String> parameters, java.nio.charset.Charset encoding)
boolean
equals(java.lang.Object o)
java.lang.String
getAuthority()
java.lang.String
getDecodedPath()
java.lang.String
getFragment()
java.lang.String
getHost()
java.lang.String
getParam()
Get a URI path parameter.java.lang.String
getPath()
The parsed Path.java.lang.String
getPathQuery()
int
getPort()
java.lang.String
getQuery()
java.lang.String
getScheme()
java.lang.String
getUser()
boolean
hasAmbiguousEmptySegment()
boolean
hasAmbiguousEncoding()
boolean
hasAmbiguousParameter()
boolean
hasAmbiguousSegment()
boolean
hasAmbiguousSeparator()
int
hashCode()
boolean
hasQuery()
boolean
hasUtf16Encoding()
boolean
hasViolations()
boolean
isAbsolute()
boolean
isAmbiguous()
void
parse(java.lang.String uri)
void
parse(java.lang.String uri, int offset, int length)
void
parseConnect(java.lang.String uri)
Deprecated.void
parseRequestTarget(java.lang.String method, java.lang.String uri)
Parse according to https://tools.ietf.org/html/rfc7230#section-5.3void
setAuthority(java.lang.String host, int port)
void
setParam(java.lang.String param)
void
setPath(java.lang.String path)
void
setPathQuery(java.lang.String pathQuery)
void
setQuery(java.lang.String query)
void
setScheme(java.lang.String scheme)
java.lang.String
toString()
java.net.URI
toURI()
-
-
-
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 schemehost
- the URI hoseport
- the URI portpath
- the URI pathparam
- the URI paramquery
- the URI queryfragment
- 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 methoduri
- 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.
-
isAmbiguous
public boolean isAmbiguous()
- Returns:
- True if the URI has either an
hasAmbiguousSegment()
orhasAmbiguousEmptySegment()
orhasAmbiguousSeparator()
orhasAmbiguousParameter()
-
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.
-
getDecodedPath
public java.lang.String getDecodedPath()
- Returns:
- The decoded canonical path.
- See Also:
URIUtil.canonicalPath(String)
-
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 classjava.lang.Object
-
equals
public boolean equals(java.lang.Object o)
- Overrides:
equals
in classjava.lang.Object
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
setScheme
public void setScheme(java.lang.String scheme)
-
setAuthority
public void setAuthority(java.lang.String host, int port)
- Parameters:
host
- the hostport
- 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()
-
-