8 static void run_burl_normalize (buffer
*psrc
, buffer
*ptmp
, int flags
, int line
, const char *in
, size_t in_len
, const char *out
, size_t out_len
) {
10 buffer_copy_string_len(psrc
, in
, in_len
);
11 qs
= burl_normalize(psrc
, ptmp
, flags
);
12 if (out_len
== (size_t)-2) {
15 "%s.%d: %s('%s') failed: expected error, got '%s'\n",
16 __FILE__
, line
, __func__
+4, in
, psrc
->ptr
);
19 if (buffer_is_equal_string(psrc
, out
, out_len
)) return;
21 "%s.%d: %s('%s') failed: expected '%s', got '%s'\n",
22 __FILE__
, line
, __func__
+4, in
, out
, psrc
->ptr
);
28 static void test_burl_normalize (void) {
29 buffer
*psrc
= buffer_init();
30 buffer
*ptmp
= buffer_init();
33 flags
= HTTP_PARSEOPT_URL_NORMALIZE_UNRESERVED
;
34 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("no-slash"), CONST_STR_LEN("no-slash"));
35 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/"), CONST_STR_LEN("/"));
36 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc"), CONST_STR_LEN("/abc"));
37 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc/"), CONST_STR_LEN("/abc/"));
38 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc/def"), CONST_STR_LEN("/abc/def"));
39 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?"), CONST_STR_LEN("/abc?"));
40 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d"), CONST_STR_LEN("/abc?d"));
41 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d="), CONST_STR_LEN("/abc?d="));
42 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e"), CONST_STR_LEN("/abc?d=e"));
43 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e&"), CONST_STR_LEN("/abc?d=e&"));
44 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e&f"), CONST_STR_LEN("/abc?d=e&f"));
45 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e&f=g"), CONST_STR_LEN("/abc?d=e&f=g"));
46 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e&f=g#"), CONST_STR_LEN("/abc?d=e&f=g"));
47 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e&f=g#any"), CONST_STR_LEN("/abc?d=e&f=g"));
48 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2F"), CONST_STR_LEN("/%2F"));
49 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2f"), CONST_STR_LEN("/%2F"));
50 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%20"), CONST_STR_LEN("/%20"));
51 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2b"), CONST_STR_LEN("/%2B"));
52 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2B"), CONST_STR_LEN("/%2B"));
53 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%3a"), CONST_STR_LEN("/%3A"));
54 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%3A"), CONST_STR_LEN("/%3A"));
55 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/~test%20ä_"), CONST_STR_LEN("/~test%20%C3%A4_"));
56 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/\375"), "", (size_t)-2);
57 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/\376"), "", (size_t)-2);
58 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/\377"), "", (size_t)-2);
60 flags
= HTTP_PARSEOPT_URL_NORMALIZE_REQUIRED
;
61 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/"), CONST_STR_LEN("/"));
62 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc"), CONST_STR_LEN("/abc"));
63 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc/"), CONST_STR_LEN("/abc/"));
64 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc/def"), CONST_STR_LEN("/abc/def"));
65 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?"), CONST_STR_LEN("/abc?"));
66 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d"), CONST_STR_LEN("/abc?d"));
67 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d="), CONST_STR_LEN("/abc?d="));
68 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e"), CONST_STR_LEN("/abc?d=e"));
69 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e&"), CONST_STR_LEN("/abc?d=e&"));
70 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e&f"), CONST_STR_LEN("/abc?d=e&f"));
71 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e&f=g"), CONST_STR_LEN("/abc?d=e&f=g"));
72 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e&f=g#"), CONST_STR_LEN("/abc?d=e&f=g"));
73 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/abc?d=e&f=g#any"), CONST_STR_LEN("/abc?d=e&f=g"));
74 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2F"), CONST_STR_LEN("/%2F"));
75 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2f"), CONST_STR_LEN("/%2F"));
76 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%20"), CONST_STR_LEN("/%20"));
77 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2b"), CONST_STR_LEN("/+"));
78 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2B"), CONST_STR_LEN("/+"));
79 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%3a"), CONST_STR_LEN("/:"));
80 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%3A"), CONST_STR_LEN("/:"));
81 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2b?x=%2b"), CONST_STR_LEN("/+?x=%2B"));
82 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2B?x=%2B"), CONST_STR_LEN("/+?x=%2B"));
83 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/~test%20ä_"), CONST_STR_LEN("/~test%20%C3%A4_"));
84 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/\375"), "", (size_t)-2);
85 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/\376"), "", (size_t)-2);
86 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/\377"), "", (size_t)-2);
88 flags
|= HTTP_PARSEOPT_URL_NORMALIZE_CTRLS_REJECT
;
89 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/\a"), "", (size_t)-2);
90 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/\t"), "", (size_t)-2);
91 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/\r"), "", (size_t)-2);
92 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/\177"), "", (size_t)-2);
94 #if defined(__WIN32) || defined(__CYGWIN__)
95 flags
|= HTTP_PARSEOPT_URL_NORMALIZE_PATH_BACKSLASH_TRANS
;
96 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a\\b"), CONST_STR_LEN("/a/b"));
99 flags
|= HTTP_PARSEOPT_URL_NORMALIZE_PATH_2F_DECODE
;
100 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/b?c=/"), CONST_STR_LEN("/a/b?c=/"));
101 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/b?c=%2f"), CONST_STR_LEN("/a/b?c=/"));
102 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("%2f?"), CONST_STR_LEN("/?"));
103 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("%2f%2f"), CONST_STR_LEN("//"));
104 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("%2f%2f?"), CONST_STR_LEN("//?"));
105 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/%2f?"), CONST_STR_LEN("//?"));
106 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a%2fb"), CONST_STR_LEN("/a/b"));
107 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a%2Fb"), CONST_STR_LEN("/a/b"));
108 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a%2fb?c=/"), CONST_STR_LEN("/a/b?c=/"));
109 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a%2fb?c=%2f"), CONST_STR_LEN("/a/b?c=/"));
110 flags
&= ~HTTP_PARSEOPT_URL_NORMALIZE_PATH_2F_DECODE
;
112 flags
|= HTTP_PARSEOPT_URL_NORMALIZE_PATH_2F_REJECT
;
113 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a%2fb"), "", (size_t)-2);
114 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a%2Fb"), "", (size_t)-2);
115 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/b?c=%2f"), CONST_STR_LEN("/a/b?c=/"));
116 flags
&= ~HTTP_PARSEOPT_URL_NORMALIZE_PATH_2F_REJECT
;
118 flags
|= HTTP_PARSEOPT_URL_NORMALIZE_PATH_DOTSEG_REMOVE
;
119 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("//"), CONST_STR_LEN("/"));
120 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a//b"), CONST_STR_LEN("/a/b"));
121 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("./a/b"), CONST_STR_LEN("/a/b"));
122 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("../a/b"), CONST_STR_LEN("/a/b"));
123 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/./b"), CONST_STR_LEN("/a/b"));
124 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/../b"), CONST_STR_LEN("/b"));
125 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/b/."), CONST_STR_LEN("/a/b/"));
126 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/b/.."), CONST_STR_LEN("/a/"));
127 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/../b/.."), CONST_STR_LEN("/"));
128 flags
&= ~HTTP_PARSEOPT_URL_NORMALIZE_PATH_DOTSEG_REMOVE
;
130 flags
|= HTTP_PARSEOPT_URL_NORMALIZE_PATH_DOTSEG_REJECT
;
131 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("./a/b"), "", (size_t)-2);
132 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("../a/b"), "", (size_t)-2);
133 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/./b"), "", (size_t)-2);
134 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/../b"), "", (size_t)-2);
135 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/b/."), "", (size_t)-2);
136 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/b/.."), "", (size_t)-2);
137 flags
&= ~HTTP_PARSEOPT_URL_NORMALIZE_PATH_DOTSEG_REJECT
;
139 flags
|= HTTP_PARSEOPT_URL_NORMALIZE_QUERY_20_PLUS
;
140 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/b?c=d+e"), CONST_STR_LEN("/a/b?c=d+e"));
141 run_burl_normalize(psrc
, ptmp
, flags
, __LINE__
, CONST_STR_LEN("/a/b?c=d%20e"), CONST_STR_LEN("/a/b?c=d+e"));
142 flags
&= ~HTTP_PARSEOPT_URL_NORMALIZE_QUERY_20_PLUS
;
149 test_burl_normalize();