--- a/src/server/test/uri.c Sat Feb 21 14:40:03 2026 +0100 +++ b/src/server/test/uri.c Sat Feb 21 19:36:15 2026 +0100 @@ -106,3 +106,87 @@ } } +CX_TEST(test_util_parse_uri) { + CX_TEST_DO { + WSUri uri; + CX_TEST_ASSERT(util_parse_uri("http://example.com", &uri)); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.host, uri.hostlen), "example.com")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.scheme, uri.schemelen), "http")); + CX_TEST_ASSERT(uri.pathlen == 0); + CX_TEST_ASSERT(uri.scheme_num == WS_URI_HTTP); + CX_TEST_ASSERT(uri.port == 80); + + CX_TEST_ASSERT(util_parse_uri("https://unixwork.de/path/", &uri)); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.host, uri.hostlen), "unixwork.de")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.scheme, uri.schemelen), "https")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.path, uri.pathlen), "/path/")); + CX_TEST_ASSERT(uri.scheme_num == WS_URI_HTTPS); + CX_TEST_ASSERT(uri.port == 443); + + CX_TEST_ASSERT(util_parse_uri("https://code.unixwork.de/", &uri)); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.host, uri.hostlen), "code.unixwork.de")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.scheme, uri.schemelen), "https")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.path, uri.pathlen), "/")); + CX_TEST_ASSERT(uri.scheme_num == WS_URI_HTTPS); + + CX_TEST_ASSERT(util_parse_uri("http://pkg.unixwork.de:8080", &uri)); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.host, uri.hostlen), "pkg.unixwork.de")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.scheme, uri.schemelen), "http")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.path, uri.pathlen), "")); + CX_TEST_ASSERT(uri.port == 8080); + CX_TEST_ASSERT(uri.scheme_num == WS_URI_HTTP); + + CX_TEST_ASSERT(util_parse_uri("https://pkg.unixwork.eu:8443/", &uri)); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.host, uri.hostlen), "pkg.unixwork.eu")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.scheme, uri.schemelen), "https")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.path, uri.pathlen), "/")); + CX_TEST_ASSERT(uri.port == 8443); + CX_TEST_ASSERT(uri.scheme_num == WS_URI_HTTPS); + + CX_TEST_ASSERT(util_parse_uri("http://[::1]", &uri)); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.host, uri.hostlen), "::1")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.scheme, uri.schemelen), "http")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.path, uri.pathlen), "")); + CX_TEST_ASSERT(uri.port == 80); + CX_TEST_ASSERT(uri.scheme_num == WS_URI_HTTP); + + CX_TEST_ASSERT(util_parse_uri("http://[fe80::1ff:fe23:4567:890a]:8081", &uri)); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.host, uri.hostlen), "fe80::1ff:fe23:4567:890a")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.scheme, uri.schemelen), "http")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.path, uri.pathlen), "")); + CX_TEST_ASSERT(uri.port == 8081); + CX_TEST_ASSERT(uri.scheme_num == WS_URI_HTTP); + + CX_TEST_ASSERT(util_parse_uri("http://[::ffff:0.0.0.0]:8082/ipv6/path/", &uri)); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.host, uri.hostlen), "::ffff:0.0.0.0")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.scheme, uri.schemelen), "http")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.path, uri.pathlen), "/ipv6/path/")); + CX_TEST_ASSERT(uri.port == 8082); + CX_TEST_ASSERT(uri.scheme_num == WS_URI_HTTP); + + CX_TEST_ASSERT(util_parse_uri("http://[::ffff:0.0.0.1]/ipv6/without/port/", &uri)); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.host, uri.hostlen), "::ffff:0.0.0.1")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.scheme, uri.schemelen), "http")); + CX_TEST_ASSERT(!cx_strcmp(cx_strn(uri.path, uri.pathlen), "/ipv6/without/port/")); + CX_TEST_ASSERT(uri.port == 80); + CX_TEST_ASSERT(uri.scheme_num == WS_URI_HTTP); + } +} + +CX_TEST(test_util_parse_uri_error) { + CX_TEST_DO { + WSUri uri; + CX_TEST_ASSERT(!util_parse_uri("", &uri)); + CX_TEST_ASSERT(!util_parse_uri("http", &uri)); + CX_TEST_ASSERT(!util_parse_uri("https://", &uri)); + CX_TEST_ASSERT(!util_parse_uri("http://host:invalidport", &uri)); + CX_TEST_ASSERT(!util_parse_uri("http://host:01:02", &uri)); + CX_TEST_ASSERT(!util_parse_uri("http:///", &uri)); + CX_TEST_ASSERT(!util_parse_uri("http://[::1", &uri)); + CX_TEST_ASSERT(!util_parse_uri("http://[::1]test", &uri)); + CX_TEST_ASSERT(!util_parse_uri("http://[:[:1]", &uri)); + CX_TEST_ASSERT(!util_parse_uri("http://[hello-world]", &uri)); + CX_TEST_ASSERT(!util_parse_uri("http://host[]", &uri)); + CX_TEST_ASSERT(!util_parse_uri("http://localhost:9999999", &uri)); + } +}