Sat, 21 Feb 2026 19:36:15 +0100
add util_parse_uri
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2022 Olaf Wintermann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "uri.h" #include "../util/util.h" CX_TEST(test_util_uri_escape_alphanum) { char *str1 = "/test/path/abc/"; char str_enc[512]; CX_TEST_DO { char *test = util_uri_escape(str_enc, str1); CX_TEST_ASSERT(test); CX_TEST_ASSERT(!strcasecmp(test, str1)); } } CX_TEST(test_util_uri_escape_space) { char *str1 = "/test/space in path/"; char *str_enc_expected = "/test/space%20in%20path/"; char str_enc[512]; CX_TEST_DO { char *test = util_uri_escape(str_enc, str1); CX_TEST_ASSERT(test); CX_TEST_ASSERT(!strcasecmp(test, str_enc_expected)); } } CX_TEST(test_util_uri_escape_latin) { char *str1 = "/test/path/öäütestß/"; char *str_enc_expected = "/test/path/%C3%B6%C3%A4%C3%BCtest%C3%9F/"; char *str2 = "€"; char *str2_enc_expected = "%E2%82%AC"; char str_enc[512]; CX_TEST_DO { // test 1 char *test = util_uri_escape(str_enc, str1); CX_TEST_ASSERT(test); CX_TEST_ASSERT(!strcasecmp(test, str_enc_expected)); // test 2 test = util_uri_escape(str_enc, str2); CX_TEST_ASSERT(test); CX_TEST_ASSERT(!strcasecmp(test, str2_enc_expected)); } } CX_TEST(test_util_uri_escape_kanji) { char *str1 = "漢字"; char *str1_enc_expected = "%E6%BC%A2%E5%AD%97"; char *str2 = "/test/エンコーディング/漢字/"; char *str2_enc_expected = "/test/%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/%E6%BC%A2%E5%AD%97/"; char str_enc[512]; CX_TEST_DO { // test 1 char *test = util_uri_escape(str_enc, str1); CX_TEST_ASSERT(test); CX_TEST_ASSERT(!strcasecmp(test, str1_enc_expected)); // test 2 test = util_uri_escape(str_enc, str2); CX_TEST_ASSERT(test); CX_TEST_ASSERT(!strcasecmp(test, str2_enc_expected)); } } 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)); } }