diff --git a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java index 5ff9a0baaf11..0133bd052170 100644 --- a/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java +++ b/jetty-core/jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java @@ -158,60 +158,133 @@ static Immutable from(String scheme, String host, int port, String path, String return new Immutable(scheme, host, port, path, query, fragment, false); } + /** + * @return An immutable copy of this HttpURI. + */ Immutable asImmutable(); + /** + * @return The URI as a string. + */ String asString(); + /** + * @return The authority component of the URI in the form {@code host:port}, + * or just {@code host} if the port is not set, or {@code null} if no host is set. + */ String getAuthority(); + /** + * @return The decoded path with percent-encoded characters decoded, or {@code null} if no path is set. + * @see #getCanonicalPath() + */ String getDecodedPath(); + /** + * @return The canonical path with path parameters removed and percent-encoded characters decoded, + * or {@code null} if no path is set. + * @see #getDecodedPath() + * @see #getPath() + */ String getCanonicalPath(); + /** + * @return The fragment component of the URI (after the {@code #} character), or {@code null} if not set. + */ String getFragment(); + /** + * @return The host component of the URI, or {@code null} if not set. + */ String getHost(); /** - * Get a URI path parameter. Only parameters from the last segment are returned. - * @return The last path parameter or null + *

Get a URI path parameter.

+ *

Path parameters were defined in + * RFC 2068 and appear + * after a semicolon in the path, such as {@code /path;param}. This is distinct from + * query parameters which appear after the {@code ?} character.

+ * @return The last path parameter, or {@code null} if no path parameter is present. + * If there are multiple path parameters, only the last one is returned. + * @see #getQuery() */ String getParam(); + /** + * @return The raw, undecoded, path component of the URI including path parameters, or {@code null} if not set. + * @see #getCanonicalPath() + * @see #getDecodedPath() + */ String getPath(); + /** + * @return The raw, undecoded, path and query components combined as {@code path?query}, + * or just the path if no query is present, or {@code null} if no path is set. + */ String getPathQuery(); + /** + * @return The port number of the URI, or {@code -1} if not set. + */ int getPort(); + /** + * @return The query string component of the URI (after the {@code ?} character + * but before any {@code #} fragment), or {@code null} if not set. + * @see #getParam() + */ String getQuery(); + /** + * @return The URI scheme such as {@code http} or {@code https}, or {@code null} if not set. + */ String getScheme(); + /** + * @return The user info component of the URI authority (before the {@code @} character), + * or {@code null} if not set. + */ String getUser(); + /** + * @return {@code true} if the URI has an authority component. + */ boolean hasAuthority(); + /** + * @return {@code true} if the URI has a scheme component. + */ boolean isAbsolute(); /** - * @return True if the URI has any ambiguous {@link Violation}s. + *

Checks if the URI contains any ambiguous path violations that could be + * interpreted differently by different URI parsers.

+ * @return {@code true} if the URI has any ambiguous {@link Violation}s. + * @see #hasViolations() + * @see UriCompliance#isAmbiguous(Set) */ boolean isAmbiguous(); /** - * @return True if the URI has any {@link Violation}s. + *

Checks if the URI has any compliance violations against the URI specification + * or best practices.

+ * @return {@code true} if the URI has any {@link Violation}s. + * @see #getViolations() + * @see #isAmbiguous() */ boolean hasViolations(); /** - * @param violation the violation to check. - * @return true if the URI has the passed violation. + * @param violation The violation to check. + * @return {@code true} if the URI has the specified violation. + * @see #getViolations() */ boolean hasViolation(Violation violation); /** - * @return Set of violations in the URI. + * @return The set of {@link Violation}s detected in the URI, or an empty set if none. + * @see #hasViolations() + * @see #hasViolation(Violation) */ Collection getViolations(); @@ -804,6 +877,10 @@ private boolean isPathValidForAuthority(String path) return path.startsWith("/"); } + /** + * Clears all URI components, resetting this mutable to an empty state. + * @return this mutable for chaining. + */ public Mutable clear() { _scheme = null; @@ -822,6 +899,11 @@ public Mutable clear() return this; } + /** + * Sets the path from a decoded (non-percent-encoded) string. + * @param path The decoded path to set. + * @return this mutable for chaining. + */ public Mutable decodedPath(String path) { _uri = null; @@ -840,6 +922,10 @@ public boolean equals(Object o) return asString().equals(((HttpURI)o).asString()); } + /** + * @param fragment The fragment to set. + * @return this mutable for chaining. + */ public Mutable fragment(String fragment) { _fragment = fragment; @@ -935,6 +1021,11 @@ public int hashCode() return asString().hashCode(); } + /** + * @param host The host to set. + * @return this mutable for chaining. + * @throws IllegalArgumentException if a relative path is set with an authority. + */ public Mutable host(String host) { if (host != null && !isPathValidForAuthority(_path)) @@ -974,6 +1065,10 @@ public Collection getViolations() return _violations == null ? Collections.emptySet() : Collections.unmodifiableCollection(_violations); } + /** + * Normalizes the URI by removing the default port if it matches the scheme's default port. + * @return this mutable for chaining. + */ public Mutable normalize() { HttpScheme scheme = _scheme == null ? null : HttpScheme.CACHE.get(_scheme); @@ -985,6 +1080,11 @@ public Mutable normalize() return this; } + /** + * Sets the path parameter, appending it to the path after a semicolon. + * @param param The path parameter to set. + * @return this mutable for chaining. + */ public Mutable param(String param) { _param = param; @@ -1035,6 +1135,12 @@ public Mutable path(String path) return this; } + /** + * Sets the path and query from a combined string in the form {@code path?query}. + * @param pathQuery The path and query string to set. + * @return this mutable for chaining. + * @throws IllegalArgumentException if a relative path is set with an authority. + */ public Mutable pathQuery(String pathQuery) { if (hasAuthority() && !isPathValidForAuthority(pathQuery)) @@ -1052,6 +1158,10 @@ public Mutable pathQuery(String pathQuery) return this; } + /** + * @param port The port to set, or {@code -1} to clear the port. + * @return this mutable for chaining. + */ public Mutable port(int port) { _port = (port > 0) ? port : URIUtil.UNDEFINED_PORT; @@ -1059,6 +1169,10 @@ public Mutable port(int port) return this; } + /** + * @param query The query string to set. + * @return this mutable for chaining. + */ public Mutable query(String query) { _query = query; @@ -1066,11 +1180,19 @@ public Mutable query(String query) return this; } + /** + * @param scheme The {@link HttpScheme} to set. + * @return this mutable for chaining. + */ public Mutable scheme(HttpScheme scheme) { return scheme(scheme.asString()); } + /** + * @param scheme The scheme to set, which will be normalized to lower-case. + * @return this mutable for chaining. + */ public Mutable scheme(String scheme) { _scheme = URIUtil.normalizeScheme(scheme); @@ -1084,6 +1206,11 @@ public String toString() return asString(); } + /** + * Sets all URI components from another {@link HttpURI}. + * @param uri The URI to copy components from. + * @return this mutable for chaining. + */ public Mutable uri(HttpURI uri) { _scheme = uri.getScheme(); @@ -1101,6 +1228,11 @@ public Mutable uri(HttpURI uri) return this; } + /** + * Parses and sets all URI components from a string. + * @param uri The URI string to parse. + * @return this mutable for chaining. + */ public Mutable uri(String uri) { clear(); @@ -1109,6 +1241,12 @@ public Mutable uri(String uri) return this; } + /** + * Parses and sets URI components from a string, handling HTTP method-specific parsing. + * @param method The HTTP method, which affects parsing for CONNECT requests. + * @param uri The URI string to parse. + * @return this mutable for chaining. + */ public Mutable uri(String method, String uri) { if (HttpMethod.CONNECT.is(method)) @@ -1129,6 +1267,13 @@ else if (uri.startsWith("/")) return this; } + /** + * Parses and sets all URI components from a substring. + * @param uri The string containing the URI. + * @param offset The offset within the string where the URI starts. + * @param length The length of the URI substring. + * @return this mutable for chaining. + */ public Mutable uri(String uri, int offset, int length) { clear(); @@ -1138,6 +1283,11 @@ public Mutable uri(String uri, int offset, int length) return this; } + /** + * Sets the user info component of the URI authority. + * @param user The user info to set, or {@code null} to clear it. + * @return this mutable for chaining. + */ public Mutable user(String user) { _user = user;