url-parser.c

URL parsing library
git clone git://git.finwo.net/lib/url-parser.c
Log | Files | Refs | README | LICENSE

length-limits.test.c (3723B)


      1 #include "url-parser.h"
      2 #include "test.h"
      3 
      4 void test_scheme_too_long() {
      5     char scheme[72];
      6     memset(scheme, 'a', 65);
      7     scheme[0] = 'h';
      8     scheme[1] = 't';
      9     scheme[2] = 't';
     10     scheme[3] = 'p';
     11     scheme[65] = '\0';
     12     char url[128];
     13     snprintf(url, sizeof(url), "%s://example.com", scheme);
     14     struct parsed_url *purl = parse_url(url);
     15     ASSERT("scheme too long returns NULL", purl == NULL);
     16     ASSERT_STRING_EQUALS("ERR_SCHEME_TOO_LONG", parse_url_last_error());
     17 }
     18 
     19 void test_username_too_long() {
     20     char user[262];
     21     memset(user, 'a', 256);
     22     user[256] = '\0';
     23     char url[320];
     24     snprintf(url, sizeof(url), "http://%s@example.com/", user);
     25     struct parsed_url *purl = parse_url(url);
     26     ASSERT("username too long returns NULL", purl == NULL);
     27     ASSERT_STRING_EQUALS("ERR_USERNAME_TOO_LONG", parse_url_last_error());
     28 }
     29 
     30 void test_password_too_long() {
     31     char pass[262];
     32     memset(pass, 'a', 256);
     33     pass[256] = '\0';
     34     char url[320];
     35     snprintf(url, sizeof(url), "http://user:%s@example.com/", pass);
     36     struct parsed_url *purl = parse_url(url);
     37     ASSERT("password too long returns NULL", purl == NULL);
     38     ASSERT_STRING_EQUALS("ERR_PASSWORD_TOO_LONG", parse_url_last_error());
     39 }
     40 
     41 void test_host_too_long() {
     42     char host[262];
     43     memset(host, 'a', 256);
     44     host[256] = '\0';
     45     char url[320];
     46     snprintf(url, sizeof(url), "http://%s/", host);
     47     struct parsed_url *purl = parse_url(url);
     48     ASSERT("host too long returns NULL", purl == NULL);
     49     ASSERT_STRING_EQUALS("ERR_HOST_TOO_LONG", parse_url_last_error());
     50 }
     51 
     52 void test_port_too_long() {
     53     struct parsed_url *purl = parse_url("http://example.com:123456/");
     54     ASSERT("port too long returns NULL", purl == NULL);
     55     ASSERT_STRING_EQUALS("ERR_PORT_TOO_LONG", parse_url_last_error());
     56 }
     57 
     58 void test_port_invalid_zero() {
     59     struct parsed_url *purl = parse_url("http://example.com:0/");
     60     ASSERT("port zero returns NULL", purl == NULL);
     61     ASSERT_STRING_EQUALS("ERR_PORT_INVALID", parse_url_last_error());
     62 }
     63 
     64 void test_port_invalid_overflow() {
     65     struct parsed_url *purl = parse_url("http://example.com:65536/");
     66     ASSERT("port overflow returns NULL", purl == NULL);
     67     ASSERT_STRING_EQUALS("ERR_PORT_INVALID", parse_url_last_error());
     68 }
     69 
     70 void test_path_too_long() {
     71     char path[4100];
     72     memset(path, 'a', 4097);
     73     path[4097] = '\0';
     74     char url[4200];
     75     snprintf(url, sizeof(url), "http://example.com/%s", path);
     76     struct parsed_url *purl = parse_url(url);
     77     ASSERT("path too long returns NULL", purl == NULL);
     78     ASSERT_STRING_EQUALS("ERR_PATH_TOO_LONG", parse_url_last_error());
     79 }
     80 
     81 void test_query_too_long() {
     82     char query[4100];
     83     memset(query, 'a', 4097);
     84     query[4097] = '\0';
     85     char url[4200];
     86     snprintf(url, sizeof(url), "http://example.com/?%s", query);
     87     struct parsed_url *purl = parse_url(url);
     88     ASSERT("query too long returns NULL", purl == NULL);
     89     ASSERT_STRING_EQUALS("ERR_QUERY_TOO_LONG", parse_url_last_error());
     90 }
     91 
     92 void test_fragment_too_long() {
     93     char frag[4100];
     94     memset(frag, 'a', 4097);
     95     frag[4097] = '\0';
     96     char url[4200];
     97     snprintf(url, sizeof(url), "http://example.com/#%s", frag);
     98     struct parsed_url *purl = parse_url(url);
     99     ASSERT("fragment too long returns NULL", purl == NULL);
    100     ASSERT_STRING_EQUALS("ERR_FRAGMENT_TOO_LONG", parse_url_last_error());
    101 }
    102 
    103 int main() {
    104     RUN(test_scheme_too_long);
    105     RUN(test_username_too_long);
    106     RUN(test_password_too_long);
    107     RUN(test_host_too_long);
    108     RUN(test_port_too_long);
    109     RUN(test_port_invalid_zero);
    110     RUN(test_port_invalid_overflow);
    111     RUN(test_path_too_long);
    112     RUN(test_query_too_long);
    113     RUN(test_fragment_too_long);
    114     return TEST_REPORT();
    115 }