From c1039f5094a208550439f82c9498f989209a7cc8 Mon Sep 17 00:00:00 2001 From: udo Date: Mon, 13 Jul 2026 09:31:45 +0000 Subject: [PATCH] Parse standard absolute URL paths --- site/doc/pages/parse_uri.txt | 2 ++ site/tests/http.uce | 6 +++++- src/lib/uri.cpp | 12 ------------ 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/site/doc/pages/parse_uri.txt b/site/doc/pages/parse_uri.txt index 98d3cb9..737953f 100644 --- a/site/doc/pages/parse_uri.txt +++ b/site/doc/pages/parse_uri.txt @@ -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()`. +For absolute URLs, `parts` exposes `scheme`, `host`, optional `port`, `path`, raw `query`, and `fragment`. The normalized `path` does not include its leading slash. + Example: diff --git a/site/tests/http.uce b/site/tests/http.uce index 7ac3df4..bc23d52 100644 --- a/site/tests/http.uce +++ b/site/tests/http.uce @@ -33,6 +33,8 @@ RENDER(Request& context) String decoded = uri_decode(encoded); String malformed_percent = uri_decode("% %A %GG ok%20done"); 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 csrf = ""; String csrf_rotated = ""; @@ -60,6 +62,8 @@ RENDER(Request& context) 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("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); StringMap encoded_query_map; encoded_query_map["alpha"] = "one two"; @@ -86,4 +90,4 @@ RENDER(Request& context) site_tests_summary(passed, failed, skipped, "This page mutates only response headers and the test cookie/session namespace used by the suite."); site_tests_page_end(); -} \ No newline at end of file +} diff --git a/src/lib/uri.cpp b/src/lib/uri.cpp index 737a1b1..f22aeb7 100644 --- a/src/lib/uri.cpp +++ b/src/lib/uri.cpp @@ -574,7 +574,6 @@ URI parse_uri(String uri_String) u8 state = 0; String current = ""; - char expect = 0; result.parts["raw"] = uri_String; @@ -594,15 +593,6 @@ URI parse_uri(String uri_String) { 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) { case(0): // scheme @@ -626,7 +616,6 @@ URI parse_uri(String uri_String) append_it = false; current = ""; state = 3; - expect = '/'; } else if(c == ':') { @@ -643,7 +632,6 @@ URI parse_uri(String uri_String) append_it = false; current = ""; state = 3; - expect = '/'; } break; case(3): // path