src/server/test/uri.c

Sat, 21 Feb 2026 19:36:15 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 21 Feb 2026 19:36:15 +0100
changeset 693
b26cae13b79a
parent 633
392ec9026b07
permissions
-rw-r--r--

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));
    }
}

mercurial