PathDetails.java
package com.renomad.minum.web;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* Some essential characteristics of the path portion of the start line
*/
public final class PathDetails {
public static final PathDetails empty = new PathDetails("", "", Map.of());
private final String isolatedPath;
private final String rawQueryString;
private final Map<String, String> queryString;
/**
* Basic constructor
* @param isolatedPath the isolated path is found after removing the query string
* @param rawQueryString the raw query is the string after a question mark (if it exists - it's optional)
* if there is no query string, then we leave rawQuery as a null value
* @param queryString the query is a map of the keys -> values found in the query string
*/
public PathDetails (
String isolatedPath,
String rawQueryString,
Map<String, String> queryString
) {
this.isolatedPath = isolatedPath;
this.rawQueryString = rawQueryString;
this.queryString = new HashMap<>(queryString == null ? Map.of() : queryString);
}
/**
* Provides the path by itself, without the query string. For examples,
* here are some request lines with their isolated paths:
* <pre>
* {@code
* request line isolated path
* ------------------- -------------
* POST / HTTP/1.1 ""
* GET /background.png HTTP/1.0 "background.png"
* HEAD /test.html?query=alibaba HTTP/1.1 "test.html"
* OPTIONS /anypage.html HTTP/1.0 "anypage.html"
* }
* </pre>
*/
public String getIsolatedPath() {
return isolatedPath;
}
/**
* Returns the raw query string. For example, in "HEAD /test.html?query=alibaba HTTP/1.1",
* the raw query string is "query=alibaba"
*/
public String getRawQueryString() {
return rawQueryString;
}
/**
* This returns the query string portion of the request line as a map, with
* case-sensitive keys.
*/
public Map<String, String> getQueryString() {
return new HashMap<>(queryString);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PathDetails that)) return false;
return Objects.equals(isolatedPath, that.isolatedPath) && Objects.equals(rawQueryString, that.rawQueryString) && Objects.equals(queryString, that.queryString);
}
@Override
public int hashCode() {
return Objects.hash(isolatedPath, rawQueryString, queryString);
}
@Override
public String toString() {
return "PathDetails{" +
"isolatedPath='" + isolatedPath + '\'' +
", rawQueryString='" + rawQueryString + '\'' +
", queryString=" + queryString +
'}';
}
}