Annotation of embedaddon/curl/tests/libtest/lib1560.c, revision 1.1.1.1
1.1 misho 1: /***************************************************************************
2: * _ _ ____ _
3: * Project ___| | | | _ \| |
4: * / __| | | | |_) | |
5: * | (__| |_| | _ <| |___
6: * \___|\___/|_| \_\_____|
7: *
8: * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
9: *
10: * This software is licensed as described in the file COPYING, which
11: * you should have received as part of this distribution. The terms
12: * are also available at https://curl.haxx.se/docs/copyright.html.
13: *
14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15: * copies of the Software, and permit persons to whom the Software is
16: * furnished to do so, under the terms of the COPYING file.
17: *
18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19: * KIND, either express or implied.
20: *
21: ***************************************************************************/
22:
23: /*
24: * Note:
25: *
26: * Since the URL parser by default only accepts schemes that *this instance*
27: * of libcurl supports, make sure that the test1560 file lists all the schemes
28: * that this test will assume to be present!
29: */
30:
31: #include "test.h"
32:
33: #include "testutil.h"
34: #include "warnless.h"
35: #include "memdebug.h" /* LAST include file */
36:
37: struct part {
38: CURLUPart part;
39: const char *name;
40: };
41:
42:
43: static int checkparts(CURLU *u, const char *in, const char *wanted,
44: unsigned int getflags)
45: {
46: int i;
47: CURLUcode rc;
48: char buf[256];
49: char *bufp = &buf[0];
50: size_t len = sizeof(buf);
51: struct part parts[] = {
52: {CURLUPART_SCHEME, "scheme"},
53: {CURLUPART_USER, "user"},
54: {CURLUPART_PASSWORD, "password"},
55: {CURLUPART_OPTIONS, "options"},
56: {CURLUPART_HOST, "host"},
57: {CURLUPART_PORT, "port"},
58: {CURLUPART_PATH, "path"},
59: {CURLUPART_QUERY, "query"},
60: {CURLUPART_FRAGMENT, "fragment"},
61: {0, NULL}
62: };
63: memset(buf, 0, sizeof(buf));
64:
65: for(i = 0; parts[i].name; i++) {
66: char *p = NULL;
67: size_t n;
68: rc = curl_url_get(u, parts[i].part, &p, getflags);
69: if(!rc && p) {
70: msnprintf(bufp, len, "%s%s", buf[0]?" | ":"", p);
71: }
72: else
73: msnprintf(bufp, len, "%s[%d]", buf[0]?" | ":"", (int)rc);
74:
75: n = strlen(bufp);
76: bufp += n;
77: len -= n;
78: curl_free(p);
79: }
80: if(strcmp(buf, wanted)) {
81: fprintf(stderr, "in: %s\nwanted: %s\ngot: %s\n", in, wanted, buf);
82: return 1;
83: }
84: return 0;
85: }
86:
87: struct redircase {
88: const char *in;
89: const char *set;
90: const char *out;
91: unsigned int urlflags;
92: unsigned int setflags;
93: CURLUcode ucode;
94: };
95:
96: struct setcase {
97: const char *in;
98: const char *set;
99: const char *out;
100: unsigned int urlflags;
101: unsigned int setflags;
102: CURLUcode ucode; /* for the main URL set */
103: CURLUcode pcode; /* for updating parts */
104: };
105:
106: struct testcase {
107: const char *in;
108: const char *out;
109: unsigned int urlflags;
110: unsigned int getflags;
111: CURLUcode ucode;
112: };
113:
114: struct urltestcase {
115: const char *in;
116: const char *out;
117: unsigned int urlflags; /* pass to curl_url() */
118: unsigned int getflags; /* pass to curl_url_get() */
119: CURLUcode ucode;
120: };
121:
122: struct querycase {
123: const char *in;
124: const char *q;
125: const char *out;
126: unsigned int urlflags; /* pass to curl_url() */
127: unsigned int qflags; /* pass to curl_url_get() */
128: CURLUcode ucode;
129: };
130:
131: static struct testcase get_parts_list[] ={
132: {"user:moo@ftp.example.com/color/#green?no-black",
133: "ftp | user | moo | [13] | ftp.example.com | [15] | /color/ | [16] | "
134: "green?no-black",
135: CURLU_GUESS_SCHEME, 0, CURLUE_OK },
136: {"ftp.user:moo@example.com/color/#green?no-black",
137: "http | ftp.user | moo | [13] | example.com | [15] | /color/ | [16] | "
138: "green?no-black",
139: CURLU_GUESS_SCHEME, 0, CURLUE_OK },
140: #ifdef WIN32
141: {"file:/C:\\programs\\foo",
142: "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
143: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
144: {"file://C:\\programs\\foo",
145: "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
146: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
147: {"file:///C:\\programs\\foo",
148: "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
149: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
150: #endif
151: {"https://example.com/color/#green?no-black",
152: "https | [11] | [12] | [13] | example.com | [15] | /color/ | [16] | "
153: "green?no-black",
154: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
155: {"https://example.com/color/#green#no-black",
156: "https | [11] | [12] | [13] | example.com | [15] | /color/ | [16] | "
157: "green#no-black",
158: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
159: {"https://example.com/color/?green#no-black",
160: "https | [11] | [12] | [13] | example.com | [15] | /color/ | green | "
161: "no-black",
162: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
163: {"https://example.com/#color/?green#no-black",
164: "https | [11] | [12] | [13] | example.com | [15] | / | [16] | "
165: "color/?green#no-black",
166: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
167: {"https://example.#com/color/?green#no-black",
168: "https | [11] | [12] | [13] | example. | [15] | / | [16] | "
169: "com/color/?green#no-black",
170: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
171: {"http://[ab.be:1]/x", "",
172: CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
173: {"http://[ab.be]/x", "",
174: CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
175: /* URL without host name */
176: {"http://a:b@/x", "",
177: CURLU_DEFAULT_SCHEME, 0, CURLUE_NO_HOST},
178: {"boing:80",
179: "https | [11] | [12] | [13] | boing | 80 | / | [16] | [17]",
180: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
181: {"http://[fd00:a41::50]:8080",
182: "http | [11] | [12] | [13] | [fd00:a41::50] | 8080 | / | [16] | [17]",
183: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
184: {"http://[fd00:a41::50]/",
185: "http | [11] | [12] | [13] | [fd00:a41::50] | [15] | / | [16] | [17]",
186: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
187: {"http://[fd00:a41::50]",
188: "http | [11] | [12] | [13] | [fd00:a41::50] | [15] | / | [16] | [17]",
189: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
190: {"https://[::1%252]:1234",
191: "https | [11] | [12] | [13] | [::1] | 1234 | / | [16] | [17]",
192: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
193:
194: /* here's "bad" zone id */
195: {"https://[fe80::20c:29ff:fe9c:409b%eth0]:1234",
196: "https | [11] | [12] | [13] | [fe80::20c:29ff:fe9c:409b] | 1234 "
197: "| / | [16] | [17]",
198: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
199: {"https://127.0.0.1:443",
200: "https | [11] | [12] | [13] | 127.0.0.1 | [15] | / | [16] | [17]",
201: 0, CURLU_NO_DEFAULT_PORT, CURLUE_OK},
202: {"http://%3a:%3a@ex%0ample/%3f+?+%3f+%23#+%23%3f%g7",
203: "http | : | : | [13] | [6] | [15] | /?+ | ? # | +#?%g7",
204: 0, CURLU_URLDECODE, CURLUE_OK},
205: {"http://%3a:%3a@ex%0ample/%3f?%3f%35#%35%3f%g7",
206: "http | %3a | %3a | [13] | ex%0ample | [15] | /%3f | %3f%35 | %35%3f%g7",
207: 0, 0, CURLUE_OK},
208: {"http://HO0_-st%41/",
209: "http | [11] | [12] | [13] | HO0_-st%41 | [15] | / | [16] | [17]",
210: 0, 0, CURLUE_OK},
211: {"file://hello.html",
212: "",
213: 0, 0, CURLUE_MALFORMED_INPUT},
214: {"http://HO0_-st/",
215: "http | [11] | [12] | [13] | HO0_-st | [15] | / | [16] | [17]",
216: 0, 0, CURLUE_OK},
217: {"imap://user:pass;option@server/path",
218: "imap | user | pass | option | server | [15] | /path | [16] | [17]",
219: 0, 0, CURLUE_OK},
220: {"http://user:pass;option@server/path",
221: "http | user | pass;option | [13] | server | [15] | /path | [16] | [17]",
222: 0, 0, CURLUE_OK},
223: {"file:/hello.html",
224: "file | [11] | [12] | [13] | [14] | [15] | /hello.html | [16] | [17]",
225: 0, 0, CURLUE_OK},
226: {"file://127.0.0.1/hello.html",
227: "file | [11] | [12] | [13] | [14] | [15] | /hello.html | [16] | [17]",
228: 0, 0, CURLUE_OK},
229: {"file:////hello.html",
230: "file | [11] | [12] | [13] | [14] | [15] | //hello.html | [16] | [17]",
231: 0, 0, CURLUE_OK},
232: {"file:///hello.html",
233: "file | [11] | [12] | [13] | [14] | [15] | /hello.html | [16] | [17]",
234: 0, 0, CURLUE_OK},
235: {"https://127.0.0.1",
236: "https | [11] | [12] | [13] | 127.0.0.1 | 443 | / | [16] | [17]",
237: 0, CURLU_DEFAULT_PORT, CURLUE_OK},
238: {"https://127.0.0.1",
239: "https | [11] | [12] | [13] | 127.0.0.1 | [15] | / | [16] | [17]",
240: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
241: {"https://[::1]:1234",
242: "https | [11] | [12] | [13] | [::1] | 1234 | / | [16] | [17]",
243: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
244: {"https://127abc.com",
245: "https | [11] | [12] | [13] | 127abc.com | [15] | / | [16] | [17]",
246: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
247: {"https:// example.com?check",
248: "",
249: CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
250: {"https://e x a m p l e.com?check",
251: "",
252: CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
253: {"https://example.com?check",
254: "https | [11] | [12] | [13] | example.com | [15] | / | check | [17]",
255: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
256: {"https://example.com:65536",
257: "",
258: CURLU_DEFAULT_SCHEME, 0, CURLUE_BAD_PORT_NUMBER},
259: {"https://example.com:0#moo",
260: "",
261: CURLU_DEFAULT_SCHEME, 0, CURLUE_BAD_PORT_NUMBER},
262: {"https://example.com:01#moo",
263: "https | [11] | [12] | [13] | example.com | 1 | / | "
264: "[16] | moo",
265: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
266: {"https://example.com:1#moo",
267: "https | [11] | [12] | [13] | example.com | 1 | / | "
268: "[16] | moo",
269: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
270: {"http://example.com#moo",
271: "http | [11] | [12] | [13] | example.com | [15] | / | "
272: "[16] | moo",
273: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
274: {"http://example.com",
275: "http | [11] | [12] | [13] | example.com | [15] | / | "
276: "[16] | [17]",
277: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
278: {"http://example.com/path/html",
279: "http | [11] | [12] | [13] | example.com | [15] | /path/html | "
280: "[16] | [17]",
281: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
282: {"http://example.com/path/html?query=name",
283: "http | [11] | [12] | [13] | example.com | [15] | /path/html | "
284: "query=name | [17]",
285: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
286: {"http://example.com/path/html?query=name#anchor",
287: "http | [11] | [12] | [13] | example.com | [15] | /path/html | "
288: "query=name | anchor",
289: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
290: {"http://example.com:1234/path/html?query=name#anchor",
291: "http | [11] | [12] | [13] | example.com | 1234 | /path/html | "
292: "query=name | anchor",
293: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
294: {"http:///user:password@example.com:1234/path/html?query=name#anchor",
295: "http | user | password | [13] | example.com | 1234 | /path/html | "
296: "query=name | anchor",
297: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
298: {"https://user:password@example.com:1234/path/html?query=name#anchor",
299: "https | user | password | [13] | example.com | 1234 | /path/html | "
300: "query=name | anchor",
301: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
302: {"http://user:password@example.com:1234/path/html?query=name#anchor",
303: "http | user | password | [13] | example.com | 1234 | /path/html | "
304: "query=name | anchor",
305: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
306: {"http:/user:password@example.com:1234/path/html?query=name#anchor",
307: "http | user | password | [13] | example.com | 1234 | /path/html | "
308: "query=name | anchor",
309: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
310: {"http:////user:password@example.com:1234/path/html?query=name#anchor",
311: "",
312: CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
313: {NULL, NULL, 0, 0, CURLUE_OK},
314: };
315:
316: static struct urltestcase get_url_list[] = {
317: /* 40 bytes scheme is the max allowed */
318: {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA://hostname/path",
319: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa://hostname/path",
320: CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
321: /* 41 bytes scheme is not allowed */
322: {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA://hostname/path",
323: "",
324: CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
325: {"https://[fe80::20c:29ff:fe9c:409b%]:1234",
326: "",
327: 0, 0, CURLUE_MALFORMED_INPUT},
328: {"https://[fe80::20c:29ff:fe9c:409b%25]:1234",
329: "https://[fe80::20c:29ff:fe9c:409b%2525]:1234/",
330: 0, 0, CURLUE_OK},
331: {"https://[fe80::20c:29ff:fe9c:409b%eth0]:1234",
332: "https://[fe80::20c:29ff:fe9c:409b%25eth0]:1234/",
333: 0, 0, CURLUE_OK},
334: {"https://[::%25fakeit]/moo",
335: "https://[::%25fakeit]/moo",
336: 0, 0, CURLUE_OK},
337: {"smtp.example.com/path/html",
338: "smtp://smtp.example.com/path/html",
339: CURLU_GUESS_SCHEME, 0, CURLUE_OK},
340: {"https.example.com/path/html",
341: "http://https.example.com/path/html",
342: CURLU_GUESS_SCHEME, 0, CURLUE_OK},
343: {"dict.example.com/path/html",
344: "dict://dict.example.com/path/html",
345: CURLU_GUESS_SCHEME, 0, CURLUE_OK},
346: {"pop3.example.com/path/html",
347: "pop3://pop3.example.com/path/html",
348: CURLU_GUESS_SCHEME, 0, CURLUE_OK},
349: {"ldap.example.com/path/html",
350: "ldap://ldap.example.com/path/html",
351: CURLU_GUESS_SCHEME, 0, CURLUE_OK},
352: {"imap.example.com/path/html",
353: "imap://imap.example.com/path/html",
354: CURLU_GUESS_SCHEME, 0, CURLUE_OK},
355: {"ftp.example.com/path/html",
356: "ftp://ftp.example.com/path/html",
357: CURLU_GUESS_SCHEME, 0, CURLUE_OK},
358: {"example.com/path/html",
359: "http://example.com/path/html",
360: CURLU_GUESS_SCHEME, 0, CURLUE_OK},
361: {"HTTP://test/", "http://test/", 0, 0, CURLUE_OK},
362: {"http://HO0_-st..~./", "http://HO0_-st..~./", 0, 0, CURLUE_OK},
363: {"http:/@example.com: 123/", "", 0, 0, CURLUE_BAD_PORT_NUMBER},
364: {"http:/@example.com:123 /", "", 0, 0, CURLUE_BAD_PORT_NUMBER},
365: {"http:/@example.com:123a/", "", 0, 0, CURLUE_BAD_PORT_NUMBER},
366: {"http://host/file\r", "", 0, 0, CURLUE_MALFORMED_INPUT},
367: {"http://host/file\n\x03", "", 0, 0, CURLUE_MALFORMED_INPUT},
368: {"htt\x02://host/file", "",
369: CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
370: {" http://host/file", "", 0, 0, CURLUE_MALFORMED_INPUT},
371: /* here the password ends at the semicolon and options is 'word' */
372: {"imap://user:pass;word@host/file",
373: "imap://user:pass;word@host/file",
374: 0, 0, CURLUE_OK},
375: /* here the password has the semicolon */
376: {"http://user:pass;word@host/file",
377: "http://user:pass;word@host/file",
378: 0, 0, CURLUE_OK},
379: {"file:///file.txt#moo",
380: "file:///file.txt#moo",
381: 0, 0, CURLUE_OK},
382: {"file:////file.txt",
383: "file:////file.txt",
384: 0, 0, CURLUE_OK},
385: {"file:///file.txt",
386: "file:///file.txt",
387: 0, 0, CURLUE_OK},
388: {"file:./",
389: "file://",
390: 0, 0, CURLUE_MALFORMED_INPUT},
391: {"http://example.com/hello/../here",
392: "http://example.com/hello/../here",
393: CURLU_PATH_AS_IS, 0, CURLUE_OK},
394: {"http://example.com/hello/../here",
395: "http://example.com/here",
396: 0, 0, CURLUE_OK},
397: {"http://example.com:80",
398: "http://example.com/",
399: 0, CURLU_NO_DEFAULT_PORT, CURLUE_OK},
400: {"tp://example.com/path/html",
401: "",
402: 0, 0, CURLUE_UNSUPPORTED_SCHEME},
403: {"http://hello:fool@example.com",
404: "",
405: CURLU_DISALLOW_USER, 0, CURLUE_USER_NOT_ALLOWED},
406: {"http:/@example.com:123",
407: "http://example.com:123/",
408: 0, 0, CURLUE_OK},
409: {"http:/:password@example.com",
410: "http://:password@example.com/",
411: 0, 0, CURLUE_OK},
412: {"http://user@example.com?#",
413: "http://user@example.com/",
414: 0, 0, CURLUE_OK},
415: {"http://user@example.com?",
416: "http://user@example.com/",
417: 0, 0, CURLUE_OK},
418: {"http://user@example.com#anchor",
419: "http://user@example.com/#anchor",
420: 0, 0, CURLUE_OK},
421: {"example.com/path/html",
422: "https://example.com/path/html",
423: CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
424: {"example.com/path/html",
425: "",
426: 0, 0, CURLUE_MALFORMED_INPUT},
427: {"http://user:password@example.com:1234/path/html?query=name#anchor",
428: "http://user:password@example.com:1234/path/html?query=name#anchor",
429: 0, 0, CURLUE_OK},
430: {"http://example.com:1234/path/html?query=name#anchor",
431: "http://example.com:1234/path/html?query=name#anchor",
432: 0, 0, CURLUE_OK},
433: {"http://example.com/path/html?query=name#anchor",
434: "http://example.com/path/html?query=name#anchor",
435: 0, 0, CURLUE_OK},
436: {"http://example.com/path/html?query=name",
437: "http://example.com/path/html?query=name",
438: 0, 0, CURLUE_OK},
439: {"http://example.com/path/html",
440: "http://example.com/path/html",
441: 0, 0, CURLUE_OK},
442: {"tp://example.com/path/html",
443: "tp://example.com/path/html",
444: CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
445: {"custom-scheme://host?expected=test-good",
446: "custom-scheme://host/?expected=test-good",
447: CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
448: {"custom-scheme://?expected=test-bad",
449: "",
450: CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
451: {"custom-scheme://?expected=test-new-good",
452: "custom-scheme:///?expected=test-new-good",
453: CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY, 0, CURLUE_OK},
454: {"custom-scheme://host?expected=test-still-good",
455: "custom-scheme://host/?expected=test-still-good",
456: CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY, 0, CURLUE_OK},
457: {NULL, NULL, 0, 0, 0}
458: };
459:
460: static int checkurl(const char *url, const char *out)
461: {
462: if(strcmp(out, url)) {
463: fprintf(stderr, "Wanted: %s\nGot : %s\n",
464: out, url);
465: return 1;
466: }
467: return 0;
468: }
469:
470: /* !checksrc! disable SPACEBEFORECOMMA 1 */
471: static struct setcase set_parts_list[] = {
472: {"https://example.com/",
473: /* Set a 41 bytes scheme. That's too long so the old scheme remains set. */
474: "scheme=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc,",
475: "https://example.com/",
476: 0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_MALFORMED_INPUT},
477: {"https://example.com/",
478: /* set a 40 bytes scheme */
479: "scheme=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,",
480: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb://example.com/",
481: 0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
482: {"https://[::1%25fake]:1234/",
483: "zoneid=NULL,",
484: "https://[::1]:1234/",
485: 0, 0, CURLUE_OK, CURLUE_OK},
486: {"https://host:1234/",
487: "port=NULL,",
488: "https://host/",
489: 0, 0, CURLUE_OK, CURLUE_OK},
490: {"https://host:1234/",
491: "port=\"\",",
492: "https://host:1234/",
493: 0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
494: {"https://host:1234/",
495: "port=56 78,",
496: "https://host:1234/",
497: 0, 0, CURLUE_OK, CURLUE_MALFORMED_INPUT},
498: {"https://host:1234/",
499: "port=0,",
500: "https://host:1234/",
501: 0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
502: {"https://host:1234/",
503: "port=65535,",
504: "https://host:65535/",
505: 0, 0, CURLUE_OK, CURLUE_OK},
506: {"https://host:1234/",
507: "port=65536,",
508: "https://host:1234/",
509: 0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
510: {"https://host/",
511: "path=%4A%4B%4C,",
512: "https://host/%4a%4b%4c",
513: 0, 0, CURLUE_OK, CURLUE_OK},
514: {"https://host/mooo?q#f",
515: "path=NULL,query=NULL,fragment=NULL,",
516: "https://host/",
517: 0, 0, CURLUE_OK, CURLUE_OK},
518: {"https://user:secret@host/",
519: "user=NULL,password=NULL,",
520: "https://host/",
521: 0, 0, CURLUE_OK, CURLUE_OK},
522: {NULL,
523: "scheme=https,user= @:,host=foobar,",
524: "https://%20%20%20%40%3a@foobar/",
525: 0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
526: {NULL,
527: "scheme=https,host= ,path= ,user= ,password= ,query= ,fragment= ,",
528: "https://%20:%20@%20%20/%20?+#%20",
529: 0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
530: {NULL,
531: "scheme=https,host=foobar,path=/this /path /is /here,",
532: "https://foobar/this%20/path%20/is%20/here",
533: 0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
534: {NULL,
535: "scheme=https,host=foobar,path=\xc3\xa4\xc3\xb6\xc3\xbc,",
536: "https://foobar/%c3%a4%c3%b6%c3%bc",
537: 0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
538: {"imap://user:secret;opt@host/",
539: "options=updated,scheme=imaps,password=p4ssw0rd,",
540: "imaps://user:p4ssw0rd;updated@host/",
541: 0, 0, CURLUE_NO_HOST, CURLUE_OK},
542: {"imap://user:secret;optit@host/",
543: "scheme=https,",
544: "https://user:secret@host/",
545: 0, 0, CURLUE_NO_HOST, CURLUE_OK},
546: {"file:///file#anchor",
547: "scheme=https,host=example,",
548: "https://example/file#anchor",
549: 0, 0, CURLUE_NO_HOST, CURLUE_OK},
550: {NULL, /* start fresh! */
551: "scheme=file,host=127.0.0.1,path=/no,user=anonymous,",
552: "file:///no",
553: 0, 0, CURLUE_OK, CURLUE_OK},
554: {NULL, /* start fresh! */
555: "scheme=ftp,host=127.0.0.1,path=/no,user=anonymous,",
556: "ftp://anonymous@127.0.0.1/no",
557: 0, 0, CURLUE_OK, CURLUE_OK},
558: {NULL, /* start fresh! */
559: "scheme=https,host=example.com,",
560: "https://example.com/",
561: 0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
562: {"http://user:foo@example.com/path?query#frag",
563: "fragment=changed,",
564: "http://user:foo@example.com/path?query#changed",
565: 0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
566: {"http://example.com/",
567: "scheme=foo,", /* not accepted */
568: "http://example.com/",
569: 0, 0, CURLUE_OK, CURLUE_UNSUPPORTED_SCHEME},
570: {"http://example.com/",
571: "scheme=https,path=/hello,fragment=snippet,",
572: "https://example.com/hello#snippet",
573: 0, 0, CURLUE_OK, CURLUE_OK},
574: {"http://example.com:80",
575: "user=foo,port=1922,",
576: "http://foo@example.com:1922/",
577: 0, 0, CURLUE_OK, CURLUE_OK},
578: {"http://example.com:80",
579: "user=foo,password=bar,",
580: "http://foo:bar@example.com:80/",
581: 0, 0, CURLUE_OK, CURLUE_OK},
582: {"http://example.com:80",
583: "user=foo,",
584: "http://foo@example.com:80/",
585: 0, 0, CURLUE_OK, CURLUE_OK},
586: {"http://example.com",
587: "host=www.example.com,",
588: "http://www.example.com/",
589: 0, 0, CURLUE_OK, CURLUE_OK},
590: {"http://example.com:80",
591: "scheme=ftp,",
592: "ftp://example.com:80/",
593: 0, 0, CURLUE_OK, CURLUE_OK},
594: {"custom-scheme://host",
595: "host=\"\",",
596: "custom-scheme://host/",
597: CURLU_NON_SUPPORT_SCHEME, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK,
598: CURLUE_MALFORMED_INPUT},
599: {"custom-scheme://host",
600: "host=\"\",",
601: "custom-scheme:///",
602: CURLU_NON_SUPPORT_SCHEME, CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY,
603: CURLUE_OK, CURLUE_OK},
604:
605: {NULL, NULL, NULL, 0, 0, 0, 0}
606: };
607:
608: static CURLUPart part2id(char *part)
609: {
610: if(!strcmp("url", part))
611: return CURLUPART_URL;
612: if(!strcmp("scheme", part))
613: return CURLUPART_SCHEME;
614: if(!strcmp("user", part))
615: return CURLUPART_USER;
616: if(!strcmp("password", part))
617: return CURLUPART_PASSWORD;
618: if(!strcmp("options", part))
619: return CURLUPART_OPTIONS;
620: if(!strcmp("host", part))
621: return CURLUPART_HOST;
622: if(!strcmp("port", part))
623: return CURLUPART_PORT;
624: if(!strcmp("path", part))
625: return CURLUPART_PATH;
626: if(!strcmp("query", part))
627: return CURLUPART_QUERY;
628: if(!strcmp("fragment", part))
629: return CURLUPART_FRAGMENT;
630: if(!strcmp("zoneid", part))
631: return CURLUPART_ZONEID;
632: return 9999; /* bad input => bad output */
633: }
634:
635: static CURLUcode updateurl(CURLU *u, const char *cmd, unsigned int setflags)
636: {
637: const char *p = cmd;
638: CURLUcode uc;
639:
640: /* make sure the last command ends with a comma too! */
641: while(p) {
642: char *e = strchr(p, ',');
643: if(e) {
644: size_t n = e-p;
645: char buf[80];
646: char part[80];
647: char value[80];
648:
649: memset(part, 0, sizeof(part)); /* Avoid valgrind false positive. */
650: memset(value, 0, sizeof(value)); /* Avoid valgrind false positive. */
651: memcpy(buf, p, n);
652: buf[n] = 0;
653: if(2 == sscanf(buf, "%79[^=]=%79[^,]", part, value)) {
654: CURLUPart what = part2id(part);
655: #if 0
656: /* for debugging this */
657: fprintf(stderr, "%s = %s [%d]\n", part, value, (int)what);
658: #endif
659: if(what > CURLUPART_ZONEID)
660: fprintf(stderr, "UNKNOWN part '%s'\n", part);
661:
662: if(!strcmp("NULL", value))
663: uc = curl_url_set(u, what, NULL, setflags);
664: else if(!strcmp("\"\"", value))
665: uc = curl_url_set(u, what, "", setflags);
666: else
667: uc = curl_url_set(u, what, value, setflags);
668: if(uc)
669: return uc;
670: }
671: p = e + 1;
672: continue;
673: }
674: break;
675: }
676: return CURLUE_OK;
677: }
678:
679: static struct redircase set_url_list[] = {
680: {"file://localhost/path?query#frag",
681: "foo#another",
682: "file:///foo#another",
683: 0, 0, 0},
684: {"http://example.com/path?query#frag",
685: "https://two.example.com/bradnew",
686: "https://two.example.com/bradnew",
687: 0, 0, 0},
688: {"http://example.com/path?query#frag",
689: "../../newpage#foo",
690: "http://example.com/newpage#foo",
691: 0, 0, 0},
692: {"http://user:foo@example.com/path?query#frag",
693: "../../newpage",
694: "http://user:foo@example.com/newpage",
695: 0, 0, 0},
696: {"http://user:foo@example.com/path?query#frag",
697: "../newpage",
698: "http://user:foo@example.com/newpage",
699: 0, 0, 0},
700: {NULL, NULL, NULL, 0, 0, 0}
701: };
702:
703: static int set_url(void)
704: {
705: int i;
706: int error = 0;
707:
708: for(i = 0; set_url_list[i].in && !error; i++) {
709: CURLUcode rc;
710: CURLU *urlp = curl_url();
711: if(!urlp)
712: break;
713: rc = curl_url_set(urlp, CURLUPART_URL, set_url_list[i].in,
714: set_url_list[i].urlflags);
715: if(!rc) {
716: rc = curl_url_set(urlp, CURLUPART_URL, set_url_list[i].set,
717: set_url_list[i].setflags);
718: if(rc) {
719: fprintf(stderr, "%s:%d Set URL %s returned %d\n",
720: __FILE__, __LINE__, set_url_list[i].set,
721: (int)rc);
722: error++;
723: }
724: else {
725: char *url = NULL;
726: rc = curl_url_get(urlp, CURLUPART_URL, &url, 0);
727: if(rc) {
728: fprintf(stderr, "%s:%d Get URL returned %d\n",
729: __FILE__, __LINE__, (int)rc);
730: error++;
731: }
732: else {
733: if(checkurl(url, set_url_list[i].out)) {
734: error++;
735: }
736: }
737: curl_free(url);
738: }
739: }
740: else if(rc != set_url_list[i].ucode) {
741: fprintf(stderr, "Set URL\nin: %s\nreturned %d (expected %d)\n",
742: set_url_list[i].in, (int)rc, set_url_list[i].ucode);
743: error++;
744: }
745: curl_url_cleanup(urlp);
746: }
747: return error;
748: }
749:
750: static int set_parts(void)
751: {
752: int i;
753: int error = 0;
754:
755: for(i = 0; set_parts_list[i].set && !error; i++) {
756: CURLUcode rc;
757: CURLU *urlp = curl_url();
758: if(!urlp) {
759: error++;
760: break;
761: }
762: if(set_parts_list[i].in)
763: rc = curl_url_set(urlp, CURLUPART_URL, set_parts_list[i].in,
764: set_parts_list[i].urlflags);
765: else
766: rc = CURLUE_OK;
767: if(!rc) {
768: char *url = NULL;
769: CURLUcode uc = updateurl(urlp, set_parts_list[i].set,
770: set_parts_list[i].setflags);
771:
772: if(uc != set_parts_list[i].pcode) {
773: fprintf(stderr, "updateurl\nin: %s\nreturned %d (expected %d)\n",
774: set_parts_list[i].set, (int)uc, set_parts_list[i].pcode);
775: error++;
776: }
777:
778: rc = curl_url_get(urlp, CURLUPART_URL, &url, 0);
779:
780: if(rc) {
781: fprintf(stderr, "%s:%d Get URL returned %d\n",
782: __FILE__, __LINE__, (int)rc);
783: error++;
784: }
785: else if(checkurl(url, set_parts_list[i].out)) {
786: error++;
787: }
788: curl_free(url);
789: }
790: else if(rc != set_parts_list[i].ucode) {
791: fprintf(stderr, "Set parts\nin: %s\nreturned %d (expected %d)\n",
792: set_parts_list[i].in, (int)rc, set_parts_list[i].ucode);
793: error++;
794: }
795: curl_url_cleanup(urlp);
796: }
797: return error;
798: }
799:
800: static int get_url(void)
801: {
802: int i;
803: int error = 0;
804: for(i = 0; get_url_list[i].in && !error; i++) {
805: CURLUcode rc;
806: CURLU *urlp = curl_url();
807: if(!urlp) {
808: error++;
809: break;
810: }
811: rc = curl_url_set(urlp, CURLUPART_URL, get_url_list[i].in,
812: get_url_list[i].urlflags);
813: if(!rc) {
814: char *url = NULL;
815: rc = curl_url_get(urlp, CURLUPART_URL, &url, get_url_list[i].getflags);
816:
817: if(rc) {
818: fprintf(stderr, "%s:%d returned %d\n",
819: __FILE__, __LINE__, (int)rc);
820: error++;
821: }
822: else {
823: if(checkurl(url, get_url_list[i].out)) {
824: error++;
825: }
826: }
827: curl_free(url);
828: }
829: else if(rc != get_url_list[i].ucode) {
830: fprintf(stderr, "Get URL\nin: %s\nreturned %d (expected %d)\n",
831: get_url_list[i].in, (int)rc, get_url_list[i].ucode);
832: error++;
833: }
834: curl_url_cleanup(urlp);
835: }
836: return error;
837: }
838:
839: static int get_parts(void)
840: {
841: int i;
842: int error = 0;
843: for(i = 0; get_parts_list[i].in && !error; i++) {
844: CURLUcode rc;
845: CURLU *urlp = curl_url();
846: if(!urlp) {
847: error++;
848: break;
849: }
850: rc = curl_url_set(urlp, CURLUPART_URL,
851: get_parts_list[i].in,
852: get_parts_list[i].urlflags);
853: if(rc != get_parts_list[i].ucode) {
854: fprintf(stderr, "Get parts\nin: %s\nreturned %d (expected %d)\n",
855: get_parts_list[i].in, (int)rc, get_parts_list[i].ucode);
856: error++;
857: }
858: else if(get_parts_list[i].ucode) {
859: /* the expected error happened */
860: }
861: else if(checkparts(urlp, get_parts_list[i].in, get_parts_list[i].out,
862: get_parts_list[i].getflags))
863: error++;
864: curl_url_cleanup(urlp);
865: }
866: return error;
867: }
868:
869: static struct querycase append_list[] = {
870: {"HTTP://test/?s", "name=joe\x02", "http://test/?s&name=joe%02",
871: 0, CURLU_URLENCODE, CURLUE_OK},
872: {"HTTP://test/?size=2#f", "name=joe=", "http://test/?size=2&name=joe%3d#f",
873: 0, CURLU_URLENCODE, CURLUE_OK},
874: {"HTTP://test/?size=2#f", "name=joe doe",
875: "http://test/?size=2&name=joe+doe#f",
876: 0, CURLU_URLENCODE, CURLUE_OK},
877: {"HTTP://test/", "name=joe", "http://test/?name=joe", 0, 0, CURLUE_OK},
878: {"HTTP://test/?size=2", "name=joe", "http://test/?size=2&name=joe",
879: 0, 0, CURLUE_OK},
880: {"HTTP://test/?size=2&", "name=joe", "http://test/?size=2&name=joe",
881: 0, 0, CURLUE_OK},
882: {"HTTP://test/?size=2#f", "name=joe", "http://test/?size=2&name=joe#f",
883: 0, 0, CURLUE_OK},
884: {NULL, NULL, NULL, 0, 0, 0}
885: };
886:
887: static int append(void)
888: {
889: int i;
890: int error = 0;
891: for(i = 0; append_list[i].in && !error; i++) {
892: CURLUcode rc;
893: CURLU *urlp = curl_url();
894: if(!urlp) {
895: error++;
896: break;
897: }
898: rc = curl_url_set(urlp, CURLUPART_URL,
899: append_list[i].in,
900: append_list[i].urlflags);
901: if(rc)
902: error++;
903: else
904: rc = curl_url_set(urlp, CURLUPART_QUERY,
905: append_list[i].q,
906: append_list[i].qflags | CURLU_APPENDQUERY);
907: if(error)
908: ;
909: else if(rc != append_list[i].ucode) {
910: fprintf(stderr, "Append\nin: %s\nreturned %d (expected %d)\n",
911: append_list[i].in, (int)rc, append_list[i].ucode);
912: error++;
913: }
914: else if(append_list[i].ucode) {
915: /* the expected error happened */
916: }
917: else {
918: char *url;
919: rc = curl_url_get(urlp, CURLUPART_URL, &url, 0);
920: if(rc) {
921: fprintf(stderr, "%s:%d Get URL returned %d\n",
922: __FILE__, __LINE__, (int)rc);
923: error++;
924: }
925: else {
926: if(checkurl(url, append_list[i].out)) {
927: error++;
928: }
929: curl_free(url);
930: }
931: }
932: curl_url_cleanup(urlp);
933: }
934: return error;
935: }
936:
937: static int scopeid(void)
938: {
939: CURLU *u = curl_url();
940: int error = 0;
941: CURLUcode rc;
942: char *url;
943:
944: rc = curl_url_set(u, CURLUPART_URL,
945: "https://[fe80::20c:29ff:fe9c:409b%25eth0]/hello.html", 0);
946: if(rc != CURLUE_OK) {
947: fprintf(stderr, "%s:%d curl_url_set returned %d\n",
948: __FILE__, __LINE__, (int)rc);
949: error++;
950: }
951:
952: rc = curl_url_get(u, CURLUPART_HOST, &url, 0);
953: if(rc != CURLUE_OK) {
954: fprintf(stderr, "%s:%d curl_url_get CURLUPART_HOST returned %d\n",
955: __FILE__, __LINE__, (int)rc);
956: error++;
957: }
958: else {
959: printf("we got %s\n", url);
960: curl_free(url);
961: }
962:
963: rc = curl_url_set(u, CURLUPART_HOST, "[::1]", 0);
964: if(rc != CURLUE_OK) {
965: fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d\n",
966: __FILE__, __LINE__, (int)rc);
967: error++;
968: }
969:
970: rc = curl_url_get(u, CURLUPART_URL, &url, 0);
971: if(rc != CURLUE_OK) {
972: fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
973: __FILE__, __LINE__, (int)rc);
974: error++;
975: }
976: else {
977: printf("we got %s\n", url);
978: curl_free(url);
979: }
980:
981: rc = curl_url_set(u, CURLUPART_HOST, "example.com", 0);
982: if(rc != CURLUE_OK) {
983: fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d\n",
984: __FILE__, __LINE__, (int)rc);
985: error++;
986: }
987:
988: rc = curl_url_get(u, CURLUPART_URL, &url, 0);
989: if(rc != CURLUE_OK) {
990: fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
991: __FILE__, __LINE__, (int)rc);
992: error++;
993: }
994: else {
995: printf("we got %s\n", url);
996: curl_free(url);
997: }
998:
999: rc = curl_url_set(u, CURLUPART_HOST,
1000: "[fe80::20c:29ff:fe9c:409b%25eth0]", 0);
1001: if(rc != CURLUE_OK) {
1002: fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d\n",
1003: __FILE__, __LINE__, (int)rc);
1004: error++;
1005: }
1006:
1007: rc = curl_url_get(u, CURLUPART_URL, &url, 0);
1008: if(rc != CURLUE_OK) {
1009: fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
1010: __FILE__, __LINE__, (int)rc);
1011: error++;
1012: }
1013: else {
1014: printf("we got %s\n", url);
1015: curl_free(url);
1016: }
1017:
1018: rc = curl_url_get(u, CURLUPART_HOST, &url, 0);
1019: if(rc != CURLUE_OK) {
1020: fprintf(stderr, "%s:%d curl_url_get CURLUPART_HOST returned %d\n",
1021: __FILE__, __LINE__, (int)rc);
1022: error++;
1023: }
1024: else {
1025: printf("we got %s\n", url);
1026: curl_free(url);
1027: }
1028:
1029: rc = curl_url_get(u, CURLUPART_ZONEID, &url, 0);
1030: if(rc != CURLUE_OK) {
1031: fprintf(stderr, "%s:%d curl_url_get CURLUPART_ZONEID returned %d\n",
1032: __FILE__, __LINE__, (int)rc);
1033: error++;
1034: }
1035: else {
1036: printf("we got %s\n", url);
1037: curl_free(url);
1038: }
1039:
1040: rc = curl_url_set(u, CURLUPART_ZONEID, "clown", 0);
1041: if(rc != CURLUE_OK) {
1042: fprintf(stderr, "%s:%d curl_url_set CURLUPART_ZONEID returned %d\n",
1043: __FILE__, __LINE__, (int)rc);
1044: error++;
1045: }
1046:
1047: rc = curl_url_get(u, CURLUPART_URL, &url, 0);
1048: if(rc != CURLUE_OK) {
1049: fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d\n",
1050: __FILE__, __LINE__, (int)rc);
1051: error++;
1052: }
1053: else {
1054: printf("we got %s\n", url);
1055: curl_free(url);
1056: }
1057:
1058: curl_url_cleanup(u);
1059:
1060: return error;
1061: }
1062:
1063: int test(char *URL)
1064: {
1065: (void)URL; /* not used */
1066:
1067: if(scopeid())
1068: return 6;
1069:
1070: if(append())
1071: return 5;
1072:
1073: if(set_url())
1074: return 1;
1075:
1076: if(set_parts())
1077: return 2;
1078:
1079: if(get_url())
1080: return 3;
1081:
1082: if(get_parts())
1083: return 4;
1084:
1085: printf("success\n");
1086: return 0;
1087: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>