|
|
|
|
@ -30,7 +30,6 @@ import org.springframework.util.Assert;
@@ -30,7 +30,6 @@ import org.springframework.util.Assert;
|
|
|
|
|
* |
|
|
|
|
* @author Rossen Stoyanchev |
|
|
|
|
* @since 6.2 |
|
|
|
|
* |
|
|
|
|
* @see <a href="https://www.rfc-editor.org/info/rfc3986">RFC 3986</a> |
|
|
|
|
*/ |
|
|
|
|
abstract class RfcUriParser { |
|
|
|
|
@ -78,10 +77,10 @@ abstract class RfcUriParser {
@@ -78,10 +77,10 @@ abstract class RfcUriParser {
|
|
|
|
|
* @param query the query, if present |
|
|
|
|
* @param fragment the fragment, if present |
|
|
|
|
*/ |
|
|
|
|
record UriRecord(@Nullable String scheme, boolean isOpaque, |
|
|
|
|
record UriRecord( |
|
|
|
|
@Nullable String scheme, boolean isOpaque, |
|
|
|
|
@Nullable String user, @Nullable String host, @Nullable String port, |
|
|
|
|
@Nullable String path, @Nullable String query, @Nullable String fragment) { |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -130,6 +129,7 @@ abstract class RfcUriParser {
@@ -130,6 +129,7 @@ abstract class RfcUriParser {
|
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HOST_OR_PATH { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -158,6 +158,7 @@ abstract class RfcUriParser {
@@ -158,6 +158,7 @@ abstract class RfcUriParser {
|
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SCHEME_OR_PATH { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -188,6 +189,7 @@ abstract class RfcUriParser {
@@ -188,6 +189,7 @@ abstract class RfcUriParser {
|
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HOST { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -229,6 +231,7 @@ abstract class RfcUriParser {
@@ -229,6 +231,7 @@ abstract class RfcUriParser {
|
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IPV6 { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -259,6 +262,7 @@ abstract class RfcUriParser {
@@ -259,6 +262,7 @@ abstract class RfcUriParser {
|
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PORT { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -291,6 +295,7 @@ abstract class RfcUriParser {
@@ -291,6 +295,7 @@ abstract class RfcUriParser {
|
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PATH { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -319,6 +324,7 @@ abstract class RfcUriParser {
@@ -319,6 +324,7 @@ abstract class RfcUriParser {
|
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QUERY { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -334,7 +340,9 @@ abstract class RfcUriParser {
@@ -334,7 +340,9 @@ abstract class RfcUriParser {
|
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FRAGMENT { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void handleNext(InternalParser parser, char c, int i) { |
|
|
|
|
} |
|
|
|
|
@ -345,6 +353,7 @@ abstract class RfcUriParser {
@@ -345,6 +353,7 @@ abstract class RfcUriParser {
|
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WILDCARD { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -358,6 +367,7 @@ abstract class RfcUriParser {
@@ -358,6 +367,7 @@ abstract class RfcUriParser {
|
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Method to handle each character from the input string. |
|
|
|
|
* @param parser provides access to parsing state, and helper methods |
|
|
|
|
@ -422,6 +432,7 @@ abstract class RfcUriParser {
@@ -422,6 +432,7 @@ abstract class RfcUriParser {
|
|
|
|
|
this.uri = uri; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check internal state
|
|
|
|
|
|
|
|
|
|
public boolean hasScheme() { |
|
|
|
|
@ -444,6 +455,7 @@ abstract class RfcUriParser {
@@ -444,6 +455,7 @@ abstract class RfcUriParser {
|
|
|
|
|
return (this.index == this.componentIndex); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Top-level parse loop, iterate over chars and delegate to states
|
|
|
|
|
|
|
|
|
|
public UriRecord parse() { |
|
|
|
|
@ -468,6 +480,7 @@ abstract class RfcUriParser {
@@ -468,6 +480,7 @@ abstract class RfcUriParser {
|
|
|
|
|
return this.uri.charAt(this.index); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Transitions and index updates
|
|
|
|
|
|
|
|
|
|
public void advanceTo(State state) { |
|
|
|
|
@ -493,6 +506,7 @@ abstract class RfcUriParser {
@@ -493,6 +506,7 @@ abstract class RfcUriParser {
|
|
|
|
|
this.index = index; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Component capture
|
|
|
|
|
|
|
|
|
|
public InternalParser resolveIfOpaque() { |
|
|
|
|
@ -586,6 +600,7 @@ abstract class RfcUriParser {
@@ -586,6 +600,7 @@ abstract class RfcUriParser {
|
|
|
|
|
return this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Encoding and curly bracket handling
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -636,6 +651,7 @@ abstract class RfcUriParser {
@@ -636,6 +651,7 @@ abstract class RfcUriParser {
|
|
|
|
|
return (this.openCurlyBracketCount > 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public String toString() { |
|
|
|
|
return "[State=" + this.state + ", index=" + this.index + ", componentIndex=" + this.componentIndex + |
|
|
|
|
|