xref: /aosp_15_r20/external/curl/tests/libtest/lib1560.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker  *                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker  *  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker  *                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker  *                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker  *                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker  *
8*6236dae4SAndroid Build Coastguard Worker  * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker  *
10*6236dae4SAndroid Build Coastguard Worker  * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker  * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker  * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker  *
14*6236dae4SAndroid Build Coastguard Worker  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker  * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker  * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker  *
18*6236dae4SAndroid Build Coastguard Worker  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker  * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker  *
21*6236dae4SAndroid Build Coastguard Worker  * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker  *
23*6236dae4SAndroid Build Coastguard Worker  ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker 
25*6236dae4SAndroid Build Coastguard Worker /*
26*6236dae4SAndroid Build Coastguard Worker  * Note:
27*6236dae4SAndroid Build Coastguard Worker  *
28*6236dae4SAndroid Build Coastguard Worker  * Since the URL parser by default only accepts schemes that *this instance*
29*6236dae4SAndroid Build Coastguard Worker  * of libcurl supports, make sure that the test1560 file lists all the schemes
30*6236dae4SAndroid Build Coastguard Worker  * that this test will assume to be present!
31*6236dae4SAndroid Build Coastguard Worker  */
32*6236dae4SAndroid Build Coastguard Worker 
33*6236dae4SAndroid Build Coastguard Worker #include "test.h"
34*6236dae4SAndroid Build Coastguard Worker #if defined(USE_LIBIDN2) || defined(USE_WIN32_IDN) || defined(USE_APPLE_IDN)
35*6236dae4SAndroid Build Coastguard Worker #define USE_IDN
36*6236dae4SAndroid Build Coastguard Worker #endif
37*6236dae4SAndroid Build Coastguard Worker 
38*6236dae4SAndroid Build Coastguard Worker #include "testutil.h"
39*6236dae4SAndroid Build Coastguard Worker #include "warnless.h"
40*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h" /* LAST include file */
41*6236dae4SAndroid Build Coastguard Worker 
42*6236dae4SAndroid Build Coastguard Worker struct part {
43*6236dae4SAndroid Build Coastguard Worker   CURLUPart part;
44*6236dae4SAndroid Build Coastguard Worker   const char *name;
45*6236dae4SAndroid Build Coastguard Worker };
46*6236dae4SAndroid Build Coastguard Worker 
47*6236dae4SAndroid Build Coastguard Worker 
checkparts(CURLU * u,const char * in,const char * wanted,unsigned int getflags)48*6236dae4SAndroid Build Coastguard Worker static int checkparts(CURLU *u, const char *in, const char *wanted,
49*6236dae4SAndroid Build Coastguard Worker                       unsigned int getflags)
50*6236dae4SAndroid Build Coastguard Worker {
51*6236dae4SAndroid Build Coastguard Worker   int i;
52*6236dae4SAndroid Build Coastguard Worker   CURLUcode rc;
53*6236dae4SAndroid Build Coastguard Worker   char buf[256];
54*6236dae4SAndroid Build Coastguard Worker   char *bufp = &buf[0];
55*6236dae4SAndroid Build Coastguard Worker   size_t len = sizeof(buf);
56*6236dae4SAndroid Build Coastguard Worker   struct part parts[] = {
57*6236dae4SAndroid Build Coastguard Worker     {CURLUPART_SCHEME, "scheme"},
58*6236dae4SAndroid Build Coastguard Worker     {CURLUPART_USER, "user"},
59*6236dae4SAndroid Build Coastguard Worker     {CURLUPART_PASSWORD, "password"},
60*6236dae4SAndroid Build Coastguard Worker     {CURLUPART_OPTIONS, "options"},
61*6236dae4SAndroid Build Coastguard Worker     {CURLUPART_HOST, "host"},
62*6236dae4SAndroid Build Coastguard Worker     {CURLUPART_PORT, "port"},
63*6236dae4SAndroid Build Coastguard Worker     {CURLUPART_PATH, "path"},
64*6236dae4SAndroid Build Coastguard Worker     {CURLUPART_QUERY, "query"},
65*6236dae4SAndroid Build Coastguard Worker     {CURLUPART_FRAGMENT, "fragment"},
66*6236dae4SAndroid Build Coastguard Worker     {CURLUPART_URL, NULL}
67*6236dae4SAndroid Build Coastguard Worker   };
68*6236dae4SAndroid Build Coastguard Worker   memset(buf, 0, sizeof(buf));
69*6236dae4SAndroid Build Coastguard Worker 
70*6236dae4SAndroid Build Coastguard Worker   for(i = 0; parts[i].name; i++) {
71*6236dae4SAndroid Build Coastguard Worker     char *p = NULL;
72*6236dae4SAndroid Build Coastguard Worker     size_t n;
73*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(u, parts[i].part, &p, getflags);
74*6236dae4SAndroid Build Coastguard Worker     if(!rc && p) {
75*6236dae4SAndroid Build Coastguard Worker       msnprintf(bufp, len, "%s%s", buf[0]?" | ":"", p);
76*6236dae4SAndroid Build Coastguard Worker     }
77*6236dae4SAndroid Build Coastguard Worker     else
78*6236dae4SAndroid Build Coastguard Worker       msnprintf(bufp, len, "%s[%d]", buf[0]?" | ":"", (int)rc);
79*6236dae4SAndroid Build Coastguard Worker 
80*6236dae4SAndroid Build Coastguard Worker     n = strlen(bufp);
81*6236dae4SAndroid Build Coastguard Worker     bufp += n;
82*6236dae4SAndroid Build Coastguard Worker     len -= n;
83*6236dae4SAndroid Build Coastguard Worker     curl_free(p);
84*6236dae4SAndroid Build Coastguard Worker   }
85*6236dae4SAndroid Build Coastguard Worker   if(strcmp(buf, wanted)) {
86*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "in: %s\nwanted: %s\ngot:    %s\n", in, wanted, buf);
87*6236dae4SAndroid Build Coastguard Worker     return 1;
88*6236dae4SAndroid Build Coastguard Worker   }
89*6236dae4SAndroid Build Coastguard Worker   return 0;
90*6236dae4SAndroid Build Coastguard Worker }
91*6236dae4SAndroid Build Coastguard Worker 
92*6236dae4SAndroid Build Coastguard Worker struct redircase {
93*6236dae4SAndroid Build Coastguard Worker   const char *in;
94*6236dae4SAndroid Build Coastguard Worker   const char *set;
95*6236dae4SAndroid Build Coastguard Worker   const char *out;
96*6236dae4SAndroid Build Coastguard Worker   unsigned int urlflags;
97*6236dae4SAndroid Build Coastguard Worker   unsigned int setflags;
98*6236dae4SAndroid Build Coastguard Worker   CURLUcode ucode;
99*6236dae4SAndroid Build Coastguard Worker };
100*6236dae4SAndroid Build Coastguard Worker 
101*6236dae4SAndroid Build Coastguard Worker struct setcase {
102*6236dae4SAndroid Build Coastguard Worker   const char *in;
103*6236dae4SAndroid Build Coastguard Worker   const char *set;
104*6236dae4SAndroid Build Coastguard Worker   const char *out;
105*6236dae4SAndroid Build Coastguard Worker   unsigned int urlflags;
106*6236dae4SAndroid Build Coastguard Worker   unsigned int setflags;
107*6236dae4SAndroid Build Coastguard Worker   CURLUcode ucode; /* for the main URL set */
108*6236dae4SAndroid Build Coastguard Worker   CURLUcode pcode; /* for updating parts */
109*6236dae4SAndroid Build Coastguard Worker };
110*6236dae4SAndroid Build Coastguard Worker 
111*6236dae4SAndroid Build Coastguard Worker struct setgetcase {
112*6236dae4SAndroid Build Coastguard Worker   const char *in;
113*6236dae4SAndroid Build Coastguard Worker   const char *set;
114*6236dae4SAndroid Build Coastguard Worker   const char *out;
115*6236dae4SAndroid Build Coastguard Worker   unsigned int urlflags; /* for setting the URL */
116*6236dae4SAndroid Build Coastguard Worker   unsigned int setflags; /* for updating parts */
117*6236dae4SAndroid Build Coastguard Worker   unsigned int getflags; /* for getting parts */
118*6236dae4SAndroid Build Coastguard Worker   CURLUcode pcode; /* for updating parts */
119*6236dae4SAndroid Build Coastguard Worker };
120*6236dae4SAndroid Build Coastguard Worker 
121*6236dae4SAndroid Build Coastguard Worker struct testcase {
122*6236dae4SAndroid Build Coastguard Worker   const char *in;
123*6236dae4SAndroid Build Coastguard Worker   const char *out;
124*6236dae4SAndroid Build Coastguard Worker   unsigned int urlflags;
125*6236dae4SAndroid Build Coastguard Worker   unsigned int getflags;
126*6236dae4SAndroid Build Coastguard Worker   CURLUcode ucode;
127*6236dae4SAndroid Build Coastguard Worker };
128*6236dae4SAndroid Build Coastguard Worker 
129*6236dae4SAndroid Build Coastguard Worker struct urltestcase {
130*6236dae4SAndroid Build Coastguard Worker   const char *in;
131*6236dae4SAndroid Build Coastguard Worker   const char *out;
132*6236dae4SAndroid Build Coastguard Worker   unsigned int urlflags; /* pass to curl_url() */
133*6236dae4SAndroid Build Coastguard Worker   unsigned int getflags; /* pass to curl_url_get() */
134*6236dae4SAndroid Build Coastguard Worker   CURLUcode ucode;
135*6236dae4SAndroid Build Coastguard Worker };
136*6236dae4SAndroid Build Coastguard Worker 
137*6236dae4SAndroid Build Coastguard Worker struct querycase {
138*6236dae4SAndroid Build Coastguard Worker   const char *in;
139*6236dae4SAndroid Build Coastguard Worker   const char *q;
140*6236dae4SAndroid Build Coastguard Worker   const char *out;
141*6236dae4SAndroid Build Coastguard Worker   unsigned int urlflags; /* pass to curl_url() */
142*6236dae4SAndroid Build Coastguard Worker   unsigned int qflags; /* pass to curl_url_get() */
143*6236dae4SAndroid Build Coastguard Worker   CURLUcode ucode;
144*6236dae4SAndroid Build Coastguard Worker };
145*6236dae4SAndroid Build Coastguard Worker 
146*6236dae4SAndroid Build Coastguard Worker struct clearurlcase {
147*6236dae4SAndroid Build Coastguard Worker   CURLUPart part;
148*6236dae4SAndroid Build Coastguard Worker   const char *in;
149*6236dae4SAndroid Build Coastguard Worker   const char *out;
150*6236dae4SAndroid Build Coastguard Worker   CURLUcode ucode;
151*6236dae4SAndroid Build Coastguard Worker };
152*6236dae4SAndroid Build Coastguard Worker 
153*6236dae4SAndroid Build Coastguard Worker static const struct testcase get_parts_list[] ={
154*6236dae4SAndroid Build Coastguard Worker   {"curl.se",
155*6236dae4SAndroid Build Coastguard Worker    "[10] | [11] | [12] | [13] | curl.se | [15] | / | [16] | [17]",
156*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, CURLU_NO_GUESS_SCHEME, CURLUE_OK},
157*6236dae4SAndroid Build Coastguard Worker   {"https://curl.se:0/#",
158*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | curl.se | 0 | / | [16] | ",
159*6236dae4SAndroid Build Coastguard Worker    0, CURLU_GET_EMPTY, CURLUE_OK},
160*6236dae4SAndroid Build Coastguard Worker   {"https://curl.se/#",
161*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | curl.se | [15] | / | [16] | ",
162*6236dae4SAndroid Build Coastguard Worker    0, CURLU_GET_EMPTY, CURLUE_OK},
163*6236dae4SAndroid Build Coastguard Worker   {"https://curl.se/?#",
164*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | curl.se | [15] | / |  | ",
165*6236dae4SAndroid Build Coastguard Worker    0, CURLU_GET_EMPTY, CURLUE_OK},
166*6236dae4SAndroid Build Coastguard Worker   {"https://curl.se/?",
167*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | curl.se | [15] | / |  | [17]",
168*6236dae4SAndroid Build Coastguard Worker    0, CURLU_GET_EMPTY, CURLUE_OK},
169*6236dae4SAndroid Build Coastguard Worker   {"https://curl.se/?",
170*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | curl.se | [15] | / | [16] | [17]",
171*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
172*6236dae4SAndroid Build Coastguard Worker   {"https://curl.se/?#",
173*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | curl.se | [15] | / | [16] | [17]",
174*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
175*6236dae4SAndroid Build Coastguard Worker   {"https://curl.se/#  ",
176*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | curl.se | [15] | / | [16] | %20%20",
177*6236dae4SAndroid Build Coastguard Worker    CURLU_URLENCODE|CURLU_ALLOW_SPACE, 0, CURLUE_OK},
178*6236dae4SAndroid Build Coastguard Worker   {"", "", 0, 0, CURLUE_MALFORMED_INPUT},
179*6236dae4SAndroid Build Coastguard Worker   {" ", "", 0, 0, CURLUE_MALFORMED_INPUT},
180*6236dae4SAndroid Build Coastguard Worker   {"1h://example.net", "", 0, 0, CURLUE_BAD_SCHEME},
181*6236dae4SAndroid Build Coastguard Worker   {"..://example.net", "", 0, 0, CURLUE_BAD_SCHEME},
182*6236dae4SAndroid Build Coastguard Worker   {"-ht://example.net", "", 0, 0, CURLUE_BAD_SCHEME},
183*6236dae4SAndroid Build Coastguard Worker   {"+ftp://example.net", "", 0, 0, CURLUE_BAD_SCHEME},
184*6236dae4SAndroid Build Coastguard Worker   {"hej.hej://example.net",
185*6236dae4SAndroid Build Coastguard Worker    "hej.hej | [11] | [12] | [13] | example.net | [15] | / | [16] | [17]",
186*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
187*6236dae4SAndroid Build Coastguard Worker   {"ht-tp://example.net",
188*6236dae4SAndroid Build Coastguard Worker    "ht-tp | [11] | [12] | [13] | example.net | [15] | / | [16] | [17]",
189*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
190*6236dae4SAndroid Build Coastguard Worker   {"ftp+more://example.net",
191*6236dae4SAndroid Build Coastguard Worker    "ftp+more | [11] | [12] | [13] | example.net | [15] | / | [16] | [17]",
192*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
193*6236dae4SAndroid Build Coastguard Worker   {"f1337://example.net",
194*6236dae4SAndroid Build Coastguard Worker    "f1337 | [11] | [12] | [13] | example.net | [15] | / | [16] | [17]",
195*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
196*6236dae4SAndroid Build Coastguard Worker   {"https://[email protected]?hello# space ",
197*6236dae4SAndroid Build Coastguard Worker    "https | user | [12] | [13] | example.net | [15] | / | hello | %20space%20",
198*6236dae4SAndroid Build Coastguard Worker    CURLU_ALLOW_SPACE|CURLU_URLENCODE, 0, CURLUE_OK},
199*6236dae4SAndroid Build Coastguard Worker   {"https://test%test", "", 0, 0, CURLUE_BAD_HOSTNAME},
200*6236dae4SAndroid Build Coastguard Worker   {"https://example.com%252f%[email protected]",
201*6236dae4SAndroid Build Coastguard Worker    "https | example.com%2f@ | [12] | [13] | example.net | [15] | / "
202*6236dae4SAndroid Build Coastguard Worker    "| [16] | [17]",
203*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLDECODE, CURLUE_OK },
204*6236dae4SAndroid Build Coastguard Worker #ifdef USE_IDN
205*6236dae4SAndroid Build Coastguard Worker   {"https://räksmörgås.se",
206*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | xn--rksmrgs-5wao1o.se | "
207*6236dae4SAndroid Build Coastguard Worker    "[15] | / | [16] | [17]", 0, CURLU_PUNYCODE, CURLUE_OK},
208*6236dae4SAndroid Build Coastguard Worker   {"https://xn--rksmrgs-5wao1o.se",
209*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | räksmörgås.se | "
210*6236dae4SAndroid Build Coastguard Worker    "[15] | / | [16] | [17]", 0, CURLU_PUNY2IDN, CURLUE_OK},
211*6236dae4SAndroid Build Coastguard Worker #else
212*6236dae4SAndroid Build Coastguard Worker   {"https://räksmörgås.se",
213*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | [30] | [15] | / | [16] | [17]",
214*6236dae4SAndroid Build Coastguard Worker    0, CURLU_PUNYCODE, CURLUE_OK},
215*6236dae4SAndroid Build Coastguard Worker #endif
216*6236dae4SAndroid Build Coastguard Worker   /* https://ℂᵤⓇℒ。���� */
217*6236dae4SAndroid Build Coastguard Worker   {"https://"
218*6236dae4SAndroid Build Coastguard Worker    "%e2%84%82%e1%b5%a4%e2%93%87%e2%84%92%e3%80%82%f0%9d%90%92%f0%9f%84%b4",
219*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | ℂᵤⓇℒ。���� | [15] |"
220*6236dae4SAndroid Build Coastguard Worker    " / | [16] | [17]",
221*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
222*6236dae4SAndroid Build Coastguard Worker   {"https://"
223*6236dae4SAndroid Build Coastguard Worker    "%e2%84%82%e1%b5%a4%e2%93%87%e2%84%92%e3%80%82%f0%9d%90%92%f0%9f%84%b4",
224*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | "
225*6236dae4SAndroid Build Coastguard Worker    "%e2%84%82%e1%b5%a4%e2%93%87%e2%84%92%e3%80%82%f0%9d%90%92%f0%9f%84%b4 "
226*6236dae4SAndroid Build Coastguard Worker    "| [15] | / | [16] | [17]",
227*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, CURLUE_OK},
228*6236dae4SAndroid Build Coastguard Worker   {"https://"
229*6236dae4SAndroid Build Coastguard Worker    "\xe2\x84\x82\xe1\xb5\xa4\xe2\x93\x87\xe2\x84\x92"
230*6236dae4SAndroid Build Coastguard Worker    "\xe3\x80\x82\xf0\x9d\x90\x92\xf0\x9f\x84\xb4",
231*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | "
232*6236dae4SAndroid Build Coastguard Worker    "%e2%84%82%e1%b5%a4%e2%93%87%e2%84%92%e3%80%82%f0%9d%90%92%f0%9f%84%b4 "
233*6236dae4SAndroid Build Coastguard Worker    "| [15] | / | [16] | [17]",
234*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, CURLUE_OK},
235*6236dae4SAndroid Build Coastguard Worker   {"https://[email protected]?he l lo",
236*6236dae4SAndroid Build Coastguard Worker    "https | user | [12] | [13] | example.net | [15] | / | he+l+lo | [17]",
237*6236dae4SAndroid Build Coastguard Worker    CURLU_ALLOW_SPACE, CURLU_URLENCODE, CURLUE_OK},
238*6236dae4SAndroid Build Coastguard Worker   {"https://[email protected]?he l lo",
239*6236dae4SAndroid Build Coastguard Worker    "https | user | [12] | [13] | example.net | [15] | / | he l lo | [17]",
240*6236dae4SAndroid Build Coastguard Worker    CURLU_ALLOW_SPACE, 0, CURLUE_OK},
241*6236dae4SAndroid Build Coastguard Worker   {"https://exam{}[]ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
242*6236dae4SAndroid Build Coastguard Worker   {"https://exam{ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
243*6236dae4SAndroid Build Coastguard Worker   {"https://exam}ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
244*6236dae4SAndroid Build Coastguard Worker   {"https://exam]ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
245*6236dae4SAndroid Build Coastguard Worker   {"https://exam\\ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
246*6236dae4SAndroid Build Coastguard Worker   {"https://exam$ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
247*6236dae4SAndroid Build Coastguard Worker   {"https://exam'ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
248*6236dae4SAndroid Build Coastguard Worker   {"https://exam\"ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
249*6236dae4SAndroid Build Coastguard Worker   {"https://exam^ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
250*6236dae4SAndroid Build Coastguard Worker   {"https://exam`ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
251*6236dae4SAndroid Build Coastguard Worker   {"https://exam*ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
252*6236dae4SAndroid Build Coastguard Worker   {"https://exam<ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
253*6236dae4SAndroid Build Coastguard Worker   {"https://exam>ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
254*6236dae4SAndroid Build Coastguard Worker   {"https://exam=ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
255*6236dae4SAndroid Build Coastguard Worker   {"https://exam;ple.net", "", 0, 0, CURLUE_BAD_HOSTNAME},
256*6236dae4SAndroid Build Coastguard Worker   {"https://example,net", "", 0, 0, CURLUE_BAD_HOSTNAME},
257*6236dae4SAndroid Build Coastguard Worker   {"https://example&net", "", 0, 0, CURLUE_BAD_HOSTNAME},
258*6236dae4SAndroid Build Coastguard Worker   {"https://example+net", "", 0, 0, CURLUE_BAD_HOSTNAME},
259*6236dae4SAndroid Build Coastguard Worker   {"https://example(net", "", 0, 0, CURLUE_BAD_HOSTNAME},
260*6236dae4SAndroid Build Coastguard Worker   {"https://example)net", "", 0, 0, CURLUE_BAD_HOSTNAME},
261*6236dae4SAndroid Build Coastguard Worker   {"https://example.net/}",
262*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.net | [15] | /} | [16] | [17]",
263*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
264*6236dae4SAndroid Build Coastguard Worker 
265*6236dae4SAndroid Build Coastguard Worker   /* blank user is blank */
266*6236dae4SAndroid Build Coastguard Worker   {"https://:[email protected]",
267*6236dae4SAndroid Build Coastguard Worker    "https |  | password | [13] | example.net | [15] | / | [16] | [17]",
268*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
269*6236dae4SAndroid Build Coastguard Worker   /* blank user + blank password */
270*6236dae4SAndroid Build Coastguard Worker   {"https://:@example.net",
271*6236dae4SAndroid Build Coastguard Worker    "https |  |  | [13] | example.net | [15] | / | [16] | [17]",
272*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
273*6236dae4SAndroid Build Coastguard Worker   /* user-only (no password) */
274*6236dae4SAndroid Build Coastguard Worker   {"https://[email protected]",
275*6236dae4SAndroid Build Coastguard Worker    "https | user | [12] | [13] | example.net | [15] | / | [16] | [17]",
276*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
277*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_WEBSOCKETS
278*6236dae4SAndroid Build Coastguard Worker   {"ws://example.com/color/?green",
279*6236dae4SAndroid Build Coastguard Worker    "ws | [11] | [12] | [13] | example.com | [15] | /color/ | green |"
280*6236dae4SAndroid Build Coastguard Worker    " [17]",
281*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
282*6236dae4SAndroid Build Coastguard Worker   {"wss://example.com/color/?green",
283*6236dae4SAndroid Build Coastguard Worker    "wss | [11] | [12] | [13] | example.com | [15] | /color/ | green |"
284*6236dae4SAndroid Build Coastguard Worker    " [17]",
285*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
286*6236dae4SAndroid Build Coastguard Worker #endif
287*6236dae4SAndroid Build Coastguard Worker 
288*6236dae4SAndroid Build Coastguard Worker   {"https://user:[email protected]/get?this=and#but frag then", "",
289*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
290*6236dae4SAndroid Build Coastguard Worker   {"https://user:[email protected]/get?this=and what", "",
291*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
292*6236dae4SAndroid Build Coastguard Worker   {"https://user:[email protected]/ge t?this=and-what", "",
293*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
294*6236dae4SAndroid Build Coastguard Worker   {"https://user:pass [email protected]/get?this=and-what", "",
295*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
296*6236dae4SAndroid Build Coastguard Worker   {"https://u ser:[email protected]/get?this=and-what", "",
297*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
298*6236dae4SAndroid Build Coastguard Worker   {"imap://user:pass;opt ion@server/path", "",
299*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
300*6236dae4SAndroid Build Coastguard Worker   /* no space allowed in scheme */
301*6236dae4SAndroid Build Coastguard Worker   {"htt ps://user:[email protected]/get?this=and-what", "",
302*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME|CURLU_ALLOW_SPACE, 0, CURLUE_BAD_SCHEME},
303*6236dae4SAndroid Build Coastguard Worker   {"https://user:[email protected]/get?this=and what",
304*6236dae4SAndroid Build Coastguard Worker    "https | user | password | [13] | example.net | [15] | /get | "
305*6236dae4SAndroid Build Coastguard Worker    "this=and what | [17]",
306*6236dae4SAndroid Build Coastguard Worker    CURLU_ALLOW_SPACE, 0, CURLUE_OK},
307*6236dae4SAndroid Build Coastguard Worker   {"https://user:[email protected]/ge t?this=and-what",
308*6236dae4SAndroid Build Coastguard Worker    "https | user | password | [13] | example.net | [15] | /ge t | "
309*6236dae4SAndroid Build Coastguard Worker    "this=and-what | [17]",
310*6236dae4SAndroid Build Coastguard Worker    CURLU_ALLOW_SPACE, 0, CURLUE_OK},
311*6236dae4SAndroid Build Coastguard Worker   {"https://user:pass [email protected]/get?this=and-what",
312*6236dae4SAndroid Build Coastguard Worker    "https | user | pass word | [13] | example.net | [15] | /get | "
313*6236dae4SAndroid Build Coastguard Worker    "this=and-what | [17]",
314*6236dae4SAndroid Build Coastguard Worker    CURLU_ALLOW_SPACE, 0, CURLUE_OK},
315*6236dae4SAndroid Build Coastguard Worker   {"https://u ser:[email protected]/get?this=and-what",
316*6236dae4SAndroid Build Coastguard Worker    "https | u ser | password | [13] | example.net | [15] | /get | "
317*6236dae4SAndroid Build Coastguard Worker    "this=and-what | [17]",
318*6236dae4SAndroid Build Coastguard Worker    CURLU_ALLOW_SPACE, 0, CURLUE_OK},
319*6236dae4SAndroid Build Coastguard Worker   {"https://user:[email protected]/ge t?this=and-what",
320*6236dae4SAndroid Build Coastguard Worker    "https | user | password | [13] | example.net | [15] | /ge%20t | "
321*6236dae4SAndroid Build Coastguard Worker    "this=and-what | [17]",
322*6236dae4SAndroid Build Coastguard Worker    CURLU_ALLOW_SPACE | CURLU_URLENCODE, 0, CURLUE_OK},
323*6236dae4SAndroid Build Coastguard Worker   {"[0:0:0:0:0:0:0:1]",
324*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | [::1] | [15] | / | [16] | [17]",
325*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK },
326*6236dae4SAndroid Build Coastguard Worker   {"[::1]",
327*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | [::1] | [15] | / | [16] | [17]",
328*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK },
329*6236dae4SAndroid Build Coastguard Worker   {"[::]",
330*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | [::] | [15] | / | [16] | [17]",
331*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK },
332*6236dae4SAndroid Build Coastguard Worker   {"https://[::1]",
333*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | [::1] | [15] | / | [16] | [17]",
334*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK },
335*6236dae4SAndroid Build Coastguard Worker   {"user:[email protected]/color/#green?no-red",
336*6236dae4SAndroid Build Coastguard Worker    "ftp | user | moo | [13] | ftp.example.com | [15] | /color/ | [16] | "
337*6236dae4SAndroid Build Coastguard Worker    "green?no-red",
338*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK },
339*6236dae4SAndroid Build Coastguard Worker   {"ftp.user:[email protected]/color/#green?no-red",
340*6236dae4SAndroid Build Coastguard Worker    "http | ftp.user | moo | [13] | example.com | [15] | /color/ | [16] | "
341*6236dae4SAndroid Build Coastguard Worker    "green?no-red",
342*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK },
343*6236dae4SAndroid Build Coastguard Worker #ifdef _WIN32
344*6236dae4SAndroid Build Coastguard Worker   {"file:/C:\\programs\\foo",
345*6236dae4SAndroid Build Coastguard Worker    "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
346*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
347*6236dae4SAndroid Build Coastguard Worker   {"file://C:\\programs\\foo",
348*6236dae4SAndroid Build Coastguard Worker    "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
349*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
350*6236dae4SAndroid Build Coastguard Worker   {"file:///C:\\programs\\foo",
351*6236dae4SAndroid Build Coastguard Worker    "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
352*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
353*6236dae4SAndroid Build Coastguard Worker   {"file://host.example.com/Share/path/to/file.txt",
354*6236dae4SAndroid Build Coastguard Worker    "file | [11] | [12] | [13] | host.example.com | [15] | "
355*6236dae4SAndroid Build Coastguard Worker    "//host.example.com/Share/path/to/file.txt | [16] | [17]",
356*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
357*6236dae4SAndroid Build Coastguard Worker #endif
358*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/color/#green?no-red",
359*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | /color/ | [16] | "
360*6236dae4SAndroid Build Coastguard Worker    "green?no-red",
361*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
362*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/color/#green#no-red",
363*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | /color/ | [16] | "
364*6236dae4SAndroid Build Coastguard Worker    "green#no-red",
365*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
366*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/color/?green#no-red",
367*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | /color/ | green | "
368*6236dae4SAndroid Build Coastguard Worker    "no-red",
369*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
370*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/#color/?green#no-red",
371*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | / | [16] | "
372*6236dae4SAndroid Build Coastguard Worker    "color/?green#no-red",
373*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
374*6236dae4SAndroid Build Coastguard Worker   {"https://example.#com/color/?green#no-red",
375*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example. | [15] | / | [16] | "
376*6236dae4SAndroid Build Coastguard Worker    "com/color/?green#no-red",
377*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK },
378*6236dae4SAndroid Build Coastguard Worker   {"http://[ab.be:1]/x", "",
379*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_BAD_IPV6},
380*6236dae4SAndroid Build Coastguard Worker   {"http://[ab.be]/x", "",
381*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_BAD_IPV6},
382*6236dae4SAndroid Build Coastguard Worker   /* URL without host name */
383*6236dae4SAndroid Build Coastguard Worker   {"http://a:b@/x", "",
384*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_NO_HOST},
385*6236dae4SAndroid Build Coastguard Worker   {"boing:80",
386*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | boing | 80 | / | [16] | [17]",
387*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME|CURLU_GUESS_SCHEME, 0, CURLUE_OK},
388*6236dae4SAndroid Build Coastguard Worker   {"http://[fd00:a41::50]:8080",
389*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | [fd00:a41::50] | 8080 | / | [16] | [17]",
390*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
391*6236dae4SAndroid Build Coastguard Worker   {"http://[fd00:a41::50]/",
392*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | [fd00:a41::50] | [15] | / | [16] | [17]",
393*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
394*6236dae4SAndroid Build Coastguard Worker   {"http://[fd00:a41::50]",
395*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | [fd00:a41::50] | [15] | / | [16] | [17]",
396*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
397*6236dae4SAndroid Build Coastguard Worker   {"https://[::1%252]:1234",
398*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | [::1] | 1234 | / | [16] | [17]",
399*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
400*6236dae4SAndroid Build Coastguard Worker 
401*6236dae4SAndroid Build Coastguard Worker   /* here's "bad" zone id */
402*6236dae4SAndroid Build Coastguard Worker   {"https://[fe80::20c:29ff:fe9c:409b%eth0]:1234",
403*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | [fe80::20c:29ff:fe9c:409b] | 1234 "
404*6236dae4SAndroid Build Coastguard Worker    "| / | [16] | [17]",
405*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
406*6236dae4SAndroid Build Coastguard Worker   {"https://127.0.0.1:443",
407*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | 127.0.0.1 | [15] | / | [16] | [17]",
408*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NO_DEFAULT_PORT, CURLUE_OK},
409*6236dae4SAndroid Build Coastguard Worker   {"http://%3a:%3a@ex4mple/%3f+?+%3f+%23#+%23%3f%g7",
410*6236dae4SAndroid Build Coastguard Worker    "http | : | : | [13] | ex4mple | [15] | /?+ |  ? # | +#?%g7",
411*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLDECODE, CURLUE_OK},
412*6236dae4SAndroid Build Coastguard Worker   {"http://%3a:%3a@ex4mple/%3f?%3f%35#%35%3f%g7",
413*6236dae4SAndroid Build Coastguard Worker    "http | %3a | %3a | [13] | ex4mple | [15] | /%3f | %3f%35 | %35%3f%g7",
414*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
415*6236dae4SAndroid Build Coastguard Worker   {"http://HO0_-st%41/",
416*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | HO0_-stA | [15] | / | [16] | [17]",
417*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
418*6236dae4SAndroid Build Coastguard Worker   {"file://hello.html",
419*6236dae4SAndroid Build Coastguard Worker    "",
420*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_BAD_FILE_URL},
421*6236dae4SAndroid Build Coastguard Worker   {"http://HO0_-st/",
422*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | HO0_-st | [15] | / | [16] | [17]",
423*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
424*6236dae4SAndroid Build Coastguard Worker   {"imap://user:pass;option@server/path",
425*6236dae4SAndroid Build Coastguard Worker    "imap | user | pass | option | server | [15] | /path | [16] | [17]",
426*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
427*6236dae4SAndroid Build Coastguard Worker   {"http://user:pass;option@server/path",
428*6236dae4SAndroid Build Coastguard Worker    "http | user | pass;option | [13] | server | [15] | /path | [16] | [17]",
429*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
430*6236dae4SAndroid Build Coastguard Worker   {"file:/hello.html",
431*6236dae4SAndroid Build Coastguard Worker    "file | [11] | [12] | [13] | [14] | [15] | /hello.html | [16] | [17]",
432*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
433*6236dae4SAndroid Build Coastguard Worker   {"file:/h",
434*6236dae4SAndroid Build Coastguard Worker    "file | [11] | [12] | [13] | [14] | [15] | /h | [16] | [17]",
435*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
436*6236dae4SAndroid Build Coastguard Worker   {"file:/",
437*6236dae4SAndroid Build Coastguard Worker    "file | [11] | [12] | [13] | [14] | [15] | | [16] | [17]",
438*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_BAD_FILE_URL},
439*6236dae4SAndroid Build Coastguard Worker   {"file://127.0.0.1/hello.html",
440*6236dae4SAndroid Build Coastguard Worker    "file | [11] | [12] | [13] | [14] | [15] | /hello.html | [16] | [17]",
441*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
442*6236dae4SAndroid Build Coastguard Worker   {"file:////hello.html",
443*6236dae4SAndroid Build Coastguard Worker    "file | [11] | [12] | [13] | [14] | [15] | //hello.html | [16] | [17]",
444*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
445*6236dae4SAndroid Build Coastguard Worker   {"file:///hello.html",
446*6236dae4SAndroid Build Coastguard Worker    "file | [11] | [12] | [13] | [14] | [15] | /hello.html | [16] | [17]",
447*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
448*6236dae4SAndroid Build Coastguard Worker   {"https://127.0.0.1",
449*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | 127.0.0.1 | 443 | / | [16] | [17]",
450*6236dae4SAndroid Build Coastguard Worker    0, CURLU_DEFAULT_PORT, CURLUE_OK},
451*6236dae4SAndroid Build Coastguard Worker   {"https://127.0.0.1",
452*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | 127.0.0.1 | [15] | / | [16] | [17]",
453*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
454*6236dae4SAndroid Build Coastguard Worker   {"https://[::1]:1234",
455*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | [::1] | 1234 | / | [16] | [17]",
456*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
457*6236dae4SAndroid Build Coastguard Worker   {"https://127abc.com",
458*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | 127abc.com | [15] | / | [16] | [17]",
459*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
460*6236dae4SAndroid Build Coastguard Worker   {"https:// example.com?check", "",
461*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
462*6236dae4SAndroid Build Coastguard Worker   {"https://e x a m p l e.com?check", "",
463*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
464*6236dae4SAndroid Build Coastguard Worker   {"https://example.com?check",
465*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | / | check | [17]",
466*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
467*6236dae4SAndroid Build Coastguard Worker   {"https://example.com:65536",
468*6236dae4SAndroid Build Coastguard Worker    "",
469*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_BAD_PORT_NUMBER},
470*6236dae4SAndroid Build Coastguard Worker   {"https://example.com:-1#moo",
471*6236dae4SAndroid Build Coastguard Worker    "",
472*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_BAD_PORT_NUMBER},
473*6236dae4SAndroid Build Coastguard Worker   {"https://example.com:0#moo",
474*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | 0 | / | "
475*6236dae4SAndroid Build Coastguard Worker    "[16] | moo",
476*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
477*6236dae4SAndroid Build Coastguard Worker   {"https://example.com:01#moo",
478*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | 1 | / | "
479*6236dae4SAndroid Build Coastguard Worker    "[16] | moo",
480*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
481*6236dae4SAndroid Build Coastguard Worker   {"https://example.com:1#moo",
482*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | 1 | / | "
483*6236dae4SAndroid Build Coastguard Worker    "[16] | moo",
484*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
485*6236dae4SAndroid Build Coastguard Worker   {"http://example.com#moo",
486*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | example.com | [15] | / | "
487*6236dae4SAndroid Build Coastguard Worker    "[16] | moo",
488*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
489*6236dae4SAndroid Build Coastguard Worker   {"http://example.com",
490*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | example.com | [15] | / | "
491*6236dae4SAndroid Build Coastguard Worker    "[16] | [17]",
492*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
493*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/path/html",
494*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | example.com | [15] | /path/html | "
495*6236dae4SAndroid Build Coastguard Worker    "[16] | [17]",
496*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
497*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/path/html?query=name",
498*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | example.com | [15] | /path/html | "
499*6236dae4SAndroid Build Coastguard Worker    "query=name | [17]",
500*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
501*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/path/html?query=name#anchor",
502*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | example.com | [15] | /path/html | "
503*6236dae4SAndroid Build Coastguard Worker    "query=name | anchor",
504*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
505*6236dae4SAndroid Build Coastguard Worker   {"http://example.com:1234/path/html?query=name#anchor",
506*6236dae4SAndroid Build Coastguard Worker    "http | [11] | [12] | [13] | example.com | 1234 | /path/html | "
507*6236dae4SAndroid Build Coastguard Worker    "query=name | anchor",
508*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
509*6236dae4SAndroid Build Coastguard Worker   {"http:///user:[email protected]:1234/path/html?query=name#anchor",
510*6236dae4SAndroid Build Coastguard Worker    "http | user | password | [13] | example.com | 1234 | /path/html | "
511*6236dae4SAndroid Build Coastguard Worker    "query=name | anchor",
512*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
513*6236dae4SAndroid Build Coastguard Worker   {"https://user:[email protected]:1234/path/html?query=name#anchor",
514*6236dae4SAndroid Build Coastguard Worker    "https | user | password | [13] | example.com | 1234 | /path/html | "
515*6236dae4SAndroid Build Coastguard Worker    "query=name | anchor",
516*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
517*6236dae4SAndroid Build Coastguard Worker   {"http://user:[email protected]:1234/path/html?query=name#anchor",
518*6236dae4SAndroid Build Coastguard Worker    "http | user | password | [13] | example.com | 1234 | /path/html | "
519*6236dae4SAndroid Build Coastguard Worker    "query=name | anchor",
520*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
521*6236dae4SAndroid Build Coastguard Worker   {"http:/user:[email protected]:1234/path/html?query=name#anchor",
522*6236dae4SAndroid Build Coastguard Worker    "http | user | password | [13] | example.com | 1234 | /path/html | "
523*6236dae4SAndroid Build Coastguard Worker    "query=name | anchor",
524*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
525*6236dae4SAndroid Build Coastguard Worker   {"http:////user:[email protected]:1234/path/html?query=name#anchor",
526*6236dae4SAndroid Build Coastguard Worker    "",
527*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_BAD_SLASHES},
528*6236dae4SAndroid Build Coastguard Worker   {NULL, NULL, 0, 0, CURLUE_OK},
529*6236dae4SAndroid Build Coastguard Worker };
530*6236dae4SAndroid Build Coastguard Worker 
531*6236dae4SAndroid Build Coastguard Worker static const struct urltestcase get_url_list[] = {
532*6236dae4SAndroid Build Coastguard Worker   {"example.com",
533*6236dae4SAndroid Build Coastguard Worker    "example.com/",
534*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, CURLU_NO_GUESS_SCHEME, CURLUE_OK},
535*6236dae4SAndroid Build Coastguard Worker   {"http://[email protected]?#",
536*6236dae4SAndroid Build Coastguard Worker    "http://[email protected]/?#",
537*6236dae4SAndroid Build Coastguard Worker    0, CURLU_GET_EMPTY, CURLUE_OK},
538*6236dae4SAndroid Build Coastguard Worker   /* WHATWG disgrees, it wants "https:/0.0.0.0/" */
539*6236dae4SAndroid Build Coastguard Worker   {"https://0x.0x.0", "https://0x.0x.0/", 0, 0, CURLUE_OK},
540*6236dae4SAndroid Build Coastguard Worker 
541*6236dae4SAndroid Build Coastguard Worker   {"https://example.com:000000000000000000000443/foo",
542*6236dae4SAndroid Build Coastguard Worker    "https://example.com/foo",
543*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NO_DEFAULT_PORT, CURLUE_OK},
544*6236dae4SAndroid Build Coastguard Worker   {"https://example.com:000000000000000000000/foo",
545*6236dae4SAndroid Build Coastguard Worker    "https://example.com:0/foo",
546*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NO_DEFAULT_PORT, CURLUE_OK},
547*6236dae4SAndroid Build Coastguard Worker   {"https://192.0x0000A80001", "https://192.168.0.1/", 0, 0, CURLUE_OK},
548*6236dae4SAndroid Build Coastguard Worker   {"https://0xffffffff", "https://255.255.255.255/", 0, 0, CURLUE_OK},
549*6236dae4SAndroid Build Coastguard Worker   {"https://1.0x1000000", "https://1.0x1000000/", 0, 0, CURLUE_OK},
550*6236dae4SAndroid Build Coastguard Worker   {"https://0x7f.1", "https://127.0.0.1/", 0, 0, CURLUE_OK},
551*6236dae4SAndroid Build Coastguard Worker   {"https://1.2.3.256.com", "https://1.2.3.256.com/", 0, 0, CURLUE_OK},
552*6236dae4SAndroid Build Coastguard Worker   {"https://10.com", "https://10.com/", 0, 0, CURLUE_OK},
553*6236dae4SAndroid Build Coastguard Worker   {"https://1.2.com", "https://1.2.com/", 0, 0, CURLUE_OK},
554*6236dae4SAndroid Build Coastguard Worker   {"https://1.2.3.com", "https://1.2.3.com/", 0, 0, CURLUE_OK},
555*6236dae4SAndroid Build Coastguard Worker   {"https://1.2.com.99", "https://1.2.com.99/", 0, 0, CURLUE_OK},
556*6236dae4SAndroid Build Coastguard Worker   {"https://[fe80::0000:20c:29ff:fe9c:409b]:80/moo",
557*6236dae4SAndroid Build Coastguard Worker    "https://[fe80::20c:29ff:fe9c:409b]:80/moo",
558*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
559*6236dae4SAndroid Build Coastguard Worker   {"https://[fe80::020c:29ff:fe9c:409b]:80/moo",
560*6236dae4SAndroid Build Coastguard Worker    "https://[fe80::20c:29ff:fe9c:409b]:80/moo",
561*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
562*6236dae4SAndroid Build Coastguard Worker   {"https://[fe80:0000:0000:0000:020c:29ff:fe9c:409b]:80/moo",
563*6236dae4SAndroid Build Coastguard Worker    "https://[fe80::20c:29ff:fe9c:409b]:80/moo",
564*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
565*6236dae4SAndroid Build Coastguard Worker   {"https://[fe80:0:0:0:409b::]:80/moo",
566*6236dae4SAndroid Build Coastguard Worker    "https://[fe80::409b:0:0:0]:80/moo",
567*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
568*6236dae4SAndroid Build Coastguard Worker   /* normalize to lower case */
569*6236dae4SAndroid Build Coastguard Worker   {"https://[FE80:0:A:0:409B:0:0:0]:80/moo",
570*6236dae4SAndroid Build Coastguard Worker    "https://[fe80:0:a:0:409b::]:80/moo",
571*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
572*6236dae4SAndroid Build Coastguard Worker   {"https://[::%25fakeit];80/moo",
573*6236dae4SAndroid Build Coastguard Worker    "",
574*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_BAD_PORT_NUMBER},
575*6236dae4SAndroid Build Coastguard Worker   {"https://[fe80::20c:29ff:fe9c:409b]-80/moo",
576*6236dae4SAndroid Build Coastguard Worker    "",
577*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_BAD_PORT_NUMBER},
578*6236dae4SAndroid Build Coastguard Worker #ifdef USE_IDN
579*6236dae4SAndroid Build Coastguard Worker   {"https://räksmörgås.se/path?q#frag",
580*6236dae4SAndroid Build Coastguard Worker    "https://xn--rksmrgs-5wao1o.se/path?q#frag", 0, CURLU_PUNYCODE, CURLUE_OK},
581*6236dae4SAndroid Build Coastguard Worker #endif
582*6236dae4SAndroid Build Coastguard Worker   /* unsupported schemes with no guessing enabled */
583*6236dae4SAndroid Build Coastguard Worker   {"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIEhUTUw+PG1ldGEgY",
584*6236dae4SAndroid Build Coastguard Worker    "", 0, 0, CURLUE_UNSUPPORTED_SCHEME},
585*6236dae4SAndroid Build Coastguard Worker   {"d:anything-really", "", 0, 0, CURLUE_UNSUPPORTED_SCHEME},
586*6236dae4SAndroid Build Coastguard Worker   {"about:config", "", 0, 0, CURLUE_UNSUPPORTED_SCHEME},
587*6236dae4SAndroid Build Coastguard Worker   {"example://foo", "", 0, 0, CURLUE_UNSUPPORTED_SCHEME},
588*6236dae4SAndroid Build Coastguard Worker   {"mailto:[email protected]?body=send%20current-issue", "", 0, 0,
589*6236dae4SAndroid Build Coastguard Worker    CURLUE_UNSUPPORTED_SCHEME},
590*6236dae4SAndroid Build Coastguard Worker   {"about:80", "https://about:80/", CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
591*6236dae4SAndroid Build Coastguard Worker   /* percent encoded host names */
592*6236dae4SAndroid Build Coastguard Worker   {"http://example.com%40127.0.0.1/", "", 0, 0, CURLUE_BAD_HOSTNAME},
593*6236dae4SAndroid Build Coastguard Worker   {"http://example.com%21127.0.0.1/", "", 0, 0, CURLUE_BAD_HOSTNAME},
594*6236dae4SAndroid Build Coastguard Worker   {"http://example.com%3f127.0.0.1/", "", 0, 0, CURLUE_BAD_HOSTNAME},
595*6236dae4SAndroid Build Coastguard Worker   {"http://example.com%23127.0.0.1/", "", 0, 0, CURLUE_BAD_HOSTNAME},
596*6236dae4SAndroid Build Coastguard Worker   {"http://example.com%3a127.0.0.1/", "", 0, 0, CURLUE_BAD_HOSTNAME},
597*6236dae4SAndroid Build Coastguard Worker   {"http://example.com%09127.0.0.1/", "", 0, 0, CURLUE_BAD_HOSTNAME},
598*6236dae4SAndroid Build Coastguard Worker   {"http://example.com%2F127.0.0.1/", "", 0, 0, CURLUE_BAD_HOSTNAME},
599*6236dae4SAndroid Build Coastguard Worker   {"https://%41", "https://A/", 0, 0, CURLUE_OK},
600*6236dae4SAndroid Build Coastguard Worker   {"https://%20", "", 0, 0, CURLUE_BAD_HOSTNAME},
601*6236dae4SAndroid Build Coastguard Worker   {"https://%41%0d", "", 0, 0, CURLUE_BAD_HOSTNAME},
602*6236dae4SAndroid Build Coastguard Worker   {"https://%25", "", 0, 0, CURLUE_BAD_HOSTNAME},
603*6236dae4SAndroid Build Coastguard Worker   {"https://_%c0_", "https://_\xC0_/", 0, 0, CURLUE_OK},
604*6236dae4SAndroid Build Coastguard Worker   {"https://_%c0_", "https://_%C0_/", 0, CURLU_URLENCODE, CURLUE_OK},
605*6236dae4SAndroid Build Coastguard Worker 
606*6236dae4SAndroid Build Coastguard Worker   /* IPv4 trickeries */
607*6236dae4SAndroid Build Coastguard Worker   {"https://16843009", "https://1.1.1.1/", 0, 0, CURLUE_OK},
608*6236dae4SAndroid Build Coastguard Worker   {"https://0177.1", "https://127.0.0.1/", 0, 0, CURLUE_OK},
609*6236dae4SAndroid Build Coastguard Worker   {"https://0111.02.0x3", "https://73.2.0.3/", 0, 0, CURLUE_OK},
610*6236dae4SAndroid Build Coastguard Worker   {"https://0111.02.0x3.", "https://0111.02.0x3./", 0, 0, CURLUE_OK},
611*6236dae4SAndroid Build Coastguard Worker   {"https://0111.02.030", "https://73.2.0.24/", 0, 0, CURLUE_OK},
612*6236dae4SAndroid Build Coastguard Worker   {"https://0111.02.030.", "https://0111.02.030./", 0, 0, CURLUE_OK},
613*6236dae4SAndroid Build Coastguard Worker   {"https://0xff.0xff.0377.255", "https://255.255.255.255/", 0, 0, CURLUE_OK},
614*6236dae4SAndroid Build Coastguard Worker   {"https://1.0xffffff", "https://1.255.255.255/", 0, 0, CURLUE_OK},
615*6236dae4SAndroid Build Coastguard Worker   /* IPv4 numerical overflows or syntax errors will not normalize */
616*6236dae4SAndroid Build Coastguard Worker   {"https://a127.0.0.1", "https://a127.0.0.1/", 0, 0, CURLUE_OK},
617*6236dae4SAndroid Build Coastguard Worker   {"https://\xff.127.0.0.1", "https://%FF.127.0.0.1/", 0, CURLU_URLENCODE,
618*6236dae4SAndroid Build Coastguard Worker    CURLUE_OK},
619*6236dae4SAndroid Build Coastguard Worker   {"https://127.-0.0.1", "https://127.-0.0.1/", 0, 0, CURLUE_OK},
620*6236dae4SAndroid Build Coastguard Worker   {"https://127.0. 1", "https://127.0.0.1/", 0, 0, CURLUE_MALFORMED_INPUT},
621*6236dae4SAndroid Build Coastguard Worker   {"https://1.2.3.256", "https://1.2.3.256/", 0, 0, CURLUE_OK},
622*6236dae4SAndroid Build Coastguard Worker   {"https://1.2.3.256.", "https://1.2.3.256./", 0, 0, CURLUE_OK},
623*6236dae4SAndroid Build Coastguard Worker   {"https://1.2.3.4.5", "https://1.2.3.4.5/", 0, 0, CURLUE_OK},
624*6236dae4SAndroid Build Coastguard Worker   {"https://1.2.0x100.3", "https://1.2.0x100.3/", 0, 0, CURLUE_OK},
625*6236dae4SAndroid Build Coastguard Worker   {"https://4294967296", "https://4294967296/", 0, 0, CURLUE_OK},
626*6236dae4SAndroid Build Coastguard Worker   {"https://123host", "https://123host/", 0, 0, CURLUE_OK},
627*6236dae4SAndroid Build Coastguard Worker   /* 40 bytes scheme is the max allowed */
628*6236dae4SAndroid Build Coastguard Worker   {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA://hostname/path",
629*6236dae4SAndroid Build Coastguard Worker    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa://hostname/path",
630*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
631*6236dae4SAndroid Build Coastguard Worker   /* 41 bytes scheme is not allowed */
632*6236dae4SAndroid Build Coastguard Worker   {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA://hostname/path",
633*6236dae4SAndroid Build Coastguard Worker    "",
634*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_BAD_SCHEME},
635*6236dae4SAndroid Build Coastguard Worker   {"https://[fe80::20c:29ff:fe9c:409b%]:1234",
636*6236dae4SAndroid Build Coastguard Worker    "",
637*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_BAD_IPV6},
638*6236dae4SAndroid Build Coastguard Worker   {"https://[fe80::20c:29ff:fe9c:409b%25]:1234",
639*6236dae4SAndroid Build Coastguard Worker    "https://[fe80::20c:29ff:fe9c:409b%2525]:1234/",
640*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
641*6236dae4SAndroid Build Coastguard Worker   {"https://[fe80::20c:29ff:fe9c:409b%eth0]:1234",
642*6236dae4SAndroid Build Coastguard Worker    "https://[fe80::20c:29ff:fe9c:409b%25eth0]:1234/",
643*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
644*6236dae4SAndroid Build Coastguard Worker   {"https://[::%25fakeit]/moo",
645*6236dae4SAndroid Build Coastguard Worker    "https://[::%25fakeit]/moo",
646*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
647*6236dae4SAndroid Build Coastguard Worker   {"smtp.example.com/path/html",
648*6236dae4SAndroid Build Coastguard Worker    "smtp://smtp.example.com/path/html",
649*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
650*6236dae4SAndroid Build Coastguard Worker   {"https.example.com/path/html",
651*6236dae4SAndroid Build Coastguard Worker    "http://https.example.com/path/html",
652*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
653*6236dae4SAndroid Build Coastguard Worker   {"dict.example.com/path/html",
654*6236dae4SAndroid Build Coastguard Worker    "dict://dict.example.com/path/html",
655*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
656*6236dae4SAndroid Build Coastguard Worker   {"pop3.example.com/path/html",
657*6236dae4SAndroid Build Coastguard Worker    "pop3://pop3.example.com/path/html",
658*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
659*6236dae4SAndroid Build Coastguard Worker   {"ldap.example.com/path/html",
660*6236dae4SAndroid Build Coastguard Worker    "ldap://ldap.example.com/path/html",
661*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
662*6236dae4SAndroid Build Coastguard Worker   {"imap.example.com/path/html",
663*6236dae4SAndroid Build Coastguard Worker    "imap://imap.example.com/path/html",
664*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
665*6236dae4SAndroid Build Coastguard Worker   {"ftp.example.com/path/html",
666*6236dae4SAndroid Build Coastguard Worker    "ftp://ftp.example.com/path/html",
667*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
668*6236dae4SAndroid Build Coastguard Worker   {"example.com/path/html",
669*6236dae4SAndroid Build Coastguard Worker    "http://example.com/path/html",
670*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
671*6236dae4SAndroid Build Coastguard Worker   {"smtp.com/path/html",
672*6236dae4SAndroid Build Coastguard Worker    "smtp://smtp.com/path/html",
673*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
674*6236dae4SAndroid Build Coastguard Worker   {"dict.com/path/html",
675*6236dae4SAndroid Build Coastguard Worker    "dict://dict.com/path/html",
676*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
677*6236dae4SAndroid Build Coastguard Worker   {"pop3.com/path/html",
678*6236dae4SAndroid Build Coastguard Worker    "pop3://pop3.com/path/html",
679*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
680*6236dae4SAndroid Build Coastguard Worker   {"ldap.com/path/html",
681*6236dae4SAndroid Build Coastguard Worker    "ldap://ldap.com/path/html",
682*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
683*6236dae4SAndroid Build Coastguard Worker   {"imap.com/path/html",
684*6236dae4SAndroid Build Coastguard Worker    "imap://imap.com/path/html",
685*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
686*6236dae4SAndroid Build Coastguard Worker   {"ftp.com/path/html",
687*6236dae4SAndroid Build Coastguard Worker    "ftp://ftp.com/path/html",
688*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
689*6236dae4SAndroid Build Coastguard Worker   {"smtp/path/html",
690*6236dae4SAndroid Build Coastguard Worker    "http://smtp/path/html",
691*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
692*6236dae4SAndroid Build Coastguard Worker   {"dict/path/html",
693*6236dae4SAndroid Build Coastguard Worker    "http://dict/path/html",
694*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
695*6236dae4SAndroid Build Coastguard Worker   {"pop3/path/html",
696*6236dae4SAndroid Build Coastguard Worker    "http://pop3/path/html",
697*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
698*6236dae4SAndroid Build Coastguard Worker   {"ldap/path/html",
699*6236dae4SAndroid Build Coastguard Worker    "http://ldap/path/html",
700*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
701*6236dae4SAndroid Build Coastguard Worker   {"imap/path/html",
702*6236dae4SAndroid Build Coastguard Worker    "http://imap/path/html",
703*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
704*6236dae4SAndroid Build Coastguard Worker   {"ftp/path/html",
705*6236dae4SAndroid Build Coastguard Worker    "http://ftp/path/html",
706*6236dae4SAndroid Build Coastguard Worker    CURLU_GUESS_SCHEME, 0, CURLUE_OK},
707*6236dae4SAndroid Build Coastguard Worker   {"HTTP://test/", "http://test/", 0, 0, CURLUE_OK},
708*6236dae4SAndroid Build Coastguard Worker   {"http://HO0_-st..~./", "http://HO0_-st..~./", 0, 0, CURLUE_OK},
709*6236dae4SAndroid Build Coastguard Worker   {"http:/@example.com: 123/", "", 0, 0, CURLUE_MALFORMED_INPUT},
710*6236dae4SAndroid Build Coastguard Worker   {"http:/@example.com:123 /", "", 0, 0, CURLUE_MALFORMED_INPUT},
711*6236dae4SAndroid Build Coastguard Worker   {"http:/@example.com:123a/", "", 0, 0, CURLUE_BAD_PORT_NUMBER},
712*6236dae4SAndroid Build Coastguard Worker   {"http://host/file\r", "", 0, 0, CURLUE_MALFORMED_INPUT},
713*6236dae4SAndroid Build Coastguard Worker   {"http://host/file\n\x03", "", 0, 0, CURLUE_MALFORMED_INPUT},
714*6236dae4SAndroid Build Coastguard Worker   {"htt\x02://host/file", "",
715*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
716*6236dae4SAndroid Build Coastguard Worker   {" http://host/file", "", 0, 0, CURLUE_MALFORMED_INPUT},
717*6236dae4SAndroid Build Coastguard Worker   /* here the password ends at the semicolon and options is 'word' */
718*6236dae4SAndroid Build Coastguard Worker   {"imap://user:pass;word@host/file",
719*6236dae4SAndroid Build Coastguard Worker    "imap://user:pass;word@host/file",
720*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
721*6236dae4SAndroid Build Coastguard Worker   /* here the password has the semicolon */
722*6236dae4SAndroid Build Coastguard Worker   {"http://user:pass;word@host/file",
723*6236dae4SAndroid Build Coastguard Worker    "http://user:pass;word@host/file", 0, 0, CURLUE_OK},
724*6236dae4SAndroid Build Coastguard Worker   {"file:///file.txt#moo", "file:///file.txt#moo", 0, 0, CURLUE_OK},
725*6236dae4SAndroid Build Coastguard Worker   {"file:////file.txt", "file:////file.txt", 0, 0, CURLUE_OK},
726*6236dae4SAndroid Build Coastguard Worker   {"file:///file.txt", "file:///file.txt", 0, 0, CURLUE_OK},
727*6236dae4SAndroid Build Coastguard Worker   {"file:./", "file://", 0, 0, CURLUE_OK},
728*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/hello/../here",
729*6236dae4SAndroid Build Coastguard Worker    "http://example.com/hello/../here",
730*6236dae4SAndroid Build Coastguard Worker    CURLU_PATH_AS_IS, 0, CURLUE_OK},
731*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/hello/../here",
732*6236dae4SAndroid Build Coastguard Worker    "http://example.com/here",
733*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
734*6236dae4SAndroid Build Coastguard Worker   {"http://example.com:80",
735*6236dae4SAndroid Build Coastguard Worker    "http://example.com/",
736*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NO_DEFAULT_PORT, CURLUE_OK},
737*6236dae4SAndroid Build Coastguard Worker   {"tp://example.com/path/html",
738*6236dae4SAndroid Build Coastguard Worker    "",
739*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_UNSUPPORTED_SCHEME},
740*6236dae4SAndroid Build Coastguard Worker   {"http://hello:[email protected]",
741*6236dae4SAndroid Build Coastguard Worker    "",
742*6236dae4SAndroid Build Coastguard Worker    CURLU_DISALLOW_USER, 0, CURLUE_USER_NOT_ALLOWED},
743*6236dae4SAndroid Build Coastguard Worker   {"http:/@example.com:123",
744*6236dae4SAndroid Build Coastguard Worker    "http://@example.com:123/",
745*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
746*6236dae4SAndroid Build Coastguard Worker   {"http:/:[email protected]",
747*6236dae4SAndroid Build Coastguard Worker    "http://:[email protected]/",
748*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
749*6236dae4SAndroid Build Coastguard Worker   {"http://[email protected]?#",
750*6236dae4SAndroid Build Coastguard Worker    "http://[email protected]/",
751*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
752*6236dae4SAndroid Build Coastguard Worker   {"http://[email protected]?",
753*6236dae4SAndroid Build Coastguard Worker    "http://[email protected]/",
754*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
755*6236dae4SAndroid Build Coastguard Worker   {"http://[email protected]#anchor",
756*6236dae4SAndroid Build Coastguard Worker    "http://[email protected]/#anchor",
757*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
758*6236dae4SAndroid Build Coastguard Worker   {"example.com/path/html",
759*6236dae4SAndroid Build Coastguard Worker    "https://example.com/path/html",
760*6236dae4SAndroid Build Coastguard Worker    CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
761*6236dae4SAndroid Build Coastguard Worker   {"example.com/path/html",
762*6236dae4SAndroid Build Coastguard Worker    "",
763*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_BAD_SCHEME},
764*6236dae4SAndroid Build Coastguard Worker   {"http://user:[email protected]:1234/path/html?query=name#anchor",
765*6236dae4SAndroid Build Coastguard Worker    "http://user:[email protected]:1234/path/html?query=name#anchor",
766*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
767*6236dae4SAndroid Build Coastguard Worker   {"http://example.com:1234/path/html?query=name#anchor",
768*6236dae4SAndroid Build Coastguard Worker    "http://example.com:1234/path/html?query=name#anchor",
769*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
770*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/path/html?query=name#anchor",
771*6236dae4SAndroid Build Coastguard Worker    "http://example.com/path/html?query=name#anchor",
772*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
773*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/path/html?query=name",
774*6236dae4SAndroid Build Coastguard Worker    "http://example.com/path/html?query=name",
775*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
776*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/path/html",
777*6236dae4SAndroid Build Coastguard Worker    "http://example.com/path/html",
778*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
779*6236dae4SAndroid Build Coastguard Worker   {"tp://example.com/path/html",
780*6236dae4SAndroid Build Coastguard Worker    "tp://example.com/path/html",
781*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
782*6236dae4SAndroid Build Coastguard Worker   {"custom-scheme://host?expected=test-good",
783*6236dae4SAndroid Build Coastguard Worker    "custom-scheme://host/?expected=test-good",
784*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_OK},
785*6236dae4SAndroid Build Coastguard Worker   {"custom-scheme://?expected=test-bad",
786*6236dae4SAndroid Build Coastguard Worker    "",
787*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, 0, CURLUE_NO_HOST},
788*6236dae4SAndroid Build Coastguard Worker   {"custom-scheme://?expected=test-new-good",
789*6236dae4SAndroid Build Coastguard Worker    "custom-scheme:///?expected=test-new-good",
790*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY, 0, CURLUE_OK},
791*6236dae4SAndroid Build Coastguard Worker   {"custom-scheme://host?expected=test-still-good",
792*6236dae4SAndroid Build Coastguard Worker    "custom-scheme://host/?expected=test-still-good",
793*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY, 0, CURLUE_OK},
794*6236dae4SAndroid Build Coastguard Worker   {NULL, NULL, 0, 0, CURLUE_OK}
795*6236dae4SAndroid Build Coastguard Worker };
796*6236dae4SAndroid Build Coastguard Worker 
checkurl(const char * org,const char * url,const char * out)797*6236dae4SAndroid Build Coastguard Worker static int checkurl(const char *org, const char *url, const char *out)
798*6236dae4SAndroid Build Coastguard Worker {
799*6236dae4SAndroid Build Coastguard Worker   if(strcmp(out, url)) {
800*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr,
801*6236dae4SAndroid Build Coastguard Worker             "Org:    %s\n"
802*6236dae4SAndroid Build Coastguard Worker             "Wanted: %s\n"
803*6236dae4SAndroid Build Coastguard Worker             "Got   : %s\n",
804*6236dae4SAndroid Build Coastguard Worker             org, out, url);
805*6236dae4SAndroid Build Coastguard Worker     return 1;
806*6236dae4SAndroid Build Coastguard Worker   }
807*6236dae4SAndroid Build Coastguard Worker   return 0;
808*6236dae4SAndroid Build Coastguard Worker }
809*6236dae4SAndroid Build Coastguard Worker 
810*6236dae4SAndroid Build Coastguard Worker /* 1. Set the URL
811*6236dae4SAndroid Build Coastguard Worker    2. Set components
812*6236dae4SAndroid Build Coastguard Worker    3. Extract all components (not URL)
813*6236dae4SAndroid Build Coastguard Worker */
814*6236dae4SAndroid Build Coastguard Worker static const struct setgetcase setget_parts_list[] = {
815*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
816*6236dae4SAndroid Build Coastguard Worker    "query=\"\",",
817*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | / |  | [17]",
818*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLU_GET_EMPTY, CURLUE_OK},
819*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
820*6236dae4SAndroid Build Coastguard Worker    "fragment=\"\",",
821*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | / | [16] | ",
822*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLU_GET_EMPTY, CURLUE_OK},
823*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
824*6236dae4SAndroid Build Coastguard Worker    "query=\"\",",
825*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | / | [16] | [17]",
826*6236dae4SAndroid Build Coastguard Worker    0, 0, 0, CURLUE_OK},
827*6236dae4SAndroid Build Coastguard Worker   {"https://example.com",
828*6236dae4SAndroid Build Coastguard Worker    "path=get,",
829*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | /get | [16] | [17]",
830*6236dae4SAndroid Build Coastguard Worker    0, 0, 0, CURLUE_OK},
831*6236dae4SAndroid Build Coastguard Worker   {"https://example.com",
832*6236dae4SAndroid Build Coastguard Worker    "path=/get,",
833*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | /get | [16] | [17]",
834*6236dae4SAndroid Build Coastguard Worker    0, 0, 0, CURLUE_OK},
835*6236dae4SAndroid Build Coastguard Worker   {"https://example.com",
836*6236dae4SAndroid Build Coastguard Worker    "path=g e t,",
837*6236dae4SAndroid Build Coastguard Worker    "https | [11] | [12] | [13] | example.com | [15] | /g%20e%20t | "
838*6236dae4SAndroid Build Coastguard Worker    "[16] | [17]",
839*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, 0, CURLUE_OK},
840*6236dae4SAndroid Build Coastguard Worker   {NULL, NULL, NULL, 0, 0, 0, CURLUE_OK}
841*6236dae4SAndroid Build Coastguard Worker };
842*6236dae4SAndroid Build Coastguard Worker 
843*6236dae4SAndroid Build Coastguard Worker /* !checksrc! disable SPACEBEFORECOMMA 1 */
844*6236dae4SAndroid Build Coastguard Worker static const struct setcase set_parts_list[] = {
845*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
846*6236dae4SAndroid Build Coastguard Worker    "host=%43url.se,",
847*6236dae4SAndroid Build Coastguard Worker    "https://%43url.se/",
848*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
849*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
850*6236dae4SAndroid Build Coastguard Worker    "host=%25url.se,",
851*6236dae4SAndroid Build Coastguard Worker    "",
852*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_BAD_HOSTNAME},
853*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/?param=value",
854*6236dae4SAndroid Build Coastguard Worker    "query=\"\",",
855*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
856*6236dae4SAndroid Build Coastguard Worker    0, CURLU_APPENDQUERY | CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
857*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
858*6236dae4SAndroid Build Coastguard Worker    "host=\"\",",
859*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
860*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, CURLUE_OK, CURLUE_BAD_HOSTNAME},
861*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
862*6236dae4SAndroid Build Coastguard Worker    "host=\"\",",
863*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
864*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_BAD_HOSTNAME},
865*6236dae4SAndroid Build Coastguard Worker   {"https://example.com",
866*6236dae4SAndroid Build Coastguard Worker    "path=get,",
867*6236dae4SAndroid Build Coastguard Worker    "https://example.com/get",
868*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
869*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
870*6236dae4SAndroid Build Coastguard Worker    "scheme=ftp+-.123,",
871*6236dae4SAndroid Build Coastguard Worker    "ftp+-.123://example.com/",
872*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
873*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
874*6236dae4SAndroid Build Coastguard Worker    "scheme=1234,",
875*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
876*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_BAD_SCHEME},
877*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
878*6236dae4SAndroid Build Coastguard Worker    "scheme=1http,",
879*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
880*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_BAD_SCHEME},
881*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
882*6236dae4SAndroid Build Coastguard Worker    "scheme=-ftp,",
883*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
884*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_BAD_SCHEME},
885*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
886*6236dae4SAndroid Build Coastguard Worker    "scheme=+ftp,",
887*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
888*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_BAD_SCHEME},
889*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
890*6236dae4SAndroid Build Coastguard Worker    "scheme=.ftp,",
891*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
892*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_BAD_SCHEME},
893*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
894*6236dae4SAndroid Build Coastguard Worker    "host=example.com%2fmoo,",
895*6236dae4SAndroid Build Coastguard Worker    "",
896*6236dae4SAndroid Build Coastguard Worker    0, /* get */
897*6236dae4SAndroid Build Coastguard Worker    0, /* set */
898*6236dae4SAndroid Build Coastguard Worker    CURLUE_OK, CURLUE_BAD_HOSTNAME},
899*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
900*6236dae4SAndroid Build Coastguard Worker    "host=http://fake,",
901*6236dae4SAndroid Build Coastguard Worker    "",
902*6236dae4SAndroid Build Coastguard Worker    0, /* get */
903*6236dae4SAndroid Build Coastguard Worker    0, /* set */
904*6236dae4SAndroid Build Coastguard Worker    CURLUE_OK, CURLUE_BAD_HOSTNAME},
905*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
906*6236dae4SAndroid Build Coastguard Worker    "host=test%,",
907*6236dae4SAndroid Build Coastguard Worker    "",
908*6236dae4SAndroid Build Coastguard Worker    0, /* get */
909*6236dae4SAndroid Build Coastguard Worker    0, /* set */
910*6236dae4SAndroid Build Coastguard Worker    CURLUE_OK, CURLUE_BAD_HOSTNAME},
911*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
912*6236dae4SAndroid Build Coastguard Worker    "host=te st,",
913*6236dae4SAndroid Build Coastguard Worker    "",
914*6236dae4SAndroid Build Coastguard Worker    0, /* get */
915*6236dae4SAndroid Build Coastguard Worker    0, /* set */
916*6236dae4SAndroid Build Coastguard Worker    CURLUE_OK, CURLUE_BAD_HOSTNAME},
917*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
918*6236dae4SAndroid Build Coastguard Worker    "host=0xff,", /* '++' there's no automatic URL decode when setting this
919*6236dae4SAndroid Build Coastguard Worker                   part */
920*6236dae4SAndroid Build Coastguard Worker    "https://0xff/",
921*6236dae4SAndroid Build Coastguard Worker    0, /* get */
922*6236dae4SAndroid Build Coastguard Worker    0, /* set */
923*6236dae4SAndroid Build Coastguard Worker    CURLUE_OK, CURLUE_OK},
924*6236dae4SAndroid Build Coastguard Worker 
925*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
926*6236dae4SAndroid Build Coastguard Worker    "query=Al2cO3tDkcDZ3EWE5Lh+LX8TPHs,", /* contains '+' */
927*6236dae4SAndroid Build Coastguard Worker    "https://example.com/?Al2cO3tDkcDZ3EWE5Lh%2bLX8TPHs",
928*6236dae4SAndroid Build Coastguard Worker    CURLU_URLDECODE, /* decode on get */
929*6236dae4SAndroid Build Coastguard Worker    CURLU_URLENCODE, /* encode on set */
930*6236dae4SAndroid Build Coastguard Worker    CURLUE_OK, CURLUE_OK},
931*6236dae4SAndroid Build Coastguard Worker 
932*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
933*6236dae4SAndroid Build Coastguard Worker    /* Set a bad scheme *including* :// */
934*6236dae4SAndroid Build Coastguard Worker    "scheme=https://,",
935*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
936*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_BAD_SCHEME},
937*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
938*6236dae4SAndroid Build Coastguard Worker    /* Set a 41 bytes scheme. That's too long so the old scheme remains set. */
939*6236dae4SAndroid Build Coastguard Worker    "scheme=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc,",
940*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
941*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_BAD_SCHEME},
942*6236dae4SAndroid Build Coastguard Worker   {"https://example.com/",
943*6236dae4SAndroid Build Coastguard Worker    /* set a 40 bytes scheme */
944*6236dae4SAndroid Build Coastguard Worker    "scheme=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,",
945*6236dae4SAndroid Build Coastguard Worker    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb://example.com/",
946*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
947*6236dae4SAndroid Build Coastguard Worker   {"https://[::1%25fake]:1234/",
948*6236dae4SAndroid Build Coastguard Worker    "zoneid=NULL,",
949*6236dae4SAndroid Build Coastguard Worker    "https://[::1]:1234/",
950*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
951*6236dae4SAndroid Build Coastguard Worker   {"https://host:1234/",
952*6236dae4SAndroid Build Coastguard Worker    "port=NULL,",
953*6236dae4SAndroid Build Coastguard Worker    "https://host/",
954*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
955*6236dae4SAndroid Build Coastguard Worker   {"https://host:1234/",
956*6236dae4SAndroid Build Coastguard Worker    "port=\"\",",
957*6236dae4SAndroid Build Coastguard Worker    "https://host:1234/",
958*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
959*6236dae4SAndroid Build Coastguard Worker   {"https://host:1234/",
960*6236dae4SAndroid Build Coastguard Worker    "port=56 78,",
961*6236dae4SAndroid Build Coastguard Worker    "https://host:1234/",
962*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
963*6236dae4SAndroid Build Coastguard Worker   {"https://host:1234/",
964*6236dae4SAndroid Build Coastguard Worker    "port=0,",
965*6236dae4SAndroid Build Coastguard Worker    "https://host:0/",
966*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
967*6236dae4SAndroid Build Coastguard Worker   {"https://host:1234/",
968*6236dae4SAndroid Build Coastguard Worker    "port=65535,",
969*6236dae4SAndroid Build Coastguard Worker    "https://host:65535/",
970*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
971*6236dae4SAndroid Build Coastguard Worker   {"https://host:1234/",
972*6236dae4SAndroid Build Coastguard Worker    "port=65536,",
973*6236dae4SAndroid Build Coastguard Worker    "https://host:1234/",
974*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_BAD_PORT_NUMBER},
975*6236dae4SAndroid Build Coastguard Worker   {"https://host/",
976*6236dae4SAndroid Build Coastguard Worker    "path=%4A%4B%4C,",
977*6236dae4SAndroid Build Coastguard Worker    "https://host/%4a%4b%4c",
978*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
979*6236dae4SAndroid Build Coastguard Worker   {"https://host/mooo?q#f",
980*6236dae4SAndroid Build Coastguard Worker    "path=NULL,query=NULL,fragment=NULL,",
981*6236dae4SAndroid Build Coastguard Worker    "https://host/",
982*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
983*6236dae4SAndroid Build Coastguard Worker   {"https://user:secret@host/",
984*6236dae4SAndroid Build Coastguard Worker    "user=NULL,password=NULL,",
985*6236dae4SAndroid Build Coastguard Worker    "https://host/",
986*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
987*6236dae4SAndroid Build Coastguard Worker   {NULL,
988*6236dae4SAndroid Build Coastguard Worker    "scheme=https,user=   @:,host=foobar,",
989*6236dae4SAndroid Build Coastguard Worker    "https://%20%20%20%40%3a@foobar/",
990*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
991*6236dae4SAndroid Build Coastguard Worker   /* Setting a host name with spaces is not OK: */
992*6236dae4SAndroid Build Coastguard Worker   {NULL,
993*6236dae4SAndroid Build Coastguard Worker    "scheme=https,host=  ,path= ,user= ,password= ,query= ,fragment= ,",
994*6236dae4SAndroid Build Coastguard Worker    "[nothing]",
995*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, CURLUE_OK, CURLUE_BAD_HOSTNAME},
996*6236dae4SAndroid Build Coastguard Worker   {NULL,
997*6236dae4SAndroid Build Coastguard Worker    "scheme=https,host=foobar,path=/this /path /is /here,",
998*6236dae4SAndroid Build Coastguard Worker    "https://foobar/this%20/path%20/is%20/here",
999*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
1000*6236dae4SAndroid Build Coastguard Worker   {NULL,
1001*6236dae4SAndroid Build Coastguard Worker    "scheme=https,host=foobar,path=\xc3\xa4\xc3\xb6\xc3\xbc,",
1002*6236dae4SAndroid Build Coastguard Worker    "https://foobar/%c3%a4%c3%b6%c3%bc",
1003*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, CURLUE_OK, CURLUE_OK},
1004*6236dae4SAndroid Build Coastguard Worker   {"imap://user:secret;opt@host/",
1005*6236dae4SAndroid Build Coastguard Worker    "options=updated,scheme=imaps,password=p4ssw0rd,",
1006*6236dae4SAndroid Build Coastguard Worker    "imaps://user:p4ssw0rd;updated@host/",
1007*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_NO_HOST, CURLUE_OK},
1008*6236dae4SAndroid Build Coastguard Worker   {"imap://user:secret;optit@host/",
1009*6236dae4SAndroid Build Coastguard Worker    "scheme=https,",
1010*6236dae4SAndroid Build Coastguard Worker    "https://user:secret@host/",
1011*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_NO_HOST, CURLUE_OK},
1012*6236dae4SAndroid Build Coastguard Worker   {"file:///file#anchor",
1013*6236dae4SAndroid Build Coastguard Worker    "scheme=https,host=example,",
1014*6236dae4SAndroid Build Coastguard Worker    "https://example/file#anchor",
1015*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_NO_HOST, CURLUE_OK},
1016*6236dae4SAndroid Build Coastguard Worker   {NULL, /* start fresh! */
1017*6236dae4SAndroid Build Coastguard Worker    "scheme=file,host=127.0.0.1,path=/no,user=anonymous,",
1018*6236dae4SAndroid Build Coastguard Worker    "file:///no",
1019*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
1020*6236dae4SAndroid Build Coastguard Worker   {NULL, /* start fresh! */
1021*6236dae4SAndroid Build Coastguard Worker    "scheme=ftp,host=127.0.0.1,path=/no,user=anonymous,",
1022*6236dae4SAndroid Build Coastguard Worker    "ftp://[email protected]/no",
1023*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
1024*6236dae4SAndroid Build Coastguard Worker   {NULL, /* start fresh! */
1025*6236dae4SAndroid Build Coastguard Worker    "scheme=https,host=example.com,",
1026*6236dae4SAndroid Build Coastguard Worker    "https://example.com/",
1027*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
1028*6236dae4SAndroid Build Coastguard Worker   {"http://user:[email protected]/path?query#frag",
1029*6236dae4SAndroid Build Coastguard Worker    "fragment=changed,",
1030*6236dae4SAndroid Build Coastguard Worker    "http://user:[email protected]/path?query#changed",
1031*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK, CURLUE_OK},
1032*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/",
1033*6236dae4SAndroid Build Coastguard Worker    "scheme=foo,", /* not accepted */
1034*6236dae4SAndroid Build Coastguard Worker    "http://example.com/",
1035*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_UNSUPPORTED_SCHEME},
1036*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/",
1037*6236dae4SAndroid Build Coastguard Worker    "scheme=https,path=/hello,fragment=snippet,",
1038*6236dae4SAndroid Build Coastguard Worker    "https://example.com/hello#snippet",
1039*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
1040*6236dae4SAndroid Build Coastguard Worker   {"http://example.com:80",
1041*6236dae4SAndroid Build Coastguard Worker    "user=foo,port=1922,",
1042*6236dae4SAndroid Build Coastguard Worker    "http://[email protected]:1922/",
1043*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
1044*6236dae4SAndroid Build Coastguard Worker   {"http://example.com:80",
1045*6236dae4SAndroid Build Coastguard Worker    "user=foo,password=bar,",
1046*6236dae4SAndroid Build Coastguard Worker    "http://foo:[email protected]:80/",
1047*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
1048*6236dae4SAndroid Build Coastguard Worker   {"http://example.com:80",
1049*6236dae4SAndroid Build Coastguard Worker    "user=foo,",
1050*6236dae4SAndroid Build Coastguard Worker    "http://[email protected]:80/",
1051*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
1052*6236dae4SAndroid Build Coastguard Worker   {"http://example.com",
1053*6236dae4SAndroid Build Coastguard Worker    "host=www.example.com,",
1054*6236dae4SAndroid Build Coastguard Worker    "http://www.example.com/",
1055*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
1056*6236dae4SAndroid Build Coastguard Worker   {"http://example.com:80",
1057*6236dae4SAndroid Build Coastguard Worker    "scheme=ftp,",
1058*6236dae4SAndroid Build Coastguard Worker    "ftp://example.com:80/",
1059*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK, CURLUE_OK},
1060*6236dae4SAndroid Build Coastguard Worker   {"custom-scheme://host",
1061*6236dae4SAndroid Build Coastguard Worker    "host=\"\",",
1062*6236dae4SAndroid Build Coastguard Worker    "custom-scheme://host/",
1063*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, CURLU_NON_SUPPORT_SCHEME, CURLUE_OK,
1064*6236dae4SAndroid Build Coastguard Worker    CURLUE_BAD_HOSTNAME},
1065*6236dae4SAndroid Build Coastguard Worker   {"custom-scheme://host",
1066*6236dae4SAndroid Build Coastguard Worker    "host=\"\",",
1067*6236dae4SAndroid Build Coastguard Worker    "custom-scheme:///",
1068*6236dae4SAndroid Build Coastguard Worker    CURLU_NON_SUPPORT_SCHEME, CURLU_NON_SUPPORT_SCHEME | CURLU_NO_AUTHORITY,
1069*6236dae4SAndroid Build Coastguard Worker    CURLUE_OK, CURLUE_OK},
1070*6236dae4SAndroid Build Coastguard Worker 
1071*6236dae4SAndroid Build Coastguard Worker   {NULL, NULL, NULL, 0, 0, CURLUE_OK, CURLUE_OK}
1072*6236dae4SAndroid Build Coastguard Worker };
1073*6236dae4SAndroid Build Coastguard Worker 
part2id(char * part)1074*6236dae4SAndroid Build Coastguard Worker static CURLUPart part2id(char *part)
1075*6236dae4SAndroid Build Coastguard Worker {
1076*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("url", part))
1077*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_URL;
1078*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("scheme", part))
1079*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_SCHEME;
1080*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("user", part))
1081*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_USER;
1082*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("password", part))
1083*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_PASSWORD;
1084*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("options", part))
1085*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_OPTIONS;
1086*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("host", part))
1087*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_HOST;
1088*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("port", part))
1089*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_PORT;
1090*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("path", part))
1091*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_PATH;
1092*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("query", part))
1093*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_QUERY;
1094*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("fragment", part))
1095*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_FRAGMENT;
1096*6236dae4SAndroid Build Coastguard Worker   if(!strcmp("zoneid", part))
1097*6236dae4SAndroid Build Coastguard Worker     return CURLUPART_ZONEID;
1098*6236dae4SAndroid Build Coastguard Worker   return (CURLUPart)9999; /* bad input => bad output */
1099*6236dae4SAndroid Build Coastguard Worker }
1100*6236dae4SAndroid Build Coastguard Worker 
updateurl(CURLU * u,const char * cmd,unsigned int setflags)1101*6236dae4SAndroid Build Coastguard Worker static CURLUcode updateurl(CURLU *u, const char *cmd, unsigned int setflags)
1102*6236dae4SAndroid Build Coastguard Worker {
1103*6236dae4SAndroid Build Coastguard Worker   const char *p = cmd;
1104*6236dae4SAndroid Build Coastguard Worker   CURLUcode uc;
1105*6236dae4SAndroid Build Coastguard Worker 
1106*6236dae4SAndroid Build Coastguard Worker   /* make sure the last command ends with a comma too! */
1107*6236dae4SAndroid Build Coastguard Worker   while(p) {
1108*6236dae4SAndroid Build Coastguard Worker     char *e = strchr(p, ',');
1109*6236dae4SAndroid Build Coastguard Worker     if(e) {
1110*6236dae4SAndroid Build Coastguard Worker       size_t n = (size_t)(e - p);
1111*6236dae4SAndroid Build Coastguard Worker       char buf[80];
1112*6236dae4SAndroid Build Coastguard Worker       char part[80];
1113*6236dae4SAndroid Build Coastguard Worker       char value[80];
1114*6236dae4SAndroid Build Coastguard Worker 
1115*6236dae4SAndroid Build Coastguard Worker       memset(part, 0, sizeof(part)); /* Avoid valgrind false positive. */
1116*6236dae4SAndroid Build Coastguard Worker       memset(value, 0, sizeof(value)); /* Avoid valgrind false positive. */
1117*6236dae4SAndroid Build Coastguard Worker       memcpy(buf, p, n);
1118*6236dae4SAndroid Build Coastguard Worker       buf[n] = 0;
1119*6236dae4SAndroid Build Coastguard Worker       if(2 == sscanf(buf, "%79[^=]=%79[^,]", part, value)) {
1120*6236dae4SAndroid Build Coastguard Worker         CURLUPart what = part2id(part);
1121*6236dae4SAndroid Build Coastguard Worker #if 0
1122*6236dae4SAndroid Build Coastguard Worker         /* for debugging this */
1123*6236dae4SAndroid Build Coastguard Worker         fprintf(stderr, "%s = \"%s\" [%d]\n", part, value, (int)what);
1124*6236dae4SAndroid Build Coastguard Worker #endif
1125*6236dae4SAndroid Build Coastguard Worker         if(what > CURLUPART_ZONEID)
1126*6236dae4SAndroid Build Coastguard Worker           fprintf(stderr, "UNKNOWN part '%s'\n", part);
1127*6236dae4SAndroid Build Coastguard Worker 
1128*6236dae4SAndroid Build Coastguard Worker         if(!strcmp("NULL", value))
1129*6236dae4SAndroid Build Coastguard Worker           uc = curl_url_set(u, what, NULL, setflags);
1130*6236dae4SAndroid Build Coastguard Worker         else if(!strcmp("\"\"", value))
1131*6236dae4SAndroid Build Coastguard Worker           uc = curl_url_set(u, what, "", setflags);
1132*6236dae4SAndroid Build Coastguard Worker         else
1133*6236dae4SAndroid Build Coastguard Worker           uc = curl_url_set(u, what, value, setflags);
1134*6236dae4SAndroid Build Coastguard Worker         if(uc)
1135*6236dae4SAndroid Build Coastguard Worker           return uc;
1136*6236dae4SAndroid Build Coastguard Worker       }
1137*6236dae4SAndroid Build Coastguard Worker       p = e + 1;
1138*6236dae4SAndroid Build Coastguard Worker       continue;
1139*6236dae4SAndroid Build Coastguard Worker     }
1140*6236dae4SAndroid Build Coastguard Worker     break;
1141*6236dae4SAndroid Build Coastguard Worker   }
1142*6236dae4SAndroid Build Coastguard Worker   return CURLUE_OK;
1143*6236dae4SAndroid Build Coastguard Worker }
1144*6236dae4SAndroid Build Coastguard Worker 
1145*6236dae4SAndroid Build Coastguard Worker static const struct redircase set_url_list[] = {
1146*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/",
1147*6236dae4SAndroid Build Coastguard Worker    "../path/././../../moo",
1148*6236dae4SAndroid Build Coastguard Worker    "http://example.org/moo",
1149*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1150*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/",
1151*6236dae4SAndroid Build Coastguard Worker    "//example.org/../path/../../",
1152*6236dae4SAndroid Build Coastguard Worker    "http://example.org/",
1153*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1154*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/",
1155*6236dae4SAndroid Build Coastguard Worker    "///example.org/../path/../../",
1156*6236dae4SAndroid Build Coastguard Worker    "http://example.org/",
1157*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1158*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/foo/bar",
1159*6236dae4SAndroid Build Coastguard Worker    ":23",
1160*6236dae4SAndroid Build Coastguard Worker    "http://example.org/foo/:23",
1161*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1162*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/foo/bar",
1163*6236dae4SAndroid Build Coastguard Worker    "\\x",
1164*6236dae4SAndroid Build Coastguard Worker    "http://example.org/foo/\\x",
1165*6236dae4SAndroid Build Coastguard Worker    /* WHATWG disagrees */
1166*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1167*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/foo/bar",
1168*6236dae4SAndroid Build Coastguard Worker    "#/",
1169*6236dae4SAndroid Build Coastguard Worker    "http://example.org/foo/bar#/",
1170*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1171*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/foo/bar",
1172*6236dae4SAndroid Build Coastguard Worker    "?/",
1173*6236dae4SAndroid Build Coastguard Worker    "http://example.org/foo/bar?/",
1174*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1175*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/foo/bar",
1176*6236dae4SAndroid Build Coastguard Worker    "#;?",
1177*6236dae4SAndroid Build Coastguard Worker    "http://example.org/foo/bar#;?",
1178*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1179*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/foo/bar",
1180*6236dae4SAndroid Build Coastguard Worker    "#",
1181*6236dae4SAndroid Build Coastguard Worker    "http://example.org/foo/bar",
1182*6236dae4SAndroid Build Coastguard Worker    /* This happens because the parser removes empty fragments */
1183*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1184*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/foo/bar",
1185*6236dae4SAndroid Build Coastguard Worker    "?",
1186*6236dae4SAndroid Build Coastguard Worker    "http://example.org/foo/bar",
1187*6236dae4SAndroid Build Coastguard Worker    /* This happens because the parser removes empty queries */
1188*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1189*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/foo/bar",
1190*6236dae4SAndroid Build Coastguard Worker    "?#",
1191*6236dae4SAndroid Build Coastguard Worker    "http://example.org/foo/bar",
1192*6236dae4SAndroid Build Coastguard Worker    /* This happens because the parser removes empty queries and fragments */
1193*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1194*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/please/../gimme/%TESTNUMBER?foobar#hello",
1195*6236dae4SAndroid Build Coastguard Worker    "http://example.net/there/it/is/../../tes t case=/%TESTNUMBER0002? yes no",
1196*6236dae4SAndroid Build Coastguard Worker    "http://example.net/there/tes%20t%20case=/%TESTNUMBER0002?+yes+no",
1197*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE|CURLU_ALLOW_SPACE, CURLUE_OK},
1198*6236dae4SAndroid Build Coastguard Worker   {"http://local.test?redirect=http://local.test:80?-321",
1199*6236dae4SAndroid Build Coastguard Worker    "http://local.test:80?-123",
1200*6236dae4SAndroid Build Coastguard Worker    "http://local.test:80/?-123",
1201*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE|CURLU_ALLOW_SPACE, CURLUE_OK},
1202*6236dae4SAndroid Build Coastguard Worker   {"http://local.test?redirect=http://local.test:80?-321",
1203*6236dae4SAndroid Build Coastguard Worker    "http://local.test:80?-123",
1204*6236dae4SAndroid Build Coastguard Worker    "http://local.test:80/?-123",
1205*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1206*6236dae4SAndroid Build Coastguard Worker   {"http://example.org/static/favicon/wikipedia.ico",
1207*6236dae4SAndroid Build Coastguard Worker    "//fake.example.com/licenses/by-sa/3.0/",
1208*6236dae4SAndroid Build Coastguard Worker    "http://fake.example.com/licenses/by-sa/3.0/",
1209*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1210*6236dae4SAndroid Build Coastguard Worker   {"https://example.org/static/favicon/wikipedia.ico",
1211*6236dae4SAndroid Build Coastguard Worker    "//fake.example.com/licenses/by-sa/3.0/",
1212*6236dae4SAndroid Build Coastguard Worker    "https://fake.example.com/licenses/by-sa/3.0/",
1213*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1214*6236dae4SAndroid Build Coastguard Worker   {"file://localhost/path?query#frag",
1215*6236dae4SAndroid Build Coastguard Worker    "foo#another",
1216*6236dae4SAndroid Build Coastguard Worker    "file:///foo#another",
1217*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1218*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/path?query#frag",
1219*6236dae4SAndroid Build Coastguard Worker    "https://two.example.com/bradnew",
1220*6236dae4SAndroid Build Coastguard Worker    "https://two.example.com/bradnew",
1221*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1222*6236dae4SAndroid Build Coastguard Worker   {"http://example.com/path?query#frag",
1223*6236dae4SAndroid Build Coastguard Worker    "../../newpage#foo",
1224*6236dae4SAndroid Build Coastguard Worker    "http://example.com/newpage#foo",
1225*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1226*6236dae4SAndroid Build Coastguard Worker   {"http://user:[email protected]/path?query#frag",
1227*6236dae4SAndroid Build Coastguard Worker    "../../newpage",
1228*6236dae4SAndroid Build Coastguard Worker    "http://user:[email protected]/newpage",
1229*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1230*6236dae4SAndroid Build Coastguard Worker   {"http://user:[email protected]/path?query#frag",
1231*6236dae4SAndroid Build Coastguard Worker    "../newpage",
1232*6236dae4SAndroid Build Coastguard Worker    "http://user:[email protected]/newpage",
1233*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1234*6236dae4SAndroid Build Coastguard Worker   {"http://user:[email protected]/path?query#frag",
1235*6236dae4SAndroid Build Coastguard Worker    "http://?hi",
1236*6236dae4SAndroid Build Coastguard Worker    "http:///?hi",
1237*6236dae4SAndroid Build Coastguard Worker    0, CURLU_NO_AUTHORITY, CURLUE_OK},
1238*6236dae4SAndroid Build Coastguard Worker   {NULL, NULL, NULL, 0, 0, CURLUE_OK}
1239*6236dae4SAndroid Build Coastguard Worker };
1240*6236dae4SAndroid Build Coastguard Worker 
set_url(void)1241*6236dae4SAndroid Build Coastguard Worker static int set_url(void)
1242*6236dae4SAndroid Build Coastguard Worker {
1243*6236dae4SAndroid Build Coastguard Worker   int i;
1244*6236dae4SAndroid Build Coastguard Worker   int error = 0;
1245*6236dae4SAndroid Build Coastguard Worker 
1246*6236dae4SAndroid Build Coastguard Worker   for(i = 0; set_url_list[i].in && !error; i++) {
1247*6236dae4SAndroid Build Coastguard Worker     CURLUcode rc;
1248*6236dae4SAndroid Build Coastguard Worker     CURLU *urlp = curl_url();
1249*6236dae4SAndroid Build Coastguard Worker     if(!urlp)
1250*6236dae4SAndroid Build Coastguard Worker       break;
1251*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_set(urlp, CURLUPART_URL, set_url_list[i].in,
1252*6236dae4SAndroid Build Coastguard Worker                       set_url_list[i].urlflags);
1253*6236dae4SAndroid Build Coastguard Worker     if(!rc) {
1254*6236dae4SAndroid Build Coastguard Worker       rc = curl_url_set(urlp, CURLUPART_URL, set_url_list[i].set,
1255*6236dae4SAndroid Build Coastguard Worker                         set_url_list[i].setflags);
1256*6236dae4SAndroid Build Coastguard Worker       if(rc) {
1257*6236dae4SAndroid Build Coastguard Worker         fprintf(stderr, "%s:%d Set URL %s returned %d (%s)\n",
1258*6236dae4SAndroid Build Coastguard Worker                 __FILE__, __LINE__, set_url_list[i].set,
1259*6236dae4SAndroid Build Coastguard Worker                 (int)rc, curl_url_strerror(rc));
1260*6236dae4SAndroid Build Coastguard Worker         error++;
1261*6236dae4SAndroid Build Coastguard Worker       }
1262*6236dae4SAndroid Build Coastguard Worker       else {
1263*6236dae4SAndroid Build Coastguard Worker         char *url = NULL;
1264*6236dae4SAndroid Build Coastguard Worker         rc = curl_url_get(urlp, CURLUPART_URL, &url, 0);
1265*6236dae4SAndroid Build Coastguard Worker         if(rc) {
1266*6236dae4SAndroid Build Coastguard Worker           fprintf(stderr, "%s:%d Get URL returned %d (%s)\n",
1267*6236dae4SAndroid Build Coastguard Worker                   __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1268*6236dae4SAndroid Build Coastguard Worker           error++;
1269*6236dae4SAndroid Build Coastguard Worker         }
1270*6236dae4SAndroid Build Coastguard Worker         else {
1271*6236dae4SAndroid Build Coastguard Worker           if(checkurl(set_url_list[i].in, url, set_url_list[i].out)) {
1272*6236dae4SAndroid Build Coastguard Worker             error++;
1273*6236dae4SAndroid Build Coastguard Worker           }
1274*6236dae4SAndroid Build Coastguard Worker         }
1275*6236dae4SAndroid Build Coastguard Worker         curl_free(url);
1276*6236dae4SAndroid Build Coastguard Worker       }
1277*6236dae4SAndroid Build Coastguard Worker     }
1278*6236dae4SAndroid Build Coastguard Worker     else if(rc != set_url_list[i].ucode) {
1279*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "Set URL\nin: %s\nreturned %d (expected %d)\n",
1280*6236dae4SAndroid Build Coastguard Worker               set_url_list[i].in, (int)rc, set_url_list[i].ucode);
1281*6236dae4SAndroid Build Coastguard Worker       error++;
1282*6236dae4SAndroid Build Coastguard Worker     }
1283*6236dae4SAndroid Build Coastguard Worker     curl_url_cleanup(urlp);
1284*6236dae4SAndroid Build Coastguard Worker   }
1285*6236dae4SAndroid Build Coastguard Worker   return error;
1286*6236dae4SAndroid Build Coastguard Worker }
1287*6236dae4SAndroid Build Coastguard Worker 
1288*6236dae4SAndroid Build Coastguard Worker /* 1. Set a URL
1289*6236dae4SAndroid Build Coastguard Worker    2. Set one or more parts
1290*6236dae4SAndroid Build Coastguard Worker    3. Extract and compare all parts - not the URL
1291*6236dae4SAndroid Build Coastguard Worker */
setget_parts(void)1292*6236dae4SAndroid Build Coastguard Worker static int setget_parts(void)
1293*6236dae4SAndroid Build Coastguard Worker {
1294*6236dae4SAndroid Build Coastguard Worker   int i;
1295*6236dae4SAndroid Build Coastguard Worker   int error = 0;
1296*6236dae4SAndroid Build Coastguard Worker 
1297*6236dae4SAndroid Build Coastguard Worker   for(i = 0; setget_parts_list[i].set && !error; i++) {
1298*6236dae4SAndroid Build Coastguard Worker     CURLUcode rc;
1299*6236dae4SAndroid Build Coastguard Worker     CURLU *urlp = curl_url();
1300*6236dae4SAndroid Build Coastguard Worker     if(!urlp) {
1301*6236dae4SAndroid Build Coastguard Worker       error++;
1302*6236dae4SAndroid Build Coastguard Worker       break;
1303*6236dae4SAndroid Build Coastguard Worker     }
1304*6236dae4SAndroid Build Coastguard Worker     if(setget_parts_list[i].in)
1305*6236dae4SAndroid Build Coastguard Worker       rc = curl_url_set(urlp, CURLUPART_URL, setget_parts_list[i].in,
1306*6236dae4SAndroid Build Coastguard Worker                         setget_parts_list[i].urlflags);
1307*6236dae4SAndroid Build Coastguard Worker     else
1308*6236dae4SAndroid Build Coastguard Worker       rc = CURLUE_OK;
1309*6236dae4SAndroid Build Coastguard Worker     if(!rc) {
1310*6236dae4SAndroid Build Coastguard Worker       char *url = NULL;
1311*6236dae4SAndroid Build Coastguard Worker       CURLUcode uc = updateurl(urlp, setget_parts_list[i].set,
1312*6236dae4SAndroid Build Coastguard Worker                                setget_parts_list[i].setflags);
1313*6236dae4SAndroid Build Coastguard Worker 
1314*6236dae4SAndroid Build Coastguard Worker       if(uc != setget_parts_list[i].pcode) {
1315*6236dae4SAndroid Build Coastguard Worker         fprintf(stderr, "updateurl\nin: %s\nreturned %d (expected %d)\n",
1316*6236dae4SAndroid Build Coastguard Worker                 setget_parts_list[i].set, (int)uc, setget_parts_list[i].pcode);
1317*6236dae4SAndroid Build Coastguard Worker         error++;
1318*6236dae4SAndroid Build Coastguard Worker       }
1319*6236dae4SAndroid Build Coastguard Worker       if(!uc) {
1320*6236dae4SAndroid Build Coastguard Worker         if(checkparts(urlp, setget_parts_list[i].set, setget_parts_list[i].out,
1321*6236dae4SAndroid Build Coastguard Worker                       setget_parts_list[i].getflags))
1322*6236dae4SAndroid Build Coastguard Worker           error++;        /* add */
1323*6236dae4SAndroid Build Coastguard Worker       }
1324*6236dae4SAndroid Build Coastguard Worker       curl_free(url);
1325*6236dae4SAndroid Build Coastguard Worker     }
1326*6236dae4SAndroid Build Coastguard Worker     else if(rc != CURLUE_OK) {
1327*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "Set parts\nin: %s\nreturned %d (expected %d)\n",
1328*6236dae4SAndroid Build Coastguard Worker               setget_parts_list[i].in, (int)rc, 0);
1329*6236dae4SAndroid Build Coastguard Worker       error++;
1330*6236dae4SAndroid Build Coastguard Worker     }
1331*6236dae4SAndroid Build Coastguard Worker     curl_url_cleanup(urlp);
1332*6236dae4SAndroid Build Coastguard Worker   }
1333*6236dae4SAndroid Build Coastguard Worker   return error;
1334*6236dae4SAndroid Build Coastguard Worker }
1335*6236dae4SAndroid Build Coastguard Worker 
set_parts(void)1336*6236dae4SAndroid Build Coastguard Worker static int set_parts(void)
1337*6236dae4SAndroid Build Coastguard Worker {
1338*6236dae4SAndroid Build Coastguard Worker   int i;
1339*6236dae4SAndroid Build Coastguard Worker   int error = 0;
1340*6236dae4SAndroid Build Coastguard Worker 
1341*6236dae4SAndroid Build Coastguard Worker   for(i = 0; set_parts_list[i].set && !error; i++) {
1342*6236dae4SAndroid Build Coastguard Worker     CURLUcode rc;
1343*6236dae4SAndroid Build Coastguard Worker     CURLU *urlp = curl_url();
1344*6236dae4SAndroid Build Coastguard Worker     if(!urlp) {
1345*6236dae4SAndroid Build Coastguard Worker       error++;
1346*6236dae4SAndroid Build Coastguard Worker       break;
1347*6236dae4SAndroid Build Coastguard Worker     }
1348*6236dae4SAndroid Build Coastguard Worker     if(set_parts_list[i].in)
1349*6236dae4SAndroid Build Coastguard Worker       rc = curl_url_set(urlp, CURLUPART_URL, set_parts_list[i].in,
1350*6236dae4SAndroid Build Coastguard Worker                         set_parts_list[i].urlflags);
1351*6236dae4SAndroid Build Coastguard Worker     else
1352*6236dae4SAndroid Build Coastguard Worker       rc = CURLUE_OK;
1353*6236dae4SAndroid Build Coastguard Worker     if(!rc) {
1354*6236dae4SAndroid Build Coastguard Worker       char *url = NULL;
1355*6236dae4SAndroid Build Coastguard Worker       CURLUcode uc = updateurl(urlp, set_parts_list[i].set,
1356*6236dae4SAndroid Build Coastguard Worker                                set_parts_list[i].setflags);
1357*6236dae4SAndroid Build Coastguard Worker 
1358*6236dae4SAndroid Build Coastguard Worker       if(uc != set_parts_list[i].pcode) {
1359*6236dae4SAndroid Build Coastguard Worker         fprintf(stderr, "updateurl\nin: %s\nreturned %d (expected %d)\n",
1360*6236dae4SAndroid Build Coastguard Worker                 set_parts_list[i].set, (int)uc, set_parts_list[i].pcode);
1361*6236dae4SAndroid Build Coastguard Worker         error++;
1362*6236dae4SAndroid Build Coastguard Worker       }
1363*6236dae4SAndroid Build Coastguard Worker       if(!uc) {
1364*6236dae4SAndroid Build Coastguard Worker         /* only do this if it worked */
1365*6236dae4SAndroid Build Coastguard Worker         rc = curl_url_get(urlp, CURLUPART_URL, &url, 0);
1366*6236dae4SAndroid Build Coastguard Worker 
1367*6236dae4SAndroid Build Coastguard Worker         if(rc) {
1368*6236dae4SAndroid Build Coastguard Worker           fprintf(stderr, "%s:%d Get URL returned %d (%s)\n",
1369*6236dae4SAndroid Build Coastguard Worker                   __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1370*6236dae4SAndroid Build Coastguard Worker           error++;
1371*6236dae4SAndroid Build Coastguard Worker         }
1372*6236dae4SAndroid Build Coastguard Worker         else if(checkurl(set_parts_list[i].in, url, set_parts_list[i].out)) {
1373*6236dae4SAndroid Build Coastguard Worker           error++;
1374*6236dae4SAndroid Build Coastguard Worker         }
1375*6236dae4SAndroid Build Coastguard Worker       }
1376*6236dae4SAndroid Build Coastguard Worker       curl_free(url);
1377*6236dae4SAndroid Build Coastguard Worker     }
1378*6236dae4SAndroid Build Coastguard Worker     else if(rc != set_parts_list[i].ucode) {
1379*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "Set parts\nin: %s\nreturned %d (expected %d)\n",
1380*6236dae4SAndroid Build Coastguard Worker               set_parts_list[i].in, (int)rc, set_parts_list[i].ucode);
1381*6236dae4SAndroid Build Coastguard Worker       error++;
1382*6236dae4SAndroid Build Coastguard Worker     }
1383*6236dae4SAndroid Build Coastguard Worker     curl_url_cleanup(urlp);
1384*6236dae4SAndroid Build Coastguard Worker   }
1385*6236dae4SAndroid Build Coastguard Worker   return error;
1386*6236dae4SAndroid Build Coastguard Worker }
1387*6236dae4SAndroid Build Coastguard Worker 
get_url(void)1388*6236dae4SAndroid Build Coastguard Worker static int get_url(void)
1389*6236dae4SAndroid Build Coastguard Worker {
1390*6236dae4SAndroid Build Coastguard Worker   int i;
1391*6236dae4SAndroid Build Coastguard Worker   int error = 0;
1392*6236dae4SAndroid Build Coastguard Worker   for(i = 0; get_url_list[i].in && !error; i++) {
1393*6236dae4SAndroid Build Coastguard Worker     CURLUcode rc;
1394*6236dae4SAndroid Build Coastguard Worker     CURLU *urlp = curl_url();
1395*6236dae4SAndroid Build Coastguard Worker     if(!urlp) {
1396*6236dae4SAndroid Build Coastguard Worker       error++;
1397*6236dae4SAndroid Build Coastguard Worker       break;
1398*6236dae4SAndroid Build Coastguard Worker     }
1399*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_set(urlp, CURLUPART_URL, get_url_list[i].in,
1400*6236dae4SAndroid Build Coastguard Worker                       get_url_list[i].urlflags);
1401*6236dae4SAndroid Build Coastguard Worker     if(!rc) {
1402*6236dae4SAndroid Build Coastguard Worker       char *url = NULL;
1403*6236dae4SAndroid Build Coastguard Worker       rc = curl_url_get(urlp, CURLUPART_URL, &url, get_url_list[i].getflags);
1404*6236dae4SAndroid Build Coastguard Worker 
1405*6236dae4SAndroid Build Coastguard Worker       if(rc) {
1406*6236dae4SAndroid Build Coastguard Worker         fprintf(stderr, "%s:%d returned %d (%s). URL: '%s'\n",
1407*6236dae4SAndroid Build Coastguard Worker                 __FILE__, __LINE__, (int)rc, curl_url_strerror(rc),
1408*6236dae4SAndroid Build Coastguard Worker                 get_url_list[i].in);
1409*6236dae4SAndroid Build Coastguard Worker         error++;
1410*6236dae4SAndroid Build Coastguard Worker       }
1411*6236dae4SAndroid Build Coastguard Worker       else {
1412*6236dae4SAndroid Build Coastguard Worker         if(checkurl(get_url_list[i].in, url, get_url_list[i].out)) {
1413*6236dae4SAndroid Build Coastguard Worker           error++;
1414*6236dae4SAndroid Build Coastguard Worker         }
1415*6236dae4SAndroid Build Coastguard Worker       }
1416*6236dae4SAndroid Build Coastguard Worker       curl_free(url);
1417*6236dae4SAndroid Build Coastguard Worker     }
1418*6236dae4SAndroid Build Coastguard Worker     if(rc != get_url_list[i].ucode) {
1419*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "Get URL\nin: %s\nreturned %d (expected %d)\n",
1420*6236dae4SAndroid Build Coastguard Worker               get_url_list[i].in, (int)rc, get_url_list[i].ucode);
1421*6236dae4SAndroid Build Coastguard Worker       error++;
1422*6236dae4SAndroid Build Coastguard Worker     }
1423*6236dae4SAndroid Build Coastguard Worker     curl_url_cleanup(urlp);
1424*6236dae4SAndroid Build Coastguard Worker   }
1425*6236dae4SAndroid Build Coastguard Worker   return error;
1426*6236dae4SAndroid Build Coastguard Worker }
1427*6236dae4SAndroid Build Coastguard Worker 
get_parts(void)1428*6236dae4SAndroid Build Coastguard Worker static int get_parts(void)
1429*6236dae4SAndroid Build Coastguard Worker {
1430*6236dae4SAndroid Build Coastguard Worker   int i;
1431*6236dae4SAndroid Build Coastguard Worker   int error = 0;
1432*6236dae4SAndroid Build Coastguard Worker   for(i = 0; get_parts_list[i].in && !error; i++) {
1433*6236dae4SAndroid Build Coastguard Worker     CURLUcode rc;
1434*6236dae4SAndroid Build Coastguard Worker     CURLU *urlp = curl_url();
1435*6236dae4SAndroid Build Coastguard Worker     if(!urlp) {
1436*6236dae4SAndroid Build Coastguard Worker       error++;
1437*6236dae4SAndroid Build Coastguard Worker       break;
1438*6236dae4SAndroid Build Coastguard Worker     }
1439*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_set(urlp, CURLUPART_URL,
1440*6236dae4SAndroid Build Coastguard Worker                       get_parts_list[i].in,
1441*6236dae4SAndroid Build Coastguard Worker                       get_parts_list[i].urlflags);
1442*6236dae4SAndroid Build Coastguard Worker     if(rc != get_parts_list[i].ucode) {
1443*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "Get parts\nin: %s\nreturned %d (expected %d)\n",
1444*6236dae4SAndroid Build Coastguard Worker               get_parts_list[i].in, (int)rc, get_parts_list[i].ucode);
1445*6236dae4SAndroid Build Coastguard Worker       error++;
1446*6236dae4SAndroid Build Coastguard Worker     }
1447*6236dae4SAndroid Build Coastguard Worker     else if(get_parts_list[i].ucode) {
1448*6236dae4SAndroid Build Coastguard Worker       /* the expected error happened */
1449*6236dae4SAndroid Build Coastguard Worker     }
1450*6236dae4SAndroid Build Coastguard Worker     else if(checkparts(urlp, get_parts_list[i].in, get_parts_list[i].out,
1451*6236dae4SAndroid Build Coastguard Worker                        get_parts_list[i].getflags))
1452*6236dae4SAndroid Build Coastguard Worker       error++;
1453*6236dae4SAndroid Build Coastguard Worker     curl_url_cleanup(urlp);
1454*6236dae4SAndroid Build Coastguard Worker   }
1455*6236dae4SAndroid Build Coastguard Worker   return error;
1456*6236dae4SAndroid Build Coastguard Worker }
1457*6236dae4SAndroid Build Coastguard Worker 
1458*6236dae4SAndroid Build Coastguard Worker static const struct querycase append_list[] = {
1459*6236dae4SAndroid Build Coastguard Worker   {"HTTP://test/?s", "name=joe\x02", "http://test/?s&name=joe%02",
1460*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, CURLUE_OK},
1461*6236dae4SAndroid Build Coastguard Worker   {"HTTP://test/?size=2#f", "name=joe=", "http://test/?size=2&name=joe%3d#f",
1462*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, CURLUE_OK},
1463*6236dae4SAndroid Build Coastguard Worker   {"HTTP://test/?size=2#f", "name=joe doe",
1464*6236dae4SAndroid Build Coastguard Worker    "http://test/?size=2&name=joe+doe#f",
1465*6236dae4SAndroid Build Coastguard Worker    0, CURLU_URLENCODE, CURLUE_OK},
1466*6236dae4SAndroid Build Coastguard Worker   {"HTTP://test/", "name=joe", "http://test/?name=joe", 0, 0, CURLUE_OK},
1467*6236dae4SAndroid Build Coastguard Worker   {"HTTP://test/?size=2", "name=joe", "http://test/?size=2&name=joe",
1468*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1469*6236dae4SAndroid Build Coastguard Worker   {"HTTP://test/?size=2&", "name=joe", "http://test/?size=2&name=joe",
1470*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1471*6236dae4SAndroid Build Coastguard Worker   {"HTTP://test/?size=2#f", "name=joe", "http://test/?size=2&name=joe#f",
1472*6236dae4SAndroid Build Coastguard Worker    0, 0, CURLUE_OK},
1473*6236dae4SAndroid Build Coastguard Worker   {NULL, NULL, NULL, 0, 0, CURLUE_OK}
1474*6236dae4SAndroid Build Coastguard Worker };
1475*6236dae4SAndroid Build Coastguard Worker 
append(void)1476*6236dae4SAndroid Build Coastguard Worker static int append(void)
1477*6236dae4SAndroid Build Coastguard Worker {
1478*6236dae4SAndroid Build Coastguard Worker   int i;
1479*6236dae4SAndroid Build Coastguard Worker   int error = 0;
1480*6236dae4SAndroid Build Coastguard Worker   for(i = 0; append_list[i].in && !error; i++) {
1481*6236dae4SAndroid Build Coastguard Worker     CURLUcode rc;
1482*6236dae4SAndroid Build Coastguard Worker     CURLU *urlp = curl_url();
1483*6236dae4SAndroid Build Coastguard Worker     if(!urlp) {
1484*6236dae4SAndroid Build Coastguard Worker       error++;
1485*6236dae4SAndroid Build Coastguard Worker       break;
1486*6236dae4SAndroid Build Coastguard Worker     }
1487*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_set(urlp, CURLUPART_URL,
1488*6236dae4SAndroid Build Coastguard Worker                       append_list[i].in,
1489*6236dae4SAndroid Build Coastguard Worker                       append_list[i].urlflags);
1490*6236dae4SAndroid Build Coastguard Worker     if(rc)
1491*6236dae4SAndroid Build Coastguard Worker       error++;
1492*6236dae4SAndroid Build Coastguard Worker     else
1493*6236dae4SAndroid Build Coastguard Worker       rc = curl_url_set(urlp, CURLUPART_QUERY,
1494*6236dae4SAndroid Build Coastguard Worker                         append_list[i].q,
1495*6236dae4SAndroid Build Coastguard Worker                         append_list[i].qflags | CURLU_APPENDQUERY);
1496*6236dae4SAndroid Build Coastguard Worker     if(error)
1497*6236dae4SAndroid Build Coastguard Worker       ;
1498*6236dae4SAndroid Build Coastguard Worker     else if(rc != append_list[i].ucode) {
1499*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "Append\nin: %s\nreturned %d (expected %d)\n",
1500*6236dae4SAndroid Build Coastguard Worker               append_list[i].in, (int)rc, append_list[i].ucode);
1501*6236dae4SAndroid Build Coastguard Worker       error++;
1502*6236dae4SAndroid Build Coastguard Worker     }
1503*6236dae4SAndroid Build Coastguard Worker     else if(append_list[i].ucode) {
1504*6236dae4SAndroid Build Coastguard Worker       /* the expected error happened */
1505*6236dae4SAndroid Build Coastguard Worker     }
1506*6236dae4SAndroid Build Coastguard Worker     else {
1507*6236dae4SAndroid Build Coastguard Worker       char *url;
1508*6236dae4SAndroid Build Coastguard Worker       rc = curl_url_get(urlp, CURLUPART_URL, &url, 0);
1509*6236dae4SAndroid Build Coastguard Worker       if(rc) {
1510*6236dae4SAndroid Build Coastguard Worker         fprintf(stderr, "%s:%d Get URL returned %d (%s)\n",
1511*6236dae4SAndroid Build Coastguard Worker                 __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1512*6236dae4SAndroid Build Coastguard Worker         error++;
1513*6236dae4SAndroid Build Coastguard Worker       }
1514*6236dae4SAndroid Build Coastguard Worker       else {
1515*6236dae4SAndroid Build Coastguard Worker         if(checkurl(append_list[i].in, url, append_list[i].out)) {
1516*6236dae4SAndroid Build Coastguard Worker           error++;
1517*6236dae4SAndroid Build Coastguard Worker         }
1518*6236dae4SAndroid Build Coastguard Worker         curl_free(url);
1519*6236dae4SAndroid Build Coastguard Worker       }
1520*6236dae4SAndroid Build Coastguard Worker     }
1521*6236dae4SAndroid Build Coastguard Worker     curl_url_cleanup(urlp);
1522*6236dae4SAndroid Build Coastguard Worker   }
1523*6236dae4SAndroid Build Coastguard Worker   return error;
1524*6236dae4SAndroid Build Coastguard Worker }
1525*6236dae4SAndroid Build Coastguard Worker 
scopeid(void)1526*6236dae4SAndroid Build Coastguard Worker static int scopeid(void)
1527*6236dae4SAndroid Build Coastguard Worker {
1528*6236dae4SAndroid Build Coastguard Worker   CURLU *u = curl_url();
1529*6236dae4SAndroid Build Coastguard Worker   int error = 0;
1530*6236dae4SAndroid Build Coastguard Worker   CURLUcode rc;
1531*6236dae4SAndroid Build Coastguard Worker   char *url;
1532*6236dae4SAndroid Build Coastguard Worker 
1533*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_set(u, CURLUPART_URL,
1534*6236dae4SAndroid Build Coastguard Worker                     "https://[fe80::20c:29ff:fe9c:409b%25eth0]/hello.html", 0);
1535*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1536*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_set returned %d (%s)\n",
1537*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1538*6236dae4SAndroid Build Coastguard Worker     error++;
1539*6236dae4SAndroid Build Coastguard Worker   }
1540*6236dae4SAndroid Build Coastguard Worker 
1541*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_get(u, CURLUPART_HOST, &url, 0);
1542*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1543*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_get CURLUPART_HOST returned %d (%s)\n",
1544*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1545*6236dae4SAndroid Build Coastguard Worker     error++;
1546*6236dae4SAndroid Build Coastguard Worker   }
1547*6236dae4SAndroid Build Coastguard Worker   else {
1548*6236dae4SAndroid Build Coastguard Worker     curl_free(url);
1549*6236dae4SAndroid Build Coastguard Worker   }
1550*6236dae4SAndroid Build Coastguard Worker 
1551*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_set(u, CURLUPART_HOST, "[::1]", 0);
1552*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1553*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d (%s)\n",
1554*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1555*6236dae4SAndroid Build Coastguard Worker     error++;
1556*6236dae4SAndroid Build Coastguard Worker   }
1557*6236dae4SAndroid Build Coastguard Worker 
1558*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_get(u, CURLUPART_URL, &url, 0);
1559*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1560*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d (%s)\n",
1561*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1562*6236dae4SAndroid Build Coastguard Worker     error++;
1563*6236dae4SAndroid Build Coastguard Worker   }
1564*6236dae4SAndroid Build Coastguard Worker   else {
1565*6236dae4SAndroid Build Coastguard Worker     curl_free(url);
1566*6236dae4SAndroid Build Coastguard Worker   }
1567*6236dae4SAndroid Build Coastguard Worker 
1568*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_set(u, CURLUPART_HOST, "example.com", 0);
1569*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1570*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d (%s)\n",
1571*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1572*6236dae4SAndroid Build Coastguard Worker     error++;
1573*6236dae4SAndroid Build Coastguard Worker   }
1574*6236dae4SAndroid Build Coastguard Worker 
1575*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_get(u, CURLUPART_URL, &url, 0);
1576*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1577*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d (%s)\n",
1578*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1579*6236dae4SAndroid Build Coastguard Worker     error++;
1580*6236dae4SAndroid Build Coastguard Worker   }
1581*6236dae4SAndroid Build Coastguard Worker   else {
1582*6236dae4SAndroid Build Coastguard Worker     curl_free(url);
1583*6236dae4SAndroid Build Coastguard Worker   }
1584*6236dae4SAndroid Build Coastguard Worker 
1585*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_set(u, CURLUPART_HOST,
1586*6236dae4SAndroid Build Coastguard Worker                     "[fe80::20c:29ff:fe9c:409b%25eth0]", 0);
1587*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1588*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_set CURLUPART_HOST returned %d (%s)\n",
1589*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1590*6236dae4SAndroid Build Coastguard Worker     error++;
1591*6236dae4SAndroid Build Coastguard Worker   }
1592*6236dae4SAndroid Build Coastguard Worker 
1593*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_get(u, CURLUPART_URL, &url, 0);
1594*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1595*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d (%s)\n",
1596*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1597*6236dae4SAndroid Build Coastguard Worker     error++;
1598*6236dae4SAndroid Build Coastguard Worker   }
1599*6236dae4SAndroid Build Coastguard Worker   else {
1600*6236dae4SAndroid Build Coastguard Worker     curl_free(url);
1601*6236dae4SAndroid Build Coastguard Worker   }
1602*6236dae4SAndroid Build Coastguard Worker 
1603*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_get(u, CURLUPART_HOST, &url, 0);
1604*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1605*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_get CURLUPART_HOST returned %d (%s)\n",
1606*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1607*6236dae4SAndroid Build Coastguard Worker     error++;
1608*6236dae4SAndroid Build Coastguard Worker   }
1609*6236dae4SAndroid Build Coastguard Worker   else {
1610*6236dae4SAndroid Build Coastguard Worker     curl_free(url);
1611*6236dae4SAndroid Build Coastguard Worker   }
1612*6236dae4SAndroid Build Coastguard Worker 
1613*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_get(u, CURLUPART_ZONEID, &url, 0);
1614*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1615*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_get CURLUPART_ZONEID returned %d (%s)\n",
1616*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1617*6236dae4SAndroid Build Coastguard Worker     error++;
1618*6236dae4SAndroid Build Coastguard Worker   }
1619*6236dae4SAndroid Build Coastguard Worker   else {
1620*6236dae4SAndroid Build Coastguard Worker     curl_free(url);
1621*6236dae4SAndroid Build Coastguard Worker   }
1622*6236dae4SAndroid Build Coastguard Worker 
1623*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_set(u, CURLUPART_ZONEID, "clown", 0);
1624*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1625*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_set CURLUPART_ZONEID returned %d (%s)\n",
1626*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1627*6236dae4SAndroid Build Coastguard Worker     error++;
1628*6236dae4SAndroid Build Coastguard Worker   }
1629*6236dae4SAndroid Build Coastguard Worker 
1630*6236dae4SAndroid Build Coastguard Worker   rc = curl_url_get(u, CURLUPART_URL, &url, 0);
1631*6236dae4SAndroid Build Coastguard Worker   if(rc != CURLUE_OK) {
1632*6236dae4SAndroid Build Coastguard Worker     fprintf(stderr, "%s:%d curl_url_get CURLUPART_URL returned %d (%s)\n",
1633*6236dae4SAndroid Build Coastguard Worker             __FILE__, __LINE__, (int)rc, curl_url_strerror(rc));
1634*6236dae4SAndroid Build Coastguard Worker     error++;
1635*6236dae4SAndroid Build Coastguard Worker   }
1636*6236dae4SAndroid Build Coastguard Worker   else {
1637*6236dae4SAndroid Build Coastguard Worker     curl_free(url);
1638*6236dae4SAndroid Build Coastguard Worker   }
1639*6236dae4SAndroid Build Coastguard Worker 
1640*6236dae4SAndroid Build Coastguard Worker   curl_url_cleanup(u);
1641*6236dae4SAndroid Build Coastguard Worker 
1642*6236dae4SAndroid Build Coastguard Worker   return error;
1643*6236dae4SAndroid Build Coastguard Worker }
1644*6236dae4SAndroid Build Coastguard Worker 
get_nothing(void)1645*6236dae4SAndroid Build Coastguard Worker static int get_nothing(void)
1646*6236dae4SAndroid Build Coastguard Worker {
1647*6236dae4SAndroid Build Coastguard Worker   CURLU *u = curl_url();
1648*6236dae4SAndroid Build Coastguard Worker   if(u) {
1649*6236dae4SAndroid Build Coastguard Worker     char *p;
1650*6236dae4SAndroid Build Coastguard Worker     CURLUcode rc;
1651*6236dae4SAndroid Build Coastguard Worker 
1652*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(u, CURLUPART_SCHEME, &p, 0);
1653*6236dae4SAndroid Build Coastguard Worker     if(rc != CURLUE_NO_SCHEME)
1654*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1655*6236dae4SAndroid Build Coastguard Worker 
1656*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(u, CURLUPART_HOST, &p, 0);
1657*6236dae4SAndroid Build Coastguard Worker     if(rc != CURLUE_NO_HOST)
1658*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1659*6236dae4SAndroid Build Coastguard Worker 
1660*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(u, CURLUPART_USER, &p, 0);
1661*6236dae4SAndroid Build Coastguard Worker     if(rc != CURLUE_NO_USER)
1662*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1663*6236dae4SAndroid Build Coastguard Worker 
1664*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(u, CURLUPART_PASSWORD, &p, 0);
1665*6236dae4SAndroid Build Coastguard Worker     if(rc != CURLUE_NO_PASSWORD)
1666*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1667*6236dae4SAndroid Build Coastguard Worker 
1668*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(u, CURLUPART_OPTIONS, &p, 0);
1669*6236dae4SAndroid Build Coastguard Worker     if(rc != CURLUE_NO_OPTIONS)
1670*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1671*6236dae4SAndroid Build Coastguard Worker 
1672*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(u, CURLUPART_PATH, &p, 0);
1673*6236dae4SAndroid Build Coastguard Worker     if(rc != CURLUE_OK)
1674*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1675*6236dae4SAndroid Build Coastguard Worker     else
1676*6236dae4SAndroid Build Coastguard Worker       curl_free(p);
1677*6236dae4SAndroid Build Coastguard Worker 
1678*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(u, CURLUPART_QUERY, &p, 0);
1679*6236dae4SAndroid Build Coastguard Worker     if(rc != CURLUE_NO_QUERY)
1680*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1681*6236dae4SAndroid Build Coastguard Worker 
1682*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(u, CURLUPART_FRAGMENT, &p, 0);
1683*6236dae4SAndroid Build Coastguard Worker     if(rc != CURLUE_NO_FRAGMENT)
1684*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1685*6236dae4SAndroid Build Coastguard Worker 
1686*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(u, CURLUPART_ZONEID, &p, 0);
1687*6236dae4SAndroid Build Coastguard Worker     if(rc != CURLUE_NO_ZONEID)
1688*6236dae4SAndroid Build Coastguard Worker       fprintf(stderr, "unexpected return code %u on line %u\n", (int)rc,
1689*6236dae4SAndroid Build Coastguard Worker               __LINE__);
1690*6236dae4SAndroid Build Coastguard Worker 
1691*6236dae4SAndroid Build Coastguard Worker     curl_url_cleanup(u);
1692*6236dae4SAndroid Build Coastguard Worker   }
1693*6236dae4SAndroid Build Coastguard Worker   return 0;
1694*6236dae4SAndroid Build Coastguard Worker }
1695*6236dae4SAndroid Build Coastguard Worker 
1696*6236dae4SAndroid Build Coastguard Worker static const struct clearurlcase clear_url_list[] ={
1697*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_SCHEME, "http", NULL, CURLUE_NO_SCHEME},
1698*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_USER, "user", NULL, CURLUE_NO_USER},
1699*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_PASSWORD, "password", NULL, CURLUE_NO_PASSWORD},
1700*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_OPTIONS, "options", NULL, CURLUE_NO_OPTIONS},
1701*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_HOST, "host", NULL, CURLUE_NO_HOST},
1702*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_ZONEID, "eth0", NULL, CURLUE_NO_ZONEID},
1703*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_PORT, "1234", NULL, CURLUE_NO_PORT},
1704*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_PATH, "/hello", "/", CURLUE_OK},
1705*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_QUERY, "a=b", NULL, CURLUE_NO_QUERY},
1706*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_FRAGMENT, "anchor", NULL, CURLUE_NO_FRAGMENT},
1707*6236dae4SAndroid Build Coastguard Worker   {CURLUPART_URL, NULL, NULL, CURLUE_OK},
1708*6236dae4SAndroid Build Coastguard Worker };
1709*6236dae4SAndroid Build Coastguard Worker 
clear_url(void)1710*6236dae4SAndroid Build Coastguard Worker static int clear_url(void)
1711*6236dae4SAndroid Build Coastguard Worker {
1712*6236dae4SAndroid Build Coastguard Worker   CURLU *u = curl_url();
1713*6236dae4SAndroid Build Coastguard Worker   int i, error = 0;
1714*6236dae4SAndroid Build Coastguard Worker   if(u) {
1715*6236dae4SAndroid Build Coastguard Worker     char *p = NULL;
1716*6236dae4SAndroid Build Coastguard Worker     CURLUcode rc;
1717*6236dae4SAndroid Build Coastguard Worker 
1718*6236dae4SAndroid Build Coastguard Worker     for(i = 0; clear_url_list[i].in && !error; i++) {
1719*6236dae4SAndroid Build Coastguard Worker       rc = curl_url_set(u, clear_url_list[i].part, clear_url_list[i].in, 0);
1720*6236dae4SAndroid Build Coastguard Worker       if(rc != CURLUE_OK)
1721*6236dae4SAndroid Build Coastguard Worker         fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1722*6236dae4SAndroid Build Coastguard Worker 
1723*6236dae4SAndroid Build Coastguard Worker       rc = curl_url_set(u, CURLUPART_URL, NULL, 0);
1724*6236dae4SAndroid Build Coastguard Worker       if(rc != CURLUE_OK)
1725*6236dae4SAndroid Build Coastguard Worker         fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1726*6236dae4SAndroid Build Coastguard Worker 
1727*6236dae4SAndroid Build Coastguard Worker       rc = curl_url_get(u, clear_url_list[i].part, &p, 0);
1728*6236dae4SAndroid Build Coastguard Worker       if(rc != clear_url_list[i].ucode || (clear_url_list[i].out &&
1729*6236dae4SAndroid Build Coastguard Worker          0 != strcmp(p, clear_url_list[i].out))) {
1730*6236dae4SAndroid Build Coastguard Worker 
1731*6236dae4SAndroid Build Coastguard Worker         fprintf(stderr, "unexpected return code line %u\n", __LINE__);
1732*6236dae4SAndroid Build Coastguard Worker         error++;
1733*6236dae4SAndroid Build Coastguard Worker       }
1734*6236dae4SAndroid Build Coastguard Worker       if(rc == CURLUE_OK)
1735*6236dae4SAndroid Build Coastguard Worker         curl_free(p);
1736*6236dae4SAndroid Build Coastguard Worker     }
1737*6236dae4SAndroid Build Coastguard Worker   }
1738*6236dae4SAndroid Build Coastguard Worker 
1739*6236dae4SAndroid Build Coastguard Worker   curl_url_cleanup(u);
1740*6236dae4SAndroid Build Coastguard Worker 
1741*6236dae4SAndroid Build Coastguard Worker   return error;
1742*6236dae4SAndroid Build Coastguard Worker }
1743*6236dae4SAndroid Build Coastguard Worker 
1744*6236dae4SAndroid Build Coastguard Worker static char total[128000];
1745*6236dae4SAndroid Build Coastguard Worker static char bigpart[120000];
1746*6236dae4SAndroid Build Coastguard Worker 
1747*6236dae4SAndroid Build Coastguard Worker /*
1748*6236dae4SAndroid Build Coastguard Worker  * verify ridiculous URL part sizes
1749*6236dae4SAndroid Build Coastguard Worker  */
huge(void)1750*6236dae4SAndroid Build Coastguard Worker static int huge(void)
1751*6236dae4SAndroid Build Coastguard Worker {
1752*6236dae4SAndroid Build Coastguard Worker   const char *smallpart = "c";
1753*6236dae4SAndroid Build Coastguard Worker   int i;
1754*6236dae4SAndroid Build Coastguard Worker   CURLU *urlp = curl_url();
1755*6236dae4SAndroid Build Coastguard Worker   CURLUcode rc;
1756*6236dae4SAndroid Build Coastguard Worker   CURLUPart part[]= {
1757*6236dae4SAndroid Build Coastguard Worker     CURLUPART_SCHEME,
1758*6236dae4SAndroid Build Coastguard Worker     CURLUPART_USER,
1759*6236dae4SAndroid Build Coastguard Worker     CURLUPART_PASSWORD,
1760*6236dae4SAndroid Build Coastguard Worker     CURLUPART_HOST,
1761*6236dae4SAndroid Build Coastguard Worker     CURLUPART_PATH,
1762*6236dae4SAndroid Build Coastguard Worker     CURLUPART_QUERY,
1763*6236dae4SAndroid Build Coastguard Worker     CURLUPART_FRAGMENT
1764*6236dae4SAndroid Build Coastguard Worker   };
1765*6236dae4SAndroid Build Coastguard Worker   int error = 0;
1766*6236dae4SAndroid Build Coastguard Worker   if(!urlp)
1767*6236dae4SAndroid Build Coastguard Worker     return 1;
1768*6236dae4SAndroid Build Coastguard Worker   bigpart[0] = '/'; /* for the path */
1769*6236dae4SAndroid Build Coastguard Worker   memset(&bigpart[1], 'a', sizeof(bigpart) - 2);
1770*6236dae4SAndroid Build Coastguard Worker   bigpart[sizeof(bigpart) - 1] = 0;
1771*6236dae4SAndroid Build Coastguard Worker 
1772*6236dae4SAndroid Build Coastguard Worker   for(i = 0; i <  7; i++) {
1773*6236dae4SAndroid Build Coastguard Worker     char *partp;
1774*6236dae4SAndroid Build Coastguard Worker     msnprintf(total, sizeof(total),
1775*6236dae4SAndroid Build Coastguard Worker               "%s://%s:%s@%s/%s?%s#%s",
1776*6236dae4SAndroid Build Coastguard Worker               (i == 0) ? &bigpart[1] : smallpart,
1777*6236dae4SAndroid Build Coastguard Worker               (i == 1) ? &bigpart[1] : smallpart,
1778*6236dae4SAndroid Build Coastguard Worker               (i == 2) ? &bigpart[1] : smallpart,
1779*6236dae4SAndroid Build Coastguard Worker               (i == 3) ? &bigpart[1] : smallpart,
1780*6236dae4SAndroid Build Coastguard Worker               (i == 4) ? &bigpart[1] : smallpart,
1781*6236dae4SAndroid Build Coastguard Worker               (i == 5) ? &bigpart[1] : smallpart,
1782*6236dae4SAndroid Build Coastguard Worker               (i == 6) ? &bigpart[1] : smallpart);
1783*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_set(urlp, CURLUPART_URL, total, CURLU_NON_SUPPORT_SCHEME);
1784*6236dae4SAndroid Build Coastguard Worker     if((!i && (rc != CURLUE_BAD_SCHEME)) ||
1785*6236dae4SAndroid Build Coastguard Worker        (i && rc)) {
1786*6236dae4SAndroid Build Coastguard Worker       printf("URL %u: failed to parse [%s]\n", i, total);
1787*6236dae4SAndroid Build Coastguard Worker       error++;
1788*6236dae4SAndroid Build Coastguard Worker     }
1789*6236dae4SAndroid Build Coastguard Worker 
1790*6236dae4SAndroid Build Coastguard Worker     /* only extract if the parse worked */
1791*6236dae4SAndroid Build Coastguard Worker     if(!rc) {
1792*6236dae4SAndroid Build Coastguard Worker       curl_url_get(urlp, part[i], &partp, 0);
1793*6236dae4SAndroid Build Coastguard Worker       if(!partp || strcmp(partp, &bigpart[1 - (i == 4)])) {
1794*6236dae4SAndroid Build Coastguard Worker         printf("URL %u part %u: failure\n", i, part[i]);
1795*6236dae4SAndroid Build Coastguard Worker         error++;
1796*6236dae4SAndroid Build Coastguard Worker       }
1797*6236dae4SAndroid Build Coastguard Worker       curl_free(partp);
1798*6236dae4SAndroid Build Coastguard Worker     }
1799*6236dae4SAndroid Build Coastguard Worker   }
1800*6236dae4SAndroid Build Coastguard Worker   curl_url_cleanup(urlp);
1801*6236dae4SAndroid Build Coastguard Worker   return error;
1802*6236dae4SAndroid Build Coastguard Worker }
1803*6236dae4SAndroid Build Coastguard Worker 
urldup(void)1804*6236dae4SAndroid Build Coastguard Worker static int urldup(void)
1805*6236dae4SAndroid Build Coastguard Worker {
1806*6236dae4SAndroid Build Coastguard Worker   const char *url[] = {
1807*6236dae4SAndroid Build Coastguard Worker     "http://"
1808*6236dae4SAndroid Build Coastguard Worker     "user:pwd@"
1809*6236dae4SAndroid Build Coastguard Worker     "[2a04:4e42:e00::347%25eth0]"
1810*6236dae4SAndroid Build Coastguard Worker     ":80"
1811*6236dae4SAndroid Build Coastguard Worker     "/path"
1812*6236dae4SAndroid Build Coastguard Worker     "?query"
1813*6236dae4SAndroid Build Coastguard Worker     "#fraggie",
1814*6236dae4SAndroid Build Coastguard Worker     "https://example.com",
1815*6236dae4SAndroid Build Coastguard Worker     "https://[email protected]",
1816*6236dae4SAndroid Build Coastguard Worker     "https://[email protected]",
1817*6236dae4SAndroid Build Coastguard Worker     "https://[email protected]:1234",
1818*6236dae4SAndroid Build Coastguard Worker     "https://example.com:1234",
1819*6236dae4SAndroid Build Coastguard Worker     "example.com:1234",
1820*6236dae4SAndroid Build Coastguard Worker     "https://[email protected]:1234/path?query#frag",
1821*6236dae4SAndroid Build Coastguard Worker     NULL
1822*6236dae4SAndroid Build Coastguard Worker   };
1823*6236dae4SAndroid Build Coastguard Worker   CURLU *copy = NULL;
1824*6236dae4SAndroid Build Coastguard Worker   char *h_str = NULL, *copy_str = NULL;
1825*6236dae4SAndroid Build Coastguard Worker   CURLU *h = curl_url();
1826*6236dae4SAndroid Build Coastguard Worker   int i;
1827*6236dae4SAndroid Build Coastguard Worker 
1828*6236dae4SAndroid Build Coastguard Worker   if(!h)
1829*6236dae4SAndroid Build Coastguard Worker     goto err;
1830*6236dae4SAndroid Build Coastguard Worker 
1831*6236dae4SAndroid Build Coastguard Worker   for(i = 0; url[i]; i++) {
1832*6236dae4SAndroid Build Coastguard Worker     CURLUcode rc = curl_url_set(h, CURLUPART_URL, url[i],
1833*6236dae4SAndroid Build Coastguard Worker                                 CURLU_GUESS_SCHEME);
1834*6236dae4SAndroid Build Coastguard Worker     if(rc)
1835*6236dae4SAndroid Build Coastguard Worker       goto err;
1836*6236dae4SAndroid Build Coastguard Worker     copy = curl_url_dup(h);
1837*6236dae4SAndroid Build Coastguard Worker 
1838*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(h, CURLUPART_URL, &h_str, 0);
1839*6236dae4SAndroid Build Coastguard Worker     if(rc)
1840*6236dae4SAndroid Build Coastguard Worker       goto err;
1841*6236dae4SAndroid Build Coastguard Worker 
1842*6236dae4SAndroid Build Coastguard Worker     rc = curl_url_get(copy, CURLUPART_URL, &copy_str, 0);
1843*6236dae4SAndroid Build Coastguard Worker     if(rc)
1844*6236dae4SAndroid Build Coastguard Worker       goto err;
1845*6236dae4SAndroid Build Coastguard Worker 
1846*6236dae4SAndroid Build Coastguard Worker     if(strcmp(h_str, copy_str)) {
1847*6236dae4SAndroid Build Coastguard Worker       printf("Original:  %s\nParsed:    %s\nCopy:      %s\n",
1848*6236dae4SAndroid Build Coastguard Worker              url[i], h_str, copy_str);
1849*6236dae4SAndroid Build Coastguard Worker       goto err;
1850*6236dae4SAndroid Build Coastguard Worker     }
1851*6236dae4SAndroid Build Coastguard Worker     curl_free(copy_str);
1852*6236dae4SAndroid Build Coastguard Worker     curl_free(h_str);
1853*6236dae4SAndroid Build Coastguard Worker     curl_url_cleanup(copy);
1854*6236dae4SAndroid Build Coastguard Worker     copy_str = NULL;
1855*6236dae4SAndroid Build Coastguard Worker     h_str = NULL;
1856*6236dae4SAndroid Build Coastguard Worker     copy = NULL;
1857*6236dae4SAndroid Build Coastguard Worker   }
1858*6236dae4SAndroid Build Coastguard Worker   curl_url_cleanup(h);
1859*6236dae4SAndroid Build Coastguard Worker   return 0;
1860*6236dae4SAndroid Build Coastguard Worker err:
1861*6236dae4SAndroid Build Coastguard Worker   curl_free(copy_str);
1862*6236dae4SAndroid Build Coastguard Worker   curl_free(h_str);
1863*6236dae4SAndroid Build Coastguard Worker   curl_url_cleanup(copy);
1864*6236dae4SAndroid Build Coastguard Worker   curl_url_cleanup(h);
1865*6236dae4SAndroid Build Coastguard Worker   return 1;
1866*6236dae4SAndroid Build Coastguard Worker }
1867*6236dae4SAndroid Build Coastguard Worker 
test(char * URL)1868*6236dae4SAndroid Build Coastguard Worker CURLcode test(char *URL)
1869*6236dae4SAndroid Build Coastguard Worker {
1870*6236dae4SAndroid Build Coastguard Worker   (void)URL; /* not used */
1871*6236dae4SAndroid Build Coastguard Worker 
1872*6236dae4SAndroid Build Coastguard Worker   if(urldup())
1873*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)11;
1874*6236dae4SAndroid Build Coastguard Worker 
1875*6236dae4SAndroid Build Coastguard Worker   if(setget_parts())
1876*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)10;
1877*6236dae4SAndroid Build Coastguard Worker 
1878*6236dae4SAndroid Build Coastguard Worker   if(get_url())
1879*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)3;
1880*6236dae4SAndroid Build Coastguard Worker 
1881*6236dae4SAndroid Build Coastguard Worker   if(huge())
1882*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)9;
1883*6236dae4SAndroid Build Coastguard Worker 
1884*6236dae4SAndroid Build Coastguard Worker   if(get_nothing())
1885*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)7;
1886*6236dae4SAndroid Build Coastguard Worker 
1887*6236dae4SAndroid Build Coastguard Worker   if(scopeid())
1888*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)6;
1889*6236dae4SAndroid Build Coastguard Worker 
1890*6236dae4SAndroid Build Coastguard Worker   if(append())
1891*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)5;
1892*6236dae4SAndroid Build Coastguard Worker 
1893*6236dae4SAndroid Build Coastguard Worker   if(set_url())
1894*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)1;
1895*6236dae4SAndroid Build Coastguard Worker 
1896*6236dae4SAndroid Build Coastguard Worker   if(set_parts())
1897*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)2;
1898*6236dae4SAndroid Build Coastguard Worker 
1899*6236dae4SAndroid Build Coastguard Worker   if(get_parts())
1900*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)4;
1901*6236dae4SAndroid Build Coastguard Worker 
1902*6236dae4SAndroid Build Coastguard Worker   if(clear_url())
1903*6236dae4SAndroid Build Coastguard Worker     return (CURLcode)8;
1904*6236dae4SAndroid Build Coastguard Worker 
1905*6236dae4SAndroid Build Coastguard Worker   printf("success\n");
1906*6236dae4SAndroid Build Coastguard Worker   return CURLE_OK;
1907*6236dae4SAndroid Build Coastguard Worker }
1908