Parse standard absolute URL paths
This commit is contained in:
@@ -16,6 +16,8 @@ Parses a URI into its component maps.
|
|||||||
|
|
||||||
`return.parts` contains the parsed URI fields. `return.query` contains query parameters decoded with the same rules as `parse_query()`.
|
`return.parts` contains the parsed URI fields. `return.query` contains query parameters decoded with the same rules as `parse_query()`.
|
||||||
|
|
||||||
|
For absolute URLs, `parts` exposes `scheme`, `host`, optional `port`, `path`, raw `query`, and `fragment`. The normalized `path` does not include its leading slash.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ RENDER(Request& context)
|
|||||||
String decoded = uri_decode(encoded);
|
String decoded = uri_decode(encoded);
|
||||||
String malformed_percent = uri_decode("% %A %GG ok%20done");
|
String malformed_percent = uri_decode("% %A %GG ok%20done");
|
||||||
URI empty_uri = parse_uri("");
|
URI empty_uri = parse_uri("");
|
||||||
|
URI full_uri = parse_uri("https://example.test/docs/page?name=Ada#part");
|
||||||
|
URI port_uri = parse_uri("https://example.test:8443/status");
|
||||||
String generated_session = session_id_create();
|
String generated_session = session_id_create();
|
||||||
String csrf = "";
|
String csrf = "";
|
||||||
String csrf_rotated = "";
|
String csrf_rotated = "";
|
||||||
@@ -60,6 +62,8 @@ RENDER(Request& context)
|
|||||||
check("uri_encode() / uri_decode()", decoded == uri_input, encoded + " => " + decoded);
|
check("uri_encode() / uri_decode()", decoded == uri_input, encoded + " => " + decoded);
|
||||||
check("uri_decode() malformed percent literals", malformed_percent == "% %A %GG ok done", malformed_percent);
|
check("uri_decode() malformed percent literals", malformed_percent == "% %A %GG ok done", malformed_percent);
|
||||||
check("parse_uri() empty input", empty_uri.parts["raw"] == "", var_dump(empty_uri));
|
check("parse_uri() empty input", empty_uri.parts["raw"] == "", var_dump(empty_uri));
|
||||||
|
check("parse_uri() standard URL", full_uri.parts["error"] == "" && full_uri.parts["scheme"] == "https" && full_uri.parts["host"] == "example.test" && full_uri.parts["path"] == "docs/page" && full_uri.query["name"] == "Ada" && full_uri.parts["fragment"] == "part", var_dump(full_uri));
|
||||||
|
check("parse_uri() URL with port", port_uri.parts["error"] == "" && port_uri.parts["host"] == "example.test" && port_uri.parts["port"] == "8443" && port_uri.parts["path"] == "status", var_dump(port_uri));
|
||||||
check("parse_query()", query["alpha"] == "1" && query["beta"] == "two words" && query["token"] == "a=b" && query["keyless"] == "" && query["empty"] == "" && query["trailing"] == "ok" && query.count("") == 0, query_dump);
|
check("parse_query()", query["alpha"] == "1" && query["beta"] == "two words" && query["token"] == "a=b" && query["keyless"] == "" && query["empty"] == "" && query["trailing"] == "ok" && query.count("") == 0, query_dump);
|
||||||
StringMap encoded_query_map;
|
StringMap encoded_query_map;
|
||||||
encoded_query_map["alpha"] = "one two";
|
encoded_query_map["alpha"] = "one two";
|
||||||
|
|||||||
@@ -574,7 +574,6 @@ URI parse_uri(String uri_String)
|
|||||||
|
|
||||||
u8 state = 0;
|
u8 state = 0;
|
||||||
String current = "";
|
String current = "";
|
||||||
char expect = 0;
|
|
||||||
|
|
||||||
result.parts["raw"] = uri_String;
|
result.parts["raw"] = uri_String;
|
||||||
|
|
||||||
@@ -594,15 +593,6 @@ URI parse_uri(String uri_String)
|
|||||||
{
|
{
|
||||||
bool append_it = true;
|
bool append_it = true;
|
||||||
|
|
||||||
if(expect && expect != c)
|
|
||||||
{
|
|
||||||
result.parts["error"] = String("\'") + c + String("\' expected");
|
|
||||||
result.parts["error_parsing"] = current;
|
|
||||||
result.parts["error_part"] = part_names[state];
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
expect = 0;
|
|
||||||
|
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
case(0): // scheme
|
case(0): // scheme
|
||||||
@@ -626,7 +616,6 @@ URI parse_uri(String uri_String)
|
|||||||
append_it = false;
|
append_it = false;
|
||||||
current = "";
|
current = "";
|
||||||
state = 3;
|
state = 3;
|
||||||
expect = '/';
|
|
||||||
}
|
}
|
||||||
else if(c == ':')
|
else if(c == ':')
|
||||||
{
|
{
|
||||||
@@ -643,7 +632,6 @@ URI parse_uri(String uri_String)
|
|||||||
append_it = false;
|
append_it = false;
|
||||||
current = "";
|
current = "";
|
||||||
state = 3;
|
state = 3;
|
||||||
expect = '/';
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case(3): // path
|
case(3): // path
|
||||||
|
|||||||
Reference in New Issue
Block a user