ReactOS  0.4.15-dev-2361-g32428a3
url.c
Go to the documentation of this file.
1 /*
2  * Wininet - URL tests
3  *
4  * Copyright 2002 Aric Stewart
5  * Copyright 2004 Mike McCormack
6  * Copyright 2005 Hans Leidekker
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  */
22 
23 #include <stdarg.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 
28 #include "windef.h"
29 #include "winbase.h"
30 #include "winnls.h"
31 #include "wininet.h"
32 
33 #include "wine/test.h"
34 
35 #define TEST_URL "http://www.winehq.org/site/about#hi"
36 #define TEST_URL3 "file:
37 
38 #define CREATE_URL1 "http://username:password@www.winehq.org/site/about"
39 #define CREATE_URL2 "http://username@www.winehq.org/site/about"
40 #define CREATE_URL3 "http://username:"
41 #define CREATE_URL4 "http://www.winehq.org/site/about"
42 #define CREATE_URL5 "http://"
43 #define CREATE_URL6 "nhttp://username:password@www.winehq.org:80/site/about"
44 #define CREATE_URL7 "http://username:password@www.winehq.org:42/site/about"
45 #define CREATE_URL8 "https://username:password@www.winehq.org/site/about"
46 #define CREATE_URL9 "about:blank"
47 #define CREATE_URL10 "about://host/blank"
48 #define CREATE_URL11 "about:"
49 #define CREATE_URL12 "http://www.winehq.org:65535"
50 #define CREATE_URL13 "http://localhost/?test=123"
51 
52 static void copy_compsA(
55  DWORD scheLen,
56  DWORD hostLen,
57  DWORD userLen,
58  DWORD passLen,
59  DWORD pathLen,
60  DWORD extrLen )
61 {
62  *dst = *src;
63  dst->dwSchemeLength = scheLen;
64  dst->dwHostNameLength = hostLen;
65  dst->dwUserNameLength = userLen;
66  dst->dwPasswordLength = passLen;
67  dst->dwUrlPathLength = pathLen;
68  dst->dwExtraInfoLength = extrLen;
69  SetLastError(0xfaceabad);
70 }
71 
72 static void zero_compsA(
74  DWORD scheLen,
75  DWORD hostLen,
76  DWORD userLen,
77  DWORD passLen,
78  DWORD pathLen,
79  DWORD extrLen )
80 {
81  ZeroMemory(dst, sizeof(URL_COMPONENTSA));
82  dst->dwStructSize = sizeof(URL_COMPONENTSA);
83  dst->dwSchemeLength = scheLen;
84  dst->dwHostNameLength = hostLen;
85  dst->dwUserNameLength = userLen;
86  dst->dwPasswordLength = passLen;
87  dst->dwUrlPathLength = pathLen;
88  dst->dwExtraInfoLength = extrLen;
89  SetLastError(0xfaceabad);
90 }
91 
92 typedef struct {
93  const char *url;
97  int host_off;
98  int host_len;
101  int user_off;
102  int user_len;
103  int pass_off;
104  int pass_len;
105  int path_off;
106  int path_len;
109  const char *exp_scheme;
110  const char *exp_hostname;
111  const char *exp_username;
112  const char *exp_password;
113  const char *exp_urlpath;
114  const char *exp_extrainfo;
116 
118  {"http://www.winehq.org/site/about#hi",
119  0, 4, INTERNET_SCHEME_HTTP, 7, 14, -1, 80, -1, 0, -1, 0, 21, 11, 32, 3,
120  "http", "www.winehq.org", "", "", "/site/about", "#hi"},
121  {"http://www.myserver.com/myscript.php?arg=1",
122  0, 4, INTERNET_SCHEME_HTTP, 7, 16, -1, 80, -1, 0, -1, 0, 23, 13, 36, 6,
123  "http", "www.myserver.com", "", "", "/myscript.php", "?arg=1"},
124  {"http://www.winehq.org?test=123",
125  0, 4, INTERNET_SCHEME_HTTP, 7, 14, 23, 80, -1, 0, -1, 0, 21, 0, 21, 9,
126  "http", "www.winehq.org", "", "", "", "?test=123"},
127  {"http://www.winehq.org/myscript.php;test=123",
128  0, 4, INTERNET_SCHEME_HTTP, 7, 14, 23, 80, -1, 0, -1, 0, 21, 22, -1, 0,
129  "http", "www.winehq.org", "", "", "/myscript.php;test=123", ""},
130  {"HtTp://www.winehq.org/scheme",
131  0, 4, INTERNET_SCHEME_HTTP, 7, 14, 23, 80, -1, 0, -1, 0, 21, 7, -1, 0,
132  "HtTp", "www.winehq.org", "", "", "/scheme", ""},
133  {"http://www.winehq.org",
134  0, 4, INTERNET_SCHEME_HTTP, 7, 14, 23, 80, -1, 0, -1, 0, 21, 0, -1, 0,
135  "http", "www.winehq.org", "", "", "", ""},
136  {"file:///C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml",
137  0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 55, -1, 0,
138  "file", "", "", "", "C:\\Program Files\\Atmel\\AVR Tools\\STK500\\STK500.xml", ""},
139  {"fide:///C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml",
140  0, 4, INTERNET_SCHEME_UNKNOWN, 7, 0, -1, 0, -1, 0, -1, 0, 7, 55, -1, 0,
141  "fide", "", "", "", "/C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml", ""},
142  {"file://C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml",
143  0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 54, -1, 0,
144  "file", "", "", "", "C:\\Program%20Files\\Atmel\\AVR%20Tools\\STK500\\STK500.xml", ""},
145  {"file://C:/Program%20Files/Atmel/..",
146  0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 27, -1, 0,
147  "file", "", "", "", "C:\\Program%20Files\\Atmel\\..\\", ""},
148  {"file://C:/Program%20Files/Atmel/../Asdf.xml",
149  0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 36, -1, 0,
150  "file", "", "", "", "C:\\Program%20Files\\Atmel\\..\\Asdf.xml", ""},
151  {"file:///C:/Program%20Files/Atmel/..",
152  0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 28, -1, 0,
153  "file", "", "", "", "C:\\Program Files\\Atmel\\..\\", ""},
154  {"file:///C:/Program%20Files/Atmel/../Asdf.xml",
155  0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 37, -1, 0,
156  "file", "", "", "", "C:\\Program Files\\Atmel\\..\\Asdf.xml", ""},
157  {"file://C:/Program%20Files/Atmel/.",
158  0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 26, -1, 0,
159  "file", "", "", "", "C:\\Program%20Files\\Atmel\\.\\", ""},
160  {"file://C:/Program%20Files/Atmel/./Asdf.xml",
161  0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 35, -1, 0,
162  "file", "", "", "", "C:\\Program%20Files\\Atmel\\.\\Asdf.xml", ""},
163  {"file:///C:/Program%20Files/Atmel/.",
164  0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 27, -1, 0,
165  "file", "", "", "", "C:\\Program Files\\Atmel\\.\\", ""},
166  {"file:///C:/Program%20Files/Atmel/./Asdf.xml",
167  0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 36, -1, 0,
168  "file", "", "", "", "C:\\Program Files\\Atmel\\.\\Asdf.xml", ""},
169  {"C:\\file.txt",
170  0, 1, INTERNET_SCHEME_UNKNOWN, -1, 0, -1, 0, -1, 0, -1, 0, 2, 9, -1, 0,
171  "C", "", "", "", "\\file.txt", ""},
172  {"res://IELib.dll/test.htm",
173  0, 3, INTERNET_SCHEME_RES, 6, 9, -1, 0, -1, 0, -1, 0, 15, 9, -1, 0,
174  "res", "IELib.dll", "", "", "/test.htm", ""},
175  {"gopher://www.winehq.org/site/about#hi",
176  0, 6, INTERNET_SCHEME_GOPHER, 9, 14, -1, 0, -1, 0, -1, 0, 23, 11, 34, 3,
177  "gopher", "www.winehq.org", "", "", "/site/about", "#hi"},
178 };
179 
180 static WCHAR *a2w(const char *str)
181 {
182  WCHAR *ret;
183  int len;
184 
185  len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
186  ret = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
187  MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
188  return ret;
189 }
190 
191 static int strcmp_wa(const WCHAR *str1, const char *str2)
192 {
193  WCHAR *str2w = a2w(str2);
194  int ret = lstrcmpW(str1, str2w);
195  HeapFree(GetProcessHeap(), 0, str2w);
196  return ret;
197 }
198 
200 {
201  URL_COMPONENTSW urlw;
203  char *scheme_a, *hostname_a, *username_a;
204  char *password_a, *extrainfo_a, *urlpath_a;
205  WCHAR *scheme_w, *hostname_w, *username_w;
206  WCHAR *password_w, *extrainfo_w, *urlpath_w;
207  size_t buf_len = strlen(test->url);
208  WCHAR *buf;
209  BOOL b;
210 
211  /* test InternetCrackUrlA with NULL buffers */
212  zero_compsA(&url, 1, 1, 1, 1, 1, 1);
213 
214  b = InternetCrackUrlA(test->url, strlen(test->url), 0, &url);
215  ok(b, "InternetCrackUrl failed with error %d\n", GetLastError());
216 
217  if(test->scheme_off == -1)
218  ok(!url.lpszScheme, "[%s] url.lpszScheme = %p, expected NULL\n", test->url, url.lpszScheme);
219  else
220  ok(url.lpszScheme == test->url+test->scheme_off, "[%s] url.lpszScheme = %p, expected %p\n",
221  test->url, url.lpszScheme, test->url+test->scheme_off);
222  ok(url.dwSchemeLength == test->scheme_len, "[%s] url.lpszSchemeLength = %d, expected %d\n",
223  test->url, url.dwSchemeLength, test->scheme_len);
224 
225  ok(url.nScheme == test->scheme, "[%s] url.nScheme = %d, expected %d\n", test->url, url.nScheme, test->scheme);
226 
227  if(test->host_off == -1)
228  ok(!url.lpszHostName, "[%s] url.lpszHostName = %p, expected NULL\n", test->url, url.lpszHostName);
229  else
230  ok(url.lpszHostName == test->url+test->host_off, "[%s] url.lpszHostName = %p, expected %p\n",
231  test->url, url.lpszHostName, test->url+test->host_off);
232  if(test->host_skip_broken != -1 && url.dwHostNameLength == test->host_skip_broken) {
233  win_skip("skipping broken dwHostNameLength result\n");
234  return;
235  }
236  ok(url.dwHostNameLength == test->host_len, "[%s] url.lpszHostNameLength = %d, expected %d\n",
237  test->url, url.dwHostNameLength, test->host_len);
238 
239  ok(url.nPort == test->port, "[%s] nPort = %d, expected %d\n", test->url, url.nPort, test->port);
240 
241  if(test->user_off == -1)
242  ok(!url.lpszUserName, "[%s] url.lpszUserName = %p\n", test->url, url.lpszUserName);
243  else
244  ok(url.lpszUserName == test->url+test->user_off, "[%s] url.lpszUserName = %p, expected %p\n",
245  test->url, url.lpszUserName, test->url+test->user_off);
246  ok(url.dwUserNameLength == test->user_len, "[%s] url.lpszUserNameLength = %d, expected %d\n",
247  test->url, url.dwUserNameLength, test->user_len);
248 
249  if(test->pass_off == -1)
250  ok(!url.lpszPassword, "[%s] url.lpszPassword = %p\n", test->url, url.lpszPassword);
251  else
252  ok(url.lpszPassword == test->url+test->pass_off, "[%s] url.lpszPassword = %p, expected %p\n",
253  test->url, url.lpszPassword, test->url+test->pass_off);
254  ok(url.dwPasswordLength == test->pass_len, "[%s] url.lpszPasswordLength = %d, expected %d\n",
255  test->url, url.dwPasswordLength, test->pass_len);
256 
257  if(test->path_off == -1)
258  ok(!url.lpszUrlPath, "[%s] url.lpszUrlPath = %p, expected NULL\n", test->url, url.lpszUrlPath);
259  else
260  ok(url.lpszUrlPath == test->url+test->path_off, "[%s] url.lpszUrlPath = %p, expected %p\n",
261  test->url, url.lpszUrlPath, test->url+test->path_off);
262  ok(url.dwUrlPathLength == test->path_len, "[%s] url.lpszUrlPathLength = %d, expected %d\n",
263  test->url, url.dwUrlPathLength, test->path_len);
264 
265  if(test->extra_off == -1)
266  ok(!url.lpszExtraInfo, "[%s] url.lpszExtraInfo = %p, expected NULL\n", test->url, url.lpszExtraInfo);
267  else
268  ok(url.lpszExtraInfo == test->url+test->extra_off, "[%s] url.lpszExtraInfo = %p, expected %p\n",
269  test->url, url.lpszExtraInfo, test->url+test->extra_off);
270  ok(url.dwExtraInfoLength == test->extra_len, "[%s] url.lpszExtraInfoLength = %d, expected %d\n",
271  test->url, url.dwExtraInfoLength, test->extra_len);
272 
273  /* test InternetCrackUrlW with NULL buffers */
274  memset(&urlw, 0, sizeof(URL_COMPONENTSW));
275  urlw.dwStructSize = sizeof(URL_COMPONENTSW);
276  urlw.dwSchemeLength = 1;
277  urlw.dwHostNameLength = 1;
278  urlw.dwUserNameLength = 1;
279  urlw.dwPasswordLength = 1;
280  urlw.dwUrlPathLength = 1;
281  urlw.dwExtraInfoLength = 1;
282 
283  buf = a2w(test->url);
284  b = InternetCrackUrlW(buf, lstrlenW(buf), 0, &urlw);
286  win_skip("InternetCrackUrlW is not implemented\n");
287  HeapFree(GetProcessHeap(), 0, buf);
288  return;
289  }
290  ok(b, "InternetCrackUrl failed with error %d\n", GetLastError());
291 
292  if(test->scheme_off == -1)
293  ok(!urlw.lpszScheme, "[%s] urlw.lpszScheme = %p, expected NULL\n", test->url, urlw.lpszScheme);
294  else
295  ok(urlw.lpszScheme == buf+test->scheme_off, "[%s] urlw.lpszScheme = %p, expected %p\n",
296  test->url, urlw.lpszScheme, buf+test->scheme_off);
297  ok(urlw.dwSchemeLength == test->scheme_len, "[%s] urlw.lpszSchemeLength = %d, expected %d\n",
298  test->url, urlw.dwSchemeLength, test->scheme_len);
299 
300  ok(urlw.nScheme == test->scheme, "[%s] urlw.nScheme = %d, expected %d\n", test->url, urlw.nScheme, test->scheme);
301 
302  if(test->host_off == -1) {
303  ok(!urlw.lpszHostName, "[%s] urlw.lpszHostName = %p, expected NULL\n", test->url, urlw.lpszHostName);
304  ok(urlw.dwHostNameLength == 0 || broken(urlw.dwHostNameLength == 1), "[%s] urlw.lpszHostNameLength = %d, expected %d\n",
305  test->url, urlw.dwHostNameLength, test->host_len);
306  }else {
307  ok(urlw.lpszHostName == buf+test->host_off, "[%s] urlw.lpszHostName = %p, expected %p\n",
308  test->url, urlw.lpszHostName, test->url+test->host_off);
309  ok(urlw.dwHostNameLength == test->host_len, "[%s] urlw.lpszHostNameLength = %d, expected %d\n",
310  test->url, urlw.dwHostNameLength, test->host_len);
311  }
312 
313  ok(urlw.nPort == test->port, "[%s] nPort = %d, expected %d\n", test->url, urlw.nPort, test->port);
314 
315  if(test->user_off == -1) {
316  ok(!urlw.lpszUserName, "[%s] urlw.lpszUserName = %p\n", test->url, urlw.lpszUserName);
317  ok(urlw.dwUserNameLength == 0 || broken(urlw.dwUserNameLength == 1), "[%s] urlw.lpszUserNameLength = %d, expected %d\n",
318  test->url, urlw.dwUserNameLength, test->user_len);
319  }else {
320  ok(urlw.lpszUserName == buf+test->user_off, "[%s] urlw.lpszUserName = %p, expected %p\n",
321  test->url, urlw.lpszUserName, buf+test->user_off);
322  ok(urlw.dwUserNameLength == test->user_len, "[%s] urlw.lpszUserNameLength = %d, expected %d\n",
323  test->url, urlw.dwUserNameLength, test->user_len);
324  }
325 
326  if(test->pass_off == -1) {
327  ok(!urlw.lpszPassword, "[%s] urlw.lpszPassword = %p\n", test->url, urlw.lpszPassword);
328  ok(urlw.dwPasswordLength == 0 || broken(urlw.dwPasswordLength), "[%s] urlw.lpszPasswordLength = %d, expected %d\n",
329  test->url, urlw.dwPasswordLength, test->pass_len);
330  }else {
331  ok(urlw.lpszPassword == buf+test->pass_off, "[%s] urlw.lpszPassword = %p, expected %p\n",
332  test->url, urlw.lpszPassword, buf+test->pass_off);
333  ok(urlw.dwPasswordLength == test->pass_len, "[%s] urlw.lpszPasswordLength = %d, expected %d\n",
334  test->url, urlw.dwPasswordLength, test->pass_len);
335  }
336 
337  if(test->path_off == -1)
338  ok(!urlw.lpszUrlPath, "[%s] urlw.lpszUrlPath = %p, expected NULL\n", test->url, urlw.lpszUrlPath);
339  else
340  ok(urlw.lpszUrlPath == buf+test->path_off, "[%s] urlw.lpszUrlPath = %p, expected %p\n",
341  test->url, urlw.lpszUrlPath, buf+test->path_off);
342  ok(urlw.dwUrlPathLength == test->path_len, "[%s] urlw.lpszUrlPathLength = %d, expected %d\n",
343  test->url, urlw.dwUrlPathLength, test->path_len);
344 
345  if(test->extra_off == -1) {
346  ok(!urlw.lpszExtraInfo, "[%s] url.lpszExtraInfo = %p, expected NULL\n", test->url, urlw.lpszExtraInfo);
347  ok(urlw.dwExtraInfoLength == 0 || broken(urlw.dwExtraInfoLength == 1), "[%s] urlw.lpszExtraInfoLength = %d, expected %d\n",
348  test->url, urlw.dwExtraInfoLength, test->extra_len);
349  }else {
350  ok(urlw.lpszExtraInfo == buf+test->extra_off, "[%s] urlw.lpszExtraInfo = %p, expected %p\n",
351  test->url, urlw.lpszExtraInfo, buf+test->extra_off);
352  ok(urlw.dwExtraInfoLength == test->extra_len, "[%s] urlw.lpszExtraInfoLength = %d, expected %d\n",
353  test->url, urlw.dwExtraInfoLength, test->extra_len);
354  }
355 
356  /* test InternetCrackUrlA with valid buffers */
357  scheme_a = (char*)(scheme_w = HeapAlloc(GetProcessHeap(), 0, buf_len*sizeof(WCHAR)));
358  hostname_a = (char*)(hostname_w = HeapAlloc(GetProcessHeap(), 0, buf_len*sizeof(WCHAR)));
359  username_a = (char*)(username_w = HeapAlloc(GetProcessHeap(), 0, buf_len*sizeof(WCHAR)));
360  password_a = (char*)(password_w = HeapAlloc(GetProcessHeap(), 0, buf_len*sizeof(WCHAR)));
361  urlpath_a = (char*)(urlpath_w = HeapAlloc(GetProcessHeap(), 0, buf_len*sizeof(WCHAR)));
362  extrainfo_a = (char*)(extrainfo_w = HeapAlloc(GetProcessHeap(), 0, buf_len*sizeof(WCHAR)));
363  memset(&url, 0, sizeof(URL_COMPONENTSA));
364  url.dwStructSize = sizeof(URL_COMPONENTSA);
365  url.lpszScheme = scheme_a;
366  url.dwSchemeLength = buf_len;
367  url.lpszHostName = hostname_a;
368  url.dwHostNameLength = buf_len;
369  url.lpszUserName = username_a;
370  url.dwUserNameLength = buf_len;
371  url.lpszPassword = password_a;
372  url.dwPasswordLength = buf_len;
373  url.lpszUrlPath = urlpath_a;
374  url.dwUrlPathLength = buf_len;
375  url.lpszExtraInfo = extrainfo_a;
376  url.dwExtraInfoLength = buf_len;
377 
378  b = InternetCrackUrlA(test->url, strlen(test->url), 0, &url);
379  ok(b, "InternetCrackUrlA failed with error %d\n", GetLastError());
380 
381  ok(url.dwSchemeLength == strlen(test->exp_scheme), "[%s] Got wrong scheme length: %d\n",
382  test->url, url.dwSchemeLength);
383  ok(!strcmp(scheme_a, test->exp_scheme), "[%s] Got wrong scheme, expected: %s, got: %s\n",
384  test->url, test->exp_scheme, scheme_a);
385 
386  ok(url.nScheme == test->scheme, "[%s] Got wrong nScheme, expected: %d, got: %d\n",
387  test->url, test->scheme, url.nScheme);
388 
389  ok(url.dwHostNameLength == strlen(test->exp_hostname), "[%s] Got wrong hostname length: %d\n",
390  test->url, url.dwHostNameLength);
391  ok(!strcmp(hostname_a, test->exp_hostname), "[%s] Got wrong hostname, expected: %s, got: %s\n",
392  test->url, test->exp_hostname, hostname_a);
393 
394  ok(url.nPort == test->port, "[%s] Got wrong port, expected: %d, got: %d\n",
395  test->url, test->port, url.nPort);
396 
397  ok(url.dwUserNameLength == strlen(test->exp_username), "[%s] Got wrong username length: %d\n",
398  test->url, url.dwUserNameLength);
399  ok(!strcmp(username_a, test->exp_username), "[%s] Got wrong username, expected: %s, got: %s\n",
400  test->url, test->exp_username, username_a);
401 
402  ok(url.dwPasswordLength == strlen(test->exp_password), "[%s] Got wrong password length: %d\n",
403  test->url, url.dwPasswordLength);
404  ok(!strcmp(password_a, test->exp_password), "[%s] Got wrong password, expected: %s, got: %s\n",
405  test->url, test->exp_password, password_a);
406 
407  ok(url.dwUrlPathLength == strlen(test->exp_urlpath), "[%s] Got wrong urlpath length: %d\n",
408  test->url, url.dwUrlPathLength);
409  ok(!strcmp(urlpath_a, test->exp_urlpath), "[%s] Got wrong urlpath, expected: %s, got: %s\n",
410  test->url, test->exp_urlpath, urlpath_a);
411 
412  ok(url.dwExtraInfoLength == strlen(test->exp_extrainfo), "[%s] Got wrong extrainfo length: %d\n",
413  test->url, url.dwExtraInfoLength);
414  ok(!strcmp(extrainfo_a, test->exp_extrainfo), "[%s] Got wrong extrainfo, expected: %s, got: %s\n",
415  test->url, test->exp_extrainfo, extrainfo_a);
416 
417  /* test InternetCrackUrlW with valid buffers */
418  memset(&urlw, 0, sizeof(URL_COMPONENTSW));
419  urlw.dwStructSize = sizeof(URL_COMPONENTSW);
420  urlw.lpszScheme = scheme_w;
421  urlw.dwSchemeLength = buf_len;
422  urlw.lpszHostName = hostname_w;
423  urlw.dwHostNameLength = buf_len;
424  urlw.lpszUserName = username_w;
425  urlw.dwUserNameLength = buf_len;
426  urlw.lpszPassword = password_w;
427  urlw.dwPasswordLength = buf_len;
428  urlw.lpszUrlPath = urlpath_w;
429  urlw.dwUrlPathLength = buf_len;
430  urlw.lpszExtraInfo = extrainfo_w;
431  urlw.dwExtraInfoLength = buf_len;
432 
433  b = InternetCrackUrlW(buf, lstrlenW(buf), 0, &urlw);
434  ok(b, "InternetCrackUrlW failed with error %d\n", GetLastError());
435 
436  ok(urlw.dwSchemeLength == strlen(test->exp_scheme), "[%s] Got wrong scheme length: %d\n",
437  test->url, urlw.dwSchemeLength);
438  ok(!strcmp_wa(scheme_w, test->exp_scheme), "[%s] Got wrong scheme, expected: %s, got: %s\n",
439  test->url, test->exp_scheme, wine_dbgstr_w(scheme_w));
440 
441  ok(urlw.nScheme == test->scheme, "[%s] Got wrong nScheme, expected: %d, got: %d\n",
442  test->url, test->scheme, urlw.nScheme);
443 
444  ok(urlw.dwHostNameLength == strlen(test->exp_hostname), "[%s] Got wrong hostname length: %d\n",
445  test->url, urlw.dwHostNameLength);
446  ok(!strcmp_wa(hostname_w, test->exp_hostname), "[%s] Got wrong hostname, expected: %s, got: %s\n",
447  test->url, test->exp_hostname, wine_dbgstr_w(hostname_w));
448 
449  ok(urlw.nPort == test->port, "[%s] Got wrong port, expected: %d, got: %d\n",
450  test->url, test->port, urlw.nPort);
451 
452  ok(urlw.dwUserNameLength == strlen(test->exp_username), "[%s] Got wrong username length: %d\n",
453  test->url, urlw.dwUserNameLength);
454  ok(!strcmp_wa(username_w, test->exp_username), "[%s] Got wrong username, expected: %s, got: %s\n",
455  test->url, test->exp_username, wine_dbgstr_w(username_w));
456 
457  ok(urlw.dwPasswordLength == strlen(test->exp_password), "[%s] Got wrong password length: %d\n",
458  test->url, urlw.dwPasswordLength);
459  ok(!strcmp_wa(password_w, test->exp_password), "[%s] Got wrong password, expected: %s, got: %s\n",
460  test->url, test->exp_password, wine_dbgstr_w(password_w));
461 
462  ok(urlw.dwUrlPathLength == strlen(test->exp_urlpath), "[%s] Got wrong urlpath length: %d\n",
463  test->url, urlw.dwUrlPathLength);
464  ok(!strcmp_wa(urlpath_w, test->exp_urlpath), "[%s] Got wrong urlpath, expected: %s, got: %s\n",
465  test->url, test->exp_urlpath, wine_dbgstr_w(urlpath_w));
466 
467  ok(urlw.dwExtraInfoLength == strlen(test->exp_extrainfo), "[%s] Got wrong extrainfo length: %d\n",
468  test->url, urlw.dwExtraInfoLength);
469  ok(!strcmp_wa(extrainfo_w, test->exp_extrainfo), "[%s] Got wrong extrainfo, expected: %s, got: %s\n",
470  test->url, test->exp_extrainfo, wine_dbgstr_w(extrainfo_w));
471 
472  HeapFree(GetProcessHeap(), 0, scheme_w);
473  HeapFree(GetProcessHeap(), 0, hostname_w);
474  HeapFree(GetProcessHeap(), 0, username_w);
475  HeapFree(GetProcessHeap(), 0, password_w);
476  HeapFree(GetProcessHeap(), 0, urlpath_w);
477  HeapFree(GetProcessHeap(), 0, extrainfo_w);
478  HeapFree(GetProcessHeap(), 0, buf);
479 }
480 
481 static void test_long_url(void)
482 {
483  char long_buf[6000];
484  char long_url[sizeof(long_buf) + 1000];
485  crack_url_test_t test_long_path =
486  {long_url, 0, 4, INTERNET_SCHEME_HTTP, 7, 14, -1, 80, -1, 0, -1, 0, 21, sizeof(long_buf)-1, -1, 0,
487  "http", "www.winehq.org", "", "", long_buf, ""};
488  crack_url_test_t test_long_extra =
489  {long_url, 0, 4, INTERNET_SCHEME_HTTP, 7, 14, -1, 80, -1, 0, -1, 0, 21, 6, 27, sizeof(long_buf)-1,
490  "http", "www.winehq.org", "", "", "/path/", long_buf};
491  URL_COMPONENTSA url_comp;
492  BOOL b;
493 
494  memset(long_buf, 'x', sizeof(long_buf));
495  long_buf[0] = '/';
496  long_buf[sizeof(long_buf)-1] = 0;
497 
498  strcpy(long_url, "http://www.winehq.org");
499  strcat(long_url, long_buf);
500  test_crack_url(&test_long_path);
501 
502  strcpy(long_url, "http://www.winehq.org/path/");
503  long_buf[0] = '#';
504  strcat(long_url, long_buf);
505  test_crack_url(&test_long_extra);
506 
507  zero_compsA(&url_comp, 0, 0, 0, 0, 0, 100);
508  url_comp.lpszExtraInfo = long_buf;
509  b = InternetCrackUrlA(long_url, strlen(long_url), 0, &url_comp);
510  ok(!b && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "InternetCrackUrlA returned %x with error %d\n", b, GetLastError());
511 
512  zero_compsA(&url_comp, 4, 0, 0, 0, 0, 0);
513  url_comp.lpszScheme = long_buf;
514  b = InternetCrackUrlA(long_url, strlen(long_url), 0, &url_comp);
515  ok(!b && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "InternetCrackUrlA returned %x with error %d\n", b, GetLastError());
516 }
517 
518 static void InternetCrackUrl_test(void)
519 {
520  URL_COMPONENTSA urlSrc, urlComponents;
521  char protocol[32], hostName[1024], userName[1024];
522  char password[1024], extra[1024], path[1024];
523  BOOL ret, firstret;
524  DWORD GLE, firstGLE;
525 
526  ZeroMemory(&urlSrc, sizeof(urlSrc));
527  urlSrc.dwStructSize = sizeof(urlSrc);
528  urlSrc.lpszScheme = protocol;
529  urlSrc.lpszHostName = hostName;
530  urlSrc.lpszUserName = userName;
531  urlSrc.lpszPassword = password;
532  urlSrc.lpszUrlPath = path;
533  urlSrc.lpszExtraInfo = extra;
534 
535  /* Tests for lpsz* members pointing to real strings while
536  * some corresponding length members are set to zero.
537  * As of IE7 (wininet 7.0*?) all members are checked. So we
538  * run the first test and expect the outcome to be the same
539  * for the first four (scheme, hostname, username and password).
540  * The last two (path and extrainfo) are the same for all versions
541  * of the wininet.dll.
542  */
543  copy_compsA(&urlSrc, &urlComponents, 0, 1024, 1024, 1024, 1024, 1024);
544  SetLastError(0xdeadbeef);
545  firstret = InternetCrackUrlA(TEST_URL3, 0, ICU_DECODE, &urlComponents);
546  firstGLE = GetLastError();
547 
548  copy_compsA(&urlSrc, &urlComponents, 32, 0, 1024, 1024, 1024, 1024);
549  SetLastError(0xdeadbeef);
550  ret = InternetCrackUrlA(TEST_URL3, 0, ICU_DECODE, &urlComponents);
551  GLE = GetLastError();
552  ok(ret==firstret && (GLE==firstGLE), "InternetCrackUrl returned %d with GLE=%d (expected to return %d)\n",
553  ret, GLE, firstret);
554 
555  copy_compsA(&urlSrc, &urlComponents, 32, 1024, 0, 1024, 1024, 1024);
556  SetLastError(0xdeadbeef);
557  ret = InternetCrackUrlA(TEST_URL3, 0, ICU_DECODE, &urlComponents);
558  GLE = GetLastError();
559  ok(ret==firstret && (GLE==firstGLE), "InternetCrackUrl returned %d with GLE=%d (expected to return %d)\n",
560  ret, GLE, firstret);
561 
562  copy_compsA(&urlSrc, &urlComponents, 32, 1024, 1024, 0, 1024, 1024);
563  SetLastError(0xdeadbeef);
564  ret = InternetCrackUrlA(TEST_URL3, 0, ICU_DECODE, &urlComponents);
565  GLE = GetLastError();
566  ok(ret==firstret && (GLE==firstGLE), "InternetCrackUrl returned %d with GLE=%d (expected to return %d)\n",
567  ret, GLE, firstret);
568 
569  copy_compsA(&urlSrc, &urlComponents, 32, 1024, 1024, 1024, 0, 1024);
570  SetLastError(0xdeadbeef);
571  ret = InternetCrackUrlA(TEST_URL3, 0, ICU_DECODE, &urlComponents);
572  GLE = GetLastError();
573  todo_wine
575  "InternetCrackUrl returned %d with GLE=%d (expected to return 0 and ERROR_INVALID_HANDLE or ERROR_INSUFFICIENT_BUFFER)\n",
576  ret, GLE);
577 
578  copy_compsA(&urlSrc, &urlComponents, 32, 1024, 1024, 1024, 1024, 0);
579  SetLastError(0xdeadbeef);
580  ret = InternetCrackUrlA(TEST_URL3, 0, ICU_DECODE, &urlComponents);
581  GLE = GetLastError();
582  todo_wine
584  "InternetCrackUrl returned %d with GLE=%d (expected to return 0 and ERROR_INVALID_HANDLE or ERROR_INSUFFICIENT_BUFFER)\n",
585  ret, GLE);
586 
587  copy_compsA(&urlSrc, &urlComponents, 0, 0, 0, 0, 0, 0);
588  ret = InternetCrackUrlA(TEST_URL3, 0, ICU_DECODE, &urlComponents);
589  GLE = GetLastError();
590  todo_wine
592  "InternetCrackUrl returned %d with GLE=%d (expected to return 0 and ERROR_INVALID_PARAMETER)\n",
593  ret, GLE);
594 
595  copy_compsA(&urlSrc, &urlComponents, 32, 1024, 1024, 1024, 1024, 1024);
596  ret = InternetCrackUrlA("about://host/blank", 0,0,&urlComponents);
597  ok(ret, "InternetCrackUrl failed with %d\n", GetLastError());
598  ok(!strcmp(urlComponents.lpszScheme, "about"), "lpszScheme was \"%s\" instead of \"about\"\n", urlComponents.lpszScheme);
599  ok(!strcmp(urlComponents.lpszHostName, "host"), "lpszHostName was \"%s\" instead of \"host\"\n", urlComponents.lpszHostName);
600  ok(!strcmp(urlComponents.lpszUrlPath, "/blank"), "lpszUrlPath was \"%s\" instead of \"/blank\"\n", urlComponents.lpszUrlPath);
601 
602  /* try a NULL lpszUrl */
603  SetLastError(0xdeadbeef);
604  copy_compsA(&urlSrc, &urlComponents, 32, 1024, 1024, 1024, 1024, 1024);
605  ret = InternetCrackUrlA(NULL, 0, 0, &urlComponents);
606  GLE = GetLastError();
607  ok(ret == FALSE, "Expected InternetCrackUrl to fail\n");
608  ok(GLE == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GLE);
609 
610  /* try an empty lpszUrl, GetLastError returns 12006, whatever that means
611  * we just need to fail and not return success
612  */
613  SetLastError(0xdeadbeef);
614  copy_compsA(&urlSrc, &urlComponents, 32, 1024, 1024, 1024, 1024, 1024);
615  ret = InternetCrackUrlA("", 0, 0, &urlComponents);
616  GLE = GetLastError();
617  ok(ret == FALSE, "Expected InternetCrackUrl to fail\n");
618  ok(GLE != 0xdeadbeef && GLE != ERROR_SUCCESS, "Expected GLE to represent a failure\n");
619 
620  /* Invalid Call: must set size of components structure (Windows only
621  * enforces this on the InternetCrackUrlA version of the call) */
622  copy_compsA(&urlSrc, &urlComponents, 0, 1024, 1024, 1024, 1024, 1024);
623  SetLastError(0xdeadbeef);
624  urlComponents.dwStructSize = 0;
625  ret = InternetCrackUrlA(TEST_URL, 0, 0, &urlComponents);
626  GLE = GetLastError();
627  ok(ret == FALSE, "Expected InternetCrackUrl to fail\n");
628  ok(GLE != 0xdeadbeef && GLE != ERROR_SUCCESS, "Expected GLE to represent a failure\n");
629 
630  /* Invalid Call: size of dwStructSize must be one of the "standard" sizes
631  * of the URL_COMPONENTS structure (Windows only enforces this on the
632  * InternetCrackUrlA version of the call) */
633  copy_compsA(&urlSrc, &urlComponents, 0, 1024, 1024, 1024, 1024, 1024);
634  SetLastError(0xdeadbeef);
635  urlComponents.dwStructSize = sizeof(urlComponents) + 1;
636  ret = InternetCrackUrlA(TEST_URL, 0, 0, &urlComponents);
637  GLE = GetLastError();
638  ok(ret == FALSE, "Expected InternetCrackUrl to fail\n");
639  ok(GLE != 0xdeadbeef && GLE != ERROR_SUCCESS, "Expected GLE to represent a failure\n");
640 
641  SetLastError(0xdeadbeef);
642  memset(&urlComponents, 0, sizeof(urlComponents));
643  urlComponents.dwStructSize = sizeof(urlComponents);
644  ret = InternetCrackUrlA("file.txt", 0, 0, &urlComponents);
645  GLE = GetLastError();
646  ok(ret == FALSE, "Expected InternetCrackUrl to fail\n");
647  ok(GLE == ERROR_INTERNET_UNRECOGNIZED_SCHEME, "Expected GLE to represent a failure\n");
648 
649  SetLastError(0xdeadbeef);
650  memset(&urlComponents, 0, sizeof(urlComponents));
651  urlComponents.dwStructSize = sizeof(urlComponents);
652  ret = InternetCrackUrlA("www.winehq.org", 0, 0, &urlComponents);
653  GLE = GetLastError();
654  ok(ret == FALSE, "Expected InternetCrackUrl to fail\n");
655  ok(GLE == ERROR_INTERNET_UNRECOGNIZED_SCHEME, "Expected GLE to represent a failure\n");
656 }
657 
658 static void InternetCrackUrlW_test(void)
659 {
660  WCHAR url[] = {
661  'h','t','t','p',':','/','/','1','9','2','.','1','6','8','.','0','.','2','2','/',
662  'C','F','I','D','E','/','m','a','i','n','.','c','f','m','?','C','F','S','V','R',
663  '=','I','D','E','&','A','C','T','I','O','N','=','I','D','E','_','D','E','F','A',
664  'U','L','T', 0 };
665  static const WCHAR url2[] = { '.','.','/','R','i','t','z','.','x','m','l',0 };
666  static const WCHAR url3[] = { 'h','t','t','p',':','/','/','x','.','o','r','g',0 };
667  URL_COMPONENTSW comp;
668  WCHAR scheme[20], host[20], user[20], pwd[20], urlpart[50], extra[50];
669  DWORD error;
670  BOOL r;
671 
672  urlpart[0]=0;
673  scheme[0]=0;
674  extra[0]=0;
675  host[0]=0;
676  user[0]=0;
677  pwd[0]=0;
678  memset(&comp, 0, sizeof comp);
679  comp.dwStructSize = sizeof(comp);
680  comp.lpszScheme = scheme;
682  comp.lpszHostName = host;
684  comp.lpszUserName = user;
686  comp.lpszPassword = pwd;
688  comp.lpszUrlPath = urlpart;
689  comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
690  comp.lpszExtraInfo = extra;
692 
693  SetLastError(0xdeadbeef);
694  r = InternetCrackUrlW(NULL, 0, 0, &comp );
695  error = GetLastError();
697  {
698  win_skip("InternetCrackUrlW is not implemented\n");
699  return;
700  }
701  ok( !r, "InternetCrackUrlW succeeded unexpectedly\n");
704  "expected ERROR_INVALID_PARAMETER got %u\n", error);
705 
707  {
708  /* Crashes on IE5 */
709  SetLastError(0xdeadbeef);
710  r = InternetCrackUrlW(url, 0, 0, NULL );
711  error = GetLastError();
712  ok( !r, "InternetCrackUrlW succeeded unexpectedly\n");
713  ok( error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", error);
714  }
715 
716  r = InternetCrackUrlW(url, 0, 0, &comp );
717  ok( r, "failed to crack url\n");
718  ok( comp.dwSchemeLength == 4, "scheme length wrong\n");
719  ok( comp.dwHostNameLength == 12, "host length wrong\n");
720  ok( comp.dwUserNameLength == 0, "user length wrong\n");
721  ok( comp.dwPasswordLength == 0, "password length wrong\n");
722  ok( comp.dwUrlPathLength == 15, "url length wrong\n");
723  ok( comp.dwExtraInfoLength == 29, "extra length wrong\n");
724 
725  urlpart[0]=0;
726  host[0]=0;
727  memset(&comp, 0, sizeof comp);
728  comp.dwStructSize = sizeof comp;
729  comp.lpszHostName = host;
731  comp.lpszUrlPath = urlpart;
732  comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
733 
734  r = InternetCrackUrlW(url, 0, 0, &comp );
735  ok( r, "failed to crack url\n");
736  ok( comp.dwSchemeLength == 0, "scheme length wrong\n");
737  ok( comp.dwHostNameLength == 12, "host length wrong\n");
738  ok( comp.dwUserNameLength == 0, "user length wrong\n");
739  ok( comp.dwPasswordLength == 0, "password length wrong\n");
740  ok( comp.dwUrlPathLength == 44, "url length wrong\n");
741  ok( comp.dwExtraInfoLength == 0, "extra length wrong\n");
742 
743  urlpart[0]=0;
744  host[0]=0;
745  memset(&comp, 0, sizeof comp);
746  comp.dwStructSize = sizeof comp;
747  comp.lpszHostName = host;
749  comp.lpszUrlPath = urlpart;
750  comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
751  comp.lpszExtraInfo = NULL;
753 
754  r = InternetCrackUrlW(url, 0, 0, &comp );
755  ok( r, "failed to crack url\n");
756  ok( comp.dwSchemeLength == 0, "scheme length wrong\n");
757  ok( comp.dwHostNameLength == 12, "host length wrong\n");
758  ok( comp.dwUserNameLength == 0, "user length wrong\n");
759  ok( comp.dwPasswordLength == 0, "password length wrong\n");
760  ok( comp.dwUrlPathLength == 15, "url length wrong\n");
761  ok( comp.dwExtraInfoLength == 29, "extra length wrong\n");
762 
763  urlpart[0]=0;
764  scheme[0]=0;
765  extra[0]=0;
766  host[0]=0;
767  user[0]=0;
768  pwd[0]=0;
769  memset(&comp, 0, sizeof(comp));
770  comp.dwStructSize = sizeof(comp);
771  comp.lpszScheme = scheme;
773  comp.lpszHostName = host;
775  comp.lpszUserName = user;
777  comp.lpszPassword = pwd;
779  comp.lpszUrlPath = urlpart;
780  comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
781  comp.lpszExtraInfo = extra;
783 
784  r = InternetCrackUrlW(url2, 0, 0, &comp);
785  ok(!r, "InternetCrackUrl should have failed\n");
787  "InternetCrackUrl should have failed with error ERROR_INTERNET_UNRECOGNIZED_SCHEME instead of error %d\n",
788  GetLastError());
789 
790  /* Test to see whether cracking a URL without a filename initializes urlpart */
791  urlpart[0]=0xba;
792  scheme[0]=0;
793  extra[0]=0;
794  host[0]=0;
795  user[0]=0;
796  pwd[0]=0;
797  memset(&comp, 0, sizeof comp);
798  comp.dwStructSize = sizeof comp;
799  comp.lpszScheme = scheme;
801  comp.lpszHostName = host;
803  comp.lpszUserName = user;
805  comp.lpszPassword = pwd;
807  comp.lpszUrlPath = urlpart;
808  comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
809  comp.lpszExtraInfo = extra;
811  r = InternetCrackUrlW(url3, 0, 0, &comp );
812  ok( r, "InternetCrackUrlW failed unexpectedly\n");
813  ok( host[0] == 'x', "host should be x.org\n");
814  ok( urlpart[0] == 0, "urlpart should be empty\n");
815 
816  urlpart[0] = 0;
817  host[0] = 0;
818  memset(&comp, 0, sizeof(comp));
819  comp.dwStructSize = sizeof(comp);
820  comp.lpszHostName = host;
822  comp.lpszUrlPath = urlpart;
823  comp.dwUrlPathLength = ARRAY_SIZE(urlpart);
824  r = InternetCrackUrlW(url3, 0, ICU_DECODE, &comp);
825  ok(r, "InternetCrackUrlW failed unexpectedly\n");
826  ok(!strcmp_wa(host, "x.org"), "host is %s, should be x.org\n", wine_dbgstr_w(host));
827  todo_wine ok(urlpart[0] == 0, "urlpart should be empty\n");
828 }
829 
830 static void fill_url_components(URL_COMPONENTSA *lpUrlComponents)
831 {
832  static CHAR http[] = "http",
833  winehq[] = "www.winehq.org",
834  username[] = "username",
835  password[] = "password",
836  site_about[] = "/site/about",
837  empty[] = "";
838 
839  lpUrlComponents->dwStructSize = sizeof(URL_COMPONENTSA);
840  lpUrlComponents->lpszScheme = http;
841  lpUrlComponents->dwSchemeLength = strlen(lpUrlComponents->lpszScheme);
842  lpUrlComponents->nScheme = INTERNET_SCHEME_HTTP;
843  lpUrlComponents->lpszHostName = winehq;
844  lpUrlComponents->dwHostNameLength = strlen(lpUrlComponents->lpszHostName);
845  lpUrlComponents->nPort = 80;
846  lpUrlComponents->lpszUserName = username;
847  lpUrlComponents->dwUserNameLength = strlen(lpUrlComponents->lpszUserName);
848  lpUrlComponents->lpszPassword = password;
849  lpUrlComponents->dwPasswordLength = strlen(lpUrlComponents->lpszPassword);
850  lpUrlComponents->lpszUrlPath = site_about;
851  lpUrlComponents->dwUrlPathLength = strlen(lpUrlComponents->lpszUrlPath);
852  lpUrlComponents->lpszExtraInfo = empty;
853  lpUrlComponents->dwExtraInfoLength = strlen(lpUrlComponents->lpszExtraInfo);
854 }
855 
856 static void InternetCreateUrlA_test(void)
857 {
858  URL_COMPONENTSA urlComp;
859  LPSTR szUrl;
860  DWORD len = -1;
861  BOOL ret;
862  static CHAR empty[] = "",
863  nhttp[] = "nhttp",
864  http[] = "http",
865  https[] = "https",
866  winehq[] = "www.winehq.org",
867  localhost[] = "localhost",
868  username[] = "username",
869  password[] = "password",
870  root[] = "/",
871  site_about[] = "/site/about",
872  extra_info[] = "?test=123",
873  about[] = "about",
874  blank[] = "blank",
875  host[] = "host";
876 
877  /* test NULL lpUrlComponents */
878  SetLastError(0xdeadbeef);
880  ok(!ret, "Expected failure\n");
882  "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
883  ok(len == -1, "Expected len -1, got %d\n", len);
884 
885  /* test zero'ed lpUrlComponents */
886  ZeroMemory(&urlComp, sizeof(urlComp));
887  SetLastError(0xdeadbeef);
888  ret = InternetCreateUrlA(&urlComp, 0, NULL, &len);
889  ok(!ret, "Expected failure\n");
891  "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
892  ok(len == -1, "Expected len -1, got %d\n", len);
893 
894  /* test valid lpUrlComponents, NULL lpdwUrlLength */
895  fill_url_components(&urlComp);
896  SetLastError(0xdeadbeef);
897  ret = InternetCreateUrlA(&urlComp, 0, NULL, NULL);
898  ok(!ret, "Expected failure\n");
900  "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
901 
902  /* test valid lpUrlComponents, empty szUrl
903  * lpdwUrlLength is size of buffer required on exit, including
904  * the terminating null when GLE == ERROR_INSUFFICIENT_BUFFER
905  */
906  SetLastError(0xdeadbeef);
907  ret = InternetCreateUrlA(&urlComp, 0, NULL, &len);
908  ok(!ret, "Expected failure\n");
910  "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
911  ok(len == 51, "Expected len 51, got %d\n", len);
912 
913  /* test correct size, NULL szUrl */
914  fill_url_components(&urlComp);
915  SetLastError(0xdeadbeef);
916  ret = InternetCreateUrlA(&urlComp, 0, NULL, &len);
917  ok(!ret, "Expected failure\n");
919  "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
920  ok(len == 51, "Expected len 51, got %d\n", len);
921 
922  /* test valid lpUrlComponents, alloc-ed szUrl, small size */
923  SetLastError(0xdeadbeef);
924  szUrl = HeapAlloc(GetProcessHeap(), 0, len);
925  len -= 2;
926  ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
927  ok(!ret, "Expected failure\n");
929  "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
930  ok(len == 51, "Expected len 51, got %d\n", len);
931 
932  /* alloc-ed szUrl, NULL lpszScheme
933  * shows that it uses nScheme instead
934  */
935  urlComp.lpszScheme = NULL;
936  ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
937  ok(ret, "Expected success\n");
938  ok(len == 50, "Expected len 50, got %d\n", len);
939  ok(!strcmp(szUrl, CREATE_URL1), "Expected %s, got %s\n", CREATE_URL1, szUrl);
940 
941  /* alloc-ed szUrl, invalid nScheme
942  * any nScheme out of range seems ignored
943  */
944  fill_url_components(&urlComp);
945  urlComp.nScheme = -3;
946  len++;
947  ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
948  ok(ret, "Expected success\n");
949  ok(len == 50, "Expected len 50, got %d\n", len);
950 
951  /* test valid lpUrlComponents, alloc-ed szUrl */
952  fill_url_components(&urlComp);
953  len = 51;
954  ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
955  ok(ret, "Expected success\n");
956  ok(len == 50, "Expected len 50, got %d\n", len);
957  ok(strstr(szUrl, "80") == NULL, "Didn't expect to find 80 in szUrl\n");
958  ok(!strcmp(szUrl, CREATE_URL1), "Expected %s, got %s\n", CREATE_URL1, szUrl);
959 
960  /* valid username, NULL password */
961  fill_url_components(&urlComp);
962  urlComp.lpszPassword = NULL;
963  len = 42;
964  ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
965  ok(ret, "Expected success\n");
966  ok(len == 41, "Expected len 41, got %d\n", len);
967  ok(!strcmp(szUrl, CREATE_URL2), "Expected %s, got %s\n", CREATE_URL2, szUrl);
968 
969  /* valid username, empty password */
970  fill_url_components(&urlComp);
971  urlComp.lpszPassword = empty;
972  len = 51;
973  ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
974  ok(ret, "Expected success\n");
975  ok(len == 50, "Expected len 50, got %d\n", len);
976  ok(!strcmp(szUrl, CREATE_URL3), "Expected %s, got %s\n", CREATE_URL3, szUrl);
977 
978  /* valid password, NULL username
979  * if password is provided, username has to exist
980  */
981  fill_url_components(&urlComp);
982  SetLastError(0xdeadbeef);
983  urlComp.lpszUserName = NULL;
984  len = 42;
985  ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
986  ok(!ret, "Expected failure\n");
988  "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
989  ok(len == 42, "Expected len 42, got %d\n", len);
990  ok(!strcmp(szUrl, CREATE_URL3), "Expected %s, got %s\n", CREATE_URL3, szUrl);
991 
992  /* valid password, empty username
993  * if password is provided, username has to exist
994  */
995  fill_url_components(&urlComp);
996  urlComp.lpszUserName = empty;
997  len = 51;
998  ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
999  ok(ret, "Expected success\n");
1000  ok(len == 50, "Expected len 50, got %d\n", len);
1001  ok(!strcmp(szUrl, CREATE_URL5), "Expected %s, got %s\n", CREATE_URL5, szUrl);
1002 
1003  /* NULL username, NULL password */
1004  fill_url_components(&urlComp);
1005  urlComp.lpszUserName = NULL;
1006  urlComp.lpszPassword = NULL;
1007  len = 42;
1008  ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
1009  ok(ret, "Expected success\n");
1010  ok(len == 32, "Expected len 32, got %d\n", len);
1011  ok(!strcmp(szUrl, CREATE_URL4), "Expected %s, got %s\n", CREATE_URL4, szUrl);
1012 
1013  /* empty username, empty password */
1014  fill_url_components(&urlComp);
1015  urlComp.lpszUserName = empty;
1016  urlComp.lpszPassword = empty;
1017  len = 51;
1018  ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
1019  ok(ret, "Expected success\n");
1020  ok(len == 50, "Expected len 50, got %d\n", len);
1021  ok(!strcmp(szUrl, CREATE_URL5), "Expected %s, got %s\n", CREATE_URL5, szUrl);
1022 
1023  /* shows that nScheme is ignored, as the appearance of the port number
1024  * depends on lpszScheme and the string copied depends on lpszScheme.
1025  */
1026  fill_url_components(&urlComp);
1027  HeapFree(GetProcessHeap(), 0, szUrl);
1028  urlComp.lpszScheme = nhttp;
1029  urlComp.dwSchemeLength = strlen(urlComp.lpszScheme);
1030  len = strlen(CREATE_URL6) + 1;
1031  szUrl = HeapAlloc(GetProcessHeap(), 0, len);
1032  ret = InternetCreateUrlA(&urlComp, ICU_ESCAPE, szUrl, &len);
1033  ok(ret, "Expected success\n");
1034  ok(len == strlen(CREATE_URL6), "Expected len %d, got %d\n", lstrlenA(CREATE_URL6) + 1, len);
1035  ok(!strcmp(szUrl, CREATE_URL6), "Expected %s, got %s\n", CREATE_URL6, szUrl);
1036 
1037  /* if lpszScheme != "http" or nPort != 80, display nPort */
1038  HeapFree(GetProcessHeap(), 0, szUrl);
1039  urlComp.lpszScheme = http;
1040  urlComp.dwSchemeLength = strlen(urlComp.lpszScheme);
1041  urlComp.nPort = 42;
1042  szUrl = HeapAlloc(GetProcessHeap(), 0, ++len);
1043  ret = InternetCreateUrlA(&urlComp, ICU_ESCAPE, szUrl, &len);
1044  ok(ret, "Expected success\n");
1045  ok(len == 53, "Expected len 53, got %d\n", len);
1046  ok(strstr(szUrl, "42") != NULL, "Expected to find 42 in szUrl\n");
1047  ok(!strcmp(szUrl, CREATE_URL7), "Expected %s, got %s\n", CREATE_URL7, szUrl);
1048 
1049  HeapFree(GetProcessHeap(), 0, szUrl);
1050 
1051  memset(&urlComp, 0, sizeof(urlComp));
1052  urlComp.dwStructSize = sizeof(urlComp);
1053  urlComp.lpszScheme = http;
1054  urlComp.dwSchemeLength = 0;
1055  urlComp.nScheme = INTERNET_SCHEME_HTTP;
1056  urlComp.lpszHostName = winehq;
1057  urlComp.dwHostNameLength = 0;
1058  urlComp.nPort = 80;
1059  urlComp.lpszUserName = username;
1060  urlComp.dwUserNameLength = 0;
1061  urlComp.lpszPassword = password;
1062  urlComp.dwPasswordLength = 0;
1063  urlComp.lpszUrlPath = site_about;
1064  urlComp.dwUrlPathLength = 0;
1065  urlComp.lpszExtraInfo = empty;
1066  urlComp.dwExtraInfoLength = 0;
1067  len = strlen(CREATE_URL1);
1068  szUrl = HeapAlloc(GetProcessHeap(), 0, ++len);
1069  ret = InternetCreateUrlA(&urlComp, ICU_ESCAPE, szUrl, &len);
1070  ok(ret, "Expected success\n");
1071  ok(len == strlen(CREATE_URL1), "Expected len %d, got %d\n", lstrlenA(CREATE_URL1), len);
1072  ok(!strcmp(szUrl, CREATE_URL1), "Expected %s, got %s\n", CREATE_URL1, szUrl);
1073 
1074  HeapFree(GetProcessHeap(), 0, szUrl);
1075 
1076  memset(&urlComp, 0, sizeof(urlComp));
1077  urlComp.dwStructSize = sizeof(urlComp);
1078  urlComp.lpszScheme = https;
1079  urlComp.dwSchemeLength = 0;
1080  urlComp.nScheme = INTERNET_SCHEME_HTTP;
1081  urlComp.lpszHostName = winehq;
1082  urlComp.dwHostNameLength = 0;
1083  urlComp.nPort = 443;
1084  urlComp.lpszUserName = username;
1085  urlComp.dwUserNameLength = 0;
1086  urlComp.lpszPassword = password;
1087  urlComp.dwPasswordLength = 0;
1088  urlComp.lpszUrlPath = site_about;
1089  urlComp.dwUrlPathLength = 0;
1090  urlComp.lpszExtraInfo = empty;
1091  urlComp.dwExtraInfoLength = 0;
1092  len = strlen(CREATE_URL8);
1093  szUrl = HeapAlloc(GetProcessHeap(), 0, ++len);
1094  ret = InternetCreateUrlA(&urlComp, ICU_ESCAPE, szUrl, &len);
1095  ok(ret, "Expected success\n");
1096  ok(len == strlen(CREATE_URL8), "Expected len %d, got %d\n", lstrlenA(CREATE_URL8), len);
1097  ok(!strcmp(szUrl, CREATE_URL8), "Expected %s, got %s\n", CREATE_URL8, szUrl);
1098 
1099  HeapFree(GetProcessHeap(), 0, szUrl);
1100 
1101  memset(&urlComp, 0, sizeof(urlComp));
1102  urlComp.dwStructSize = sizeof(urlComp);
1103  urlComp.lpszScheme = about;
1104  urlComp.dwSchemeLength = 5;
1105  urlComp.lpszUrlPath = blank;
1106  urlComp.dwUrlPathLength = 5;
1107  len = strlen(CREATE_URL9);
1108  len++; /* work around bug in native wininet */
1109  szUrl = HeapAlloc(GetProcessHeap(), 0, ++len);
1110  ret = InternetCreateUrlA(&urlComp, ICU_ESCAPE, szUrl, &len);
1111  ok(ret, "Expected success\n");
1112  ok(len == strlen(CREATE_URL9), "Expected len %d, got %d\n", lstrlenA(CREATE_URL9), len);
1113  ok(!strcmp(szUrl, CREATE_URL9), "Expected %s, got %s\n", CREATE_URL9, szUrl);
1114 
1115  HeapFree(GetProcessHeap(), 0, szUrl);
1116 
1117  memset(&urlComp, 0, sizeof(urlComp));
1118  urlComp.dwStructSize = sizeof(urlComp);
1119  urlComp.lpszScheme = about;
1120  urlComp.lpszHostName = host;
1121  urlComp.lpszUrlPath = blank;
1122  len = strlen(CREATE_URL10);
1123  len++; /* work around bug in native wininet */
1124  szUrl = HeapAlloc(GetProcessHeap(), 0, ++len);
1125  ret = InternetCreateUrlA(&urlComp, ICU_ESCAPE, szUrl, &len);
1126  ok(ret, "Expected success\n");
1127  ok(len == strlen(CREATE_URL10), "Expected len %d, got %d\n", lstrlenA(CREATE_URL10), len);
1128  ok(!strcmp(szUrl, CREATE_URL10), "Expected %s, got %s\n", CREATE_URL10, szUrl);
1129 
1130  HeapFree(GetProcessHeap(), 0, szUrl);
1131 
1132  memset(&urlComp, 0, sizeof(urlComp));
1133  urlComp.dwStructSize = sizeof(urlComp);
1134  urlComp.nPort = 8080;
1135  urlComp.lpszScheme = about;
1136  len = strlen(CREATE_URL11);
1137  szUrl = HeapAlloc(GetProcessHeap(), 0, ++len);
1138  ret = InternetCreateUrlA(&urlComp, ICU_ESCAPE, szUrl, &len);
1139  ok(ret, "Expected success\n");
1140  ok(len == strlen(CREATE_URL11), "Expected len %d, got %d\n", lstrlenA(CREATE_URL11), len);
1141  ok(!strcmp(szUrl, CREATE_URL11), "Expected %s, got %s\n", CREATE_URL11, szUrl);
1142 
1143  HeapFree(GetProcessHeap(), 0, szUrl);
1144 
1145  memset(&urlComp, 0, sizeof(urlComp));
1146  urlComp.dwStructSize = sizeof(urlComp);
1147  urlComp.lpszScheme = http;
1148  urlComp.dwSchemeLength = 0;
1149  urlComp.nScheme = INTERNET_SCHEME_HTTP;
1150  urlComp.lpszHostName = winehq;
1151  urlComp.dwHostNameLength = 0;
1152  urlComp.nPort = 65535;
1153  len = strlen(CREATE_URL12);
1154  szUrl = HeapAlloc(GetProcessHeap(), 0, ++len);
1155  ret = InternetCreateUrlA(&urlComp, ICU_ESCAPE, szUrl, &len);
1156  ok(ret, "Expected success\n");
1157  ok(len == strlen(CREATE_URL12), "Expected len %d, got %d\n", lstrlenA(CREATE_URL12), len);
1158  ok(!strcmp(szUrl, CREATE_URL12), "Expected %s, got %s\n", CREATE_URL12, szUrl);
1159 
1160  HeapFree(GetProcessHeap(), 0, szUrl);
1161 
1162  memset(&urlComp, 0, sizeof(urlComp));
1163  urlComp.dwStructSize = sizeof(urlComp);
1164  urlComp.lpszScheme = http;
1165  urlComp.dwSchemeLength = strlen(urlComp.lpszScheme);
1166  urlComp.lpszHostName = localhost;
1167  urlComp.dwHostNameLength = strlen(urlComp.lpszHostName);
1168  urlComp.nPort = 80;
1169  urlComp.lpszUrlPath = root;
1170  urlComp.dwUrlPathLength = strlen(urlComp.lpszUrlPath);
1171  urlComp.lpszExtraInfo = extra_info;
1172  urlComp.dwExtraInfoLength = strlen(urlComp.lpszExtraInfo);
1173  len = 256;
1174  szUrl = HeapAlloc(GetProcessHeap(), 0, len);
1175  InternetCreateUrlA(&urlComp, ICU_ESCAPE, szUrl, &len);
1176  ok(ret, "Expected success\n");
1177  ok(len == strlen(CREATE_URL13), "Got len %u\n", len);
1178  ok(!strcmp(szUrl, CREATE_URL13), "Expected \"%s\", got \"%s\"\n", CREATE_URL13, szUrl);
1179 
1180  HeapFree(GetProcessHeap(), 0, szUrl);
1181 }
1182 
1184 {
1185  char src[] = "http://www.winehq.org/%27/ /./>/#> ";
1186  char dst[64];
1187  DWORD dstlen;
1188 
1189  dstlen = sizeof(dst);
1191  ok(strcmp(dst, "http://www.winehq.org/%27/%20/%3E/#>") == 0, "Got \"%s\"\n", dst);
1192 
1193  /* despite what MSDN says, ICU_BROWSER_MODE seems to be ignored */
1194  dstlen = sizeof(dst);
1196  ok(strcmp(dst, "http://www.winehq.org/%27/%20/%3E/#>") == 0, "Got \"%s\"\n", dst);
1197 
1198  /* ICU_ESCAPE is supposed to be ignored */
1199  dstlen = sizeof(dst);
1201  ok(strcmp(dst, "http://www.winehq.org/%27/%20/%3E/#>") == 0, "Got \"%s\"\n", dst);
1202 
1203  dstlen = sizeof(dst);
1205  ok(strcmp(dst, "http://www.winehq.org/'/%20/%3E/#>") == 0, "Got \"%s\"\n", dst);
1206 
1207  dstlen = sizeof(dst);
1209  ok(strcmp(dst, "http://www.winehq.org/%2527/%20/%3E/#>") == 0, "Got \"%s\"\n", dst);
1210 
1211  dstlen = sizeof(dst);
1213  ok(strcmp(dst, "http://www.winehq.org/%27/%20/>/#>") == 0, "Got \"%s\"\n", dst);
1214 
1215  dstlen = sizeof(dst);
1217  ok(strcmp(dst, "http://www.winehq.org/%27/ />/#>") == 0, "Got \"%s\"\n", dst);
1218 
1219  dstlen = sizeof(dst);
1221  ok(strcmp(dst, "http://www.winehq.org/%27/%20/./%3E/#>") == 0, "Got \"%s\"\n", dst);
1222 }
1223 
1225 {
1226  int i;
1227 
1228  if(!GetProcAddress(GetModuleHandleA("wininet.dll"), "InternetGetCookieExW")) {
1229  win_skip("Too old IE (older than 6.0)\n");
1230  return;
1231  }
1232 
1233  for(i = 0; i < ARRAY_SIZE(crack_url_tests); i++)
1235 
1236  test_long_url();
1237 
1242 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
int path_off
Definition: url.c:105
LPSTR lpszUserName
Definition: wininet.h:200
#define CREATE_URL7
Definition: url.c:44
int host_skip_broken
Definition: url.c:99
const char * exp_scheme
Definition: url.c:109
LPSTR lpszPassword
Definition: wininet.h:202
#define ERROR_SUCCESS
Definition: deptool.c:10
DWORD ret
Definition: url.c:452
LPSTR lpszExtraInfo
Definition: wininet.h:206
#define error(str)
Definition: mkdosfs.c:1605
LPSTR lpszScheme
Definition: wininet.h:194
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
DWORD dwUrlPathLength
Definition: wininet.h:205
#define ICU_ENCODE_PERCENT
Definition: winhttp.h:295
DWORD dwStructSize
Definition: wininet.h:211
#define CREATE_URL11
Definition: url.c:48
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static const WCHAR url3[]
Definition: url.c:45
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
#define ERROR_INTERNET_UNRECOGNIZED_SCHEME
Definition: wininet.h:1995
#define CP_ACP
Definition: compat.h:109
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
BOOL WINAPI InternetCanonicalizeUrlA(LPCSTR lpszUrl, LPSTR lpszBuffer, LPDWORD lpdwBufferLength, DWORD dwFlags)
Definition: internet.c:1978
char CHAR
Definition: xmlstorage.h:175
struct _root root
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
char * host
Definition: whois.c:55
LPSTR lpszUrlPath
Definition: wininet.h:204
static const BYTE localhost[]
Definition: encode.c:1442
DWORD scheme
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1044
#define ZeroMemory
Definition: winbase.h:1664
INTERNET_PORT port
Definition: url.c:100
DWORD dwUserNameLength
Definition: wininet.h:219
#define test
Definition: rosglue.h:37
char * LPSTR
Definition: xmlstorage.h:182
int user_off
Definition: url.c:101
const char * exp_extrainfo
Definition: url.c:114
#define lstrlenW
Definition: compat.h:609
LPWSTR lpszHostName
Definition: wininet.h:215
#define CREATE_URL2
Definition: url.c:39
#define CREATE_URL1
Definition: url.c:38
#define CREATE_URL3
Definition: url.c:40
static void zero_compsA(URL_COMPONENTSA *dst, DWORD scheLen, DWORD hostLen, DWORD userLen, DWORD passLen, DWORD pathLen, DWORD extrLen)
Definition: url.c:72
LPWSTR lpszExtraInfo
Definition: wininet.h:224
int pass_len
Definition: url.c:104
WORD INTERNET_PORT
Definition: winhttp.h:38
#define CREATE_URL12
Definition: url.c:49
#define ICU_BROWSER_MODE
Definition: winhttp.h:294
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
DWORD dwPasswordLength
Definition: wininet.h:203
int host_off
Definition: url.c:97
static const WCHAR url2[]
Definition: url.c:44
int extra_off
Definition: url.c:107
DWORD dwSchemeLength
Definition: wininet.h:213
#define FALSE
Definition: types.h:117
void pwd(int argc, const char *argv[])
Definition: cmds.c:1401
DWORD dwSchemeLength
Definition: wininet.h:195
INTERNET_PORT nPort
Definition: wininet.h:217
unsigned int BOOL
Definition: ntddk_ex.h:94
#define ICU_NO_META
Definition: winhttp.h:292
static void fill_url_components(URL_COMPONENTSA *lpUrlComponents)
Definition: url.c:830
START_TEST(url)
Definition: url.c:1663
static void InternetCreateUrlA_test(void)
Definition: url.c:856
DWORD dwUserNameLength
Definition: wininet.h:201
const WCHAR * str
static int strcmp_wa(const WCHAR *str1, const char *str2)
Definition: url.c:191
const char * exp_urlpath
Definition: url.c:113
#define CREATE_URL4
Definition: url.c:41
static void InternetCrackUrl_test(void)
Definition: url.c:518
#define CREATE_URL8
Definition: url.c:45
#define b
Definition: ke_i.h:79
DWORD dwHostNameLength
Definition: wininet.h:198
static WCHAR username[]
Definition: url.c:32
#define ICU_ESCAPE
Definition: winhttp.h:48
int user_len
Definition: url.c:102
#define CREATE_URL6
Definition: url.c:43
int path_len
Definition: url.c:106
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
#define ICU_ENCODE_SPACES_ONLY
Definition: winhttp.h:293
BOOL WINAPI InternetCreateUrlA(LPURL_COMPONENTSA lpUrlComponents, DWORD dwFlags, LPSTR lpszUrl, LPDWORD lpdwUrlLength)
Definition: internet.c:4361
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
Definition: id3.c:95
LPWSTR lpszScheme
Definition: wininet.h:212
#define CREATE_URL5
Definition: url.c:42
__wchar_t WCHAR
Definition: xmlstorage.h:180
INTERNET_SCHEME
Definition: wininet.h:135
static void test_crack_url(const crack_url_test_t *test)
Definition: url.c:199
INTERNET_SCHEME nScheme
Definition: wininet.h:214
#define CREATE_URL9
Definition: url.c:46
unsigned long DWORD
Definition: ntddk_ex.h:95
#define ICU_NO_ENCODE
Definition: winhttp.h:290
#define SetLastError(x)
Definition: compat.h:611
DWORD dwPasswordLength
Definition: wininet.h:221
DWORD dwHostNameLength
Definition: wininet.h:216
const char * exp_username
Definition: url.c:111
LPWSTR lpszUserName
Definition: wininet.h:218
#define todo_wine
Definition: test.h:164
const char * url
Definition: url.c:451
T1_FIELD_DICT_PRIVATE password
Definition: t1tokens.h:64
const char * exp_password
Definition: url.c:112
LPWSTR lpszUrlPath
Definition: wininet.h:222
DWORD dwExtraInfoLength
Definition: wininet.h:207
GLenum GLsizei len
Definition: glext.h:6722
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
GLenum src
Definition: glext.h:6340
#define CREATE_URL10
Definition: url.c:47
#define TEST_URL3
Definition: url.c:36
INTERNET_SCHEME scheme
Definition: url.c:96
#define broken(x)
Definition: _sntprintf.h:21
static WCHAR http[]
Definition: url.c:30
DWORD dwUrlPathLength
Definition: wininet.h:223
int scheme_off
Definition: url.c:94
static DWORD dstlen
Definition: directory.c:51
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
INTERNET_PORT nPort
Definition: wininet.h:199
static void copy_compsA(URL_COMPONENTSA *src, URL_COMPONENTSA *dst, DWORD scheLen, DWORD hostLen, DWORD userLen, DWORD passLen, DWORD pathLen, DWORD extrLen)
Definition: url.c:52
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define ARRAY_SIZE(a)
Definition: main.h:24
#define ok(value,...)
Definition: atltest.h:57
GLenum GLenum dst
Definition: glext.h:6340
static void test_long_url(void)
Definition: url.c:481
int pass_off
Definition: url.c:103
int scheme_len
Definition: url.c:95
#define CREATE_URL13
Definition: url.c:50
#define NULL
Definition: types.h:112
BOOL empty
Definition: button.c:170
#define MultiByteToWideChar
Definition: compat.h:110
INTERNET_SCHEME nScheme
Definition: wininet.h:196
static void InternetCrackUrlW_test(void)
Definition: url.c:658
static WCHAR winehq[]
Definition: url.c:31
static const WCHAR userName[]
Definition: wnet.c:2154
static const crack_url_test_t crack_url_tests[]
Definition: url.c:117
static void InternetCanonicalizeUrl_test(void)
Definition: url.c:1183
#define TEST_URL
Definition: url.c:35
const char * exp_hostname
Definition: url.c:110
BOOL WINAPI InternetCrackUrlW(const WCHAR *lpszUrl, DWORD dwUrlLength, DWORD dwFlags, URL_COMPONENTSW *lpUC)
Definition: internet.c:1625
BOOL WINAPI InternetCrackUrlA(const char *url, DWORD url_length, DWORD flags, URL_COMPONENTSA *ret_comp)
Definition: internet.c:1506
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
static WCHAR * a2w(const char *str)
Definition: url.c:180
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define GetProcAddress(x, y)
Definition: compat.h:612
int about
Definition: msacm.c:1365
#define ICU_DECODE
Definition: winhttp.h:291
const char * path
Definition: url.c:450
#define memset(x, y, z)
Definition: compat.h:39
int host_len
Definition: url.c:98
DWORD dwStructSize
Definition: wininet.h:193
#define win_skip
Definition: test.h:151
URL_COMPONENTS URL_COMPONENTSW
Definition: winhttp.h:481
void user(int argc, const char *argv[])
Definition: cmds.c:1350
#define HeapFree(x, y, z)
Definition: compat.h:594
LPSTR lpszHostName
Definition: wininet.h:197
LPWSTR lpszPassword
Definition: wininet.h:220
const char * url
Definition: url.c:93
int extra_len
Definition: url.c:108
static DWORD GLE
Definition: registry.c:38
DWORD dwExtraInfoLength
Definition: wininet.h:225
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10