4 * Copyright 2008 Google (Zac Brown)
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include <httprequest.h>
33 #include "wine/test.h"
35 static const WCHAR test_useragent
[] =
36 {'W','i','n','e',' ','R','e','g','r','e','s','s','i','o','n',' ','T','e','s','t',0};
37 static const WCHAR test_server
[] = {'w','i','n','e','h','q','.','o','r','g',0};
38 static const WCHAR localhostW
[] = {'l','o','c','a','l','h','o','s','t',0};
40 static BOOL
proxy_active(void)
42 WINHTTP_PROXY_INFO proxy_info
;
45 if (WinHttpGetDefaultProxyConfiguration(&proxy_info
))
47 active
= (proxy_info
.lpszProxy
!= NULL
);
49 GlobalFree((HGLOBAL
) proxy_info
.lpszProxy
);
50 if (proxy_info
.lpszProxyBypass
!= NULL
)
51 GlobalFree((HGLOBAL
) proxy_info
.lpszProxyBypass
);
59 static void test_QueryOption(void)
62 HINTERNET session
, request
, connection
;
65 SetLastError(0xdeadbeef);
66 session
= WinHttpOpen(test_useragent
, 0, 0, 0, 0);
67 ok(session
!= NULL
, "WinHttpOpen failed to open session, error %u\n", GetLastError());
69 SetLastError(0xdeadbeef);
70 ret
= WinHttpQueryOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, NULL
, NULL
);
71 ok(!ret
, "should fail to set redirect policy %u\n", GetLastError());
72 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
73 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
76 SetLastError(0xdeadbeef);
77 ret
= WinHttpQueryOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, NULL
, &size
);
78 ok(!ret
, "should fail to query option\n");
79 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
80 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
81 ok(size
== 4, "expected 4, got %u\n", size
);
84 size
= sizeof(feature
) - 1;
85 SetLastError(0xdeadbeef);
86 ret
= WinHttpQueryOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, &size
);
87 ok(!ret
, "should fail to query option\n");
88 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
89 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
90 ok(size
== 4, "expected 4, got %u\n", size
);
93 size
= sizeof(feature
) + 1;
94 SetLastError(0xdeadbeef);
95 ret
= WinHttpQueryOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, &size
);
96 ok(ret
, "failed to query option %u\n", GetLastError());
97 ok(size
== sizeof(feature
), "WinHttpQueryOption should set the size: %u\n", size
);
98 ok(feature
== WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP
,
99 "expected WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, got %#x\n", feature
);
101 SetLastError(0xdeadbeef);
102 ret
= WinHttpSetOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, NULL
, sizeof(feature
));
103 ok(!ret
, "should fail to set redirect policy %u\n", GetLastError());
104 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
105 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
107 feature
= WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
;
108 SetLastError(0xdeadbeef);
109 ret
= WinHttpSetOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, sizeof(feature
) - 1);
110 ok(!ret
, "should fail to set redirect policy %u\n", GetLastError());
111 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
112 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
114 feature
= WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
;
115 SetLastError(0xdeadbeef);
116 ret
= WinHttpSetOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, sizeof(feature
) + 1);
117 ok(!ret
, "should fail to set redirect policy %u\n", GetLastError());
118 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
119 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
121 feature
= WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
;
122 SetLastError(0xdeadbeef);
123 ret
= WinHttpSetOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, sizeof(feature
));
124 ok(ret
, "failed to set redirect policy %u\n", GetLastError());
126 feature
= 0xdeadbeef;
127 size
= sizeof(feature
);
128 SetLastError(0xdeadbeef);
129 ret
= WinHttpQueryOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, &size
);
130 ok(ret
, "failed to query option %u\n", GetLastError());
131 ok(feature
== WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
,
132 "expected WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS, got %#x\n", feature
);
134 feature
= WINHTTP_DISABLE_COOKIES
;
135 SetLastError(0xdeadbeef);
136 ret
= WinHttpSetOption(session
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, sizeof(feature
));
137 ok(!ret
, "should fail to set disable feature for a session\n");
138 ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
139 "expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError());
141 SetLastError(0xdeadbeef);
142 connection
= WinHttpConnect(session
, test_server
, INTERNET_DEFAULT_HTTP_PORT
, 0);
143 ok(connection
!= NULL
, "WinHttpConnect failed to open a connection, error: %u\n", GetLastError());
145 feature
= WINHTTP_DISABLE_COOKIES
;
146 SetLastError(0xdeadbeef);
147 ret
= WinHttpSetOption(connection
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, sizeof(feature
));
148 ok(!ret
, "should fail to set disable feature for a connection\n");
149 ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
150 "expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError());
152 SetLastError(0xdeadbeef);
153 request
= WinHttpOpenRequest(connection
, NULL
, NULL
, NULL
, WINHTTP_NO_REFERER
,
154 WINHTTP_DEFAULT_ACCEPT_TYPES
, 0);
155 if (request
== NULL
&& GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED
)
157 skip("Network unreachable, skipping the test\n");
161 feature
= 0xdeadbeef;
162 size
= sizeof(feature
);
163 SetLastError(0xdeadbeef);
164 ret
= WinHttpQueryOption(request
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, &size
);
165 ok(!ret
, "should fail to query disable feature for a request\n");
166 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
167 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
170 size
= sizeof(feature
);
171 SetLastError(0xdeadbeef);
172 ret
= WinHttpSetOption(request
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, sizeof(feature
));
173 ok(ret
, "failed to set feature %u\n", GetLastError());
175 feature
= 0xffffffff;
176 size
= sizeof(feature
);
177 SetLastError(0xdeadbeef);
178 ret
= WinHttpSetOption(request
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, sizeof(feature
));
179 ok(ret
, "failed to set feature %u\n", GetLastError());
181 feature
= WINHTTP_DISABLE_COOKIES
;
182 size
= sizeof(feature
);
183 SetLastError(0xdeadbeef);
184 ret
= WinHttpSetOption(request
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, sizeof(feature
));
185 ok(ret
, "failed to set feature %u\n", GetLastError());
188 SetLastError(0xdeadbeef);
189 ret
= WinHttpQueryOption(request
, WINHTTP_OPTION_DISABLE_FEATURE
, NULL
, &size
);
190 ok(!ret
, "should fail to query disable feature for a request\n");
191 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
192 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
194 SetLastError(0xdeadbeef);
195 ret
= WinHttpCloseHandle(request
);
196 ok(ret
, "WinHttpCloseHandle failed on closing request: %u\n", GetLastError());
199 SetLastError(0xdeadbeef);
200 ret
= WinHttpCloseHandle(connection
);
201 ok(ret
, "WinHttpCloseHandle failed on closing connection: %u\n", GetLastError());
202 SetLastError(0xdeadbeef);
203 ret
= WinHttpCloseHandle(session
);
204 ok(ret
, "WinHttpCloseHandle failed on closing session: %u\n", GetLastError());
207 static void test_OpenRequest (void)
210 HINTERNET session
, request
, connection
;
212 session
= WinHttpOpen(test_useragent
, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
,
213 WINHTTP_NO_PROXY_NAME
, WINHTTP_NO_PROXY_BYPASS
, 0);
214 ok(session
!= NULL
, "WinHttpOpen failed to open session.\n");
216 /* Test with a bad server name */
217 SetLastError(0xdeadbeef);
218 connection
= WinHttpConnect(session
, NULL
, INTERNET_DEFAULT_HTTP_PORT
, 0);
219 ok (connection
== NULL
, "WinHttpConnect succeeded in opening connection to NULL server argument.\n");
220 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError());
222 /* Test with a valid server name */
223 connection
= WinHttpConnect (session
, test_server
, INTERNET_DEFAULT_HTTP_PORT
, 0);
224 ok(connection
!= NULL
, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
226 request
= WinHttpOpenRequest(connection
, NULL
, NULL
, NULL
, WINHTTP_NO_REFERER
,
227 WINHTTP_DEFAULT_ACCEPT_TYPES
, 0);
228 if (request
== NULL
&& GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED
)
230 skip("Network unreachable, skipping.\n");
233 ok(request
!= NULL
, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
235 ret
= WinHttpSendRequest(request
, WINHTTP_NO_ADDITIONAL_HEADERS
, 0, NULL
, 0, 0, 0);
236 if (!ret
&& GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
)
238 skip("Connection failed, skipping.\n");
241 ok(ret
== TRUE
, "WinHttpSendRequest failed: %u\n", GetLastError());
242 ret
= WinHttpCloseHandle(request
);
243 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing request, got %d.\n", ret
);
246 ret
= WinHttpCloseHandle(connection
);
247 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret
);
248 ret
= WinHttpCloseHandle(session
);
249 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing session, got %d.\n", ret
);
253 static void test_empty_headers_param(void)
255 static const WCHAR winehq
[] = {'w','i','n','e','h','q','.','o','r','g',0};
256 static const WCHAR empty
[] = {0};
257 HINTERNET ses
, con
, req
;
260 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
261 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
263 con
= WinHttpConnect(ses
, winehq
, 80, 0);
264 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
266 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
267 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
269 ret
= WinHttpSendRequest(req
, empty
, 0, NULL
, 0, 0, 0);
270 ok(ret
, "failed to send request %u\n", GetLastError());
272 WinHttpCloseHandle(req
);
273 WinHttpCloseHandle(con
);
274 WinHttpCloseHandle(ses
);
277 static void test_SendRequest (void)
279 HINTERNET session
, request
, connection
;
280 DWORD header_len
, optional_len
, total_len
, bytes_rw
, size
;
286 static const WCHAR test_site
[] = {'c','r','o','s','s','o','v','e','r','.',
287 'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
288 static const WCHAR content_type
[] =
289 {'C','o','n','t','e','n','t','-','T','y','p','e',':',' ','a','p','p','l','i','c','a','t','i','o','n',
290 '/','x','-','w','w','w','-','f','o','r','m','-','u','r','l','e','n','c','o','d','e','d',0};
291 static const WCHAR test_file
[] = {'/','p','o','s','t','t','e','s','t','.','p','h','p',0};
292 static const WCHAR test_verb
[] = {'P','O','S','T',0};
293 static CHAR post_data
[] = "mode=Test";
294 static CHAR test_post
[] = "mode => Test\\0\n";
297 total_len
= optional_len
= sizeof(post_data
);
298 memset(buffer
, 0xff, sizeof(buffer
));
300 session
= WinHttpOpen(test_useragent
, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
,
301 WINHTTP_NO_PROXY_NAME
, WINHTTP_NO_PROXY_BYPASS
, 0);
302 ok(session
!= NULL
, "WinHttpOpen failed to open session.\n");
304 connection
= WinHttpConnect (session
, test_site
, INTERNET_DEFAULT_HTTP_PORT
, 0);
305 ok(connection
!= NULL
, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
307 request
= WinHttpOpenRequest(connection
, test_verb
, test_file
, NULL
, WINHTTP_NO_REFERER
,
308 WINHTTP_DEFAULT_ACCEPT_TYPES
, WINHTTP_FLAG_BYPASS_PROXY_CACHE
);
309 if (request
== NULL
&& GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED
)
311 skip("Network unreachable, skipping.\n");
314 ok(request
!= NULL
, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
315 if (!request
) goto done
;
317 context
= 0xdeadbeef;
318 ret
= WinHttpSetOption(request
, WINHTTP_OPTION_CONTEXT_VALUE
, &context
, sizeof(context
));
319 ok(ret
, "WinHttpSetOption failed: %u\n", GetLastError());
322 ret
= WinHttpSendRequest(request
, content_type
, header_len
, post_data
, optional_len
, total_len
, context
);
323 ok(ret
== TRUE
, "WinHttpSendRequest failed: %u\n", GetLastError());
326 size
= sizeof(context
);
327 ret
= WinHttpQueryOption(request
, WINHTTP_OPTION_CONTEXT_VALUE
, &context
, &size
);
328 ok(ret
, "WinHttpQueryOption failed: %u\n", GetLastError());
329 ok(context
== 0xdeadbef0, "expected 0xdeadbef0, got %lx\n", context
);
331 for (i
= 3; post_data
[i
]; i
++)
334 ret
= WinHttpWriteData(request
, &post_data
[i
], 1, &bytes_rw
);
336 ok(bytes_rw
== 1, "WinHttpWriteData failed, wrote %u bytes instead of 1 byte.\n", bytes_rw
);
337 else /* Since we already passed all optional data in WinHttpSendRequest Win7 fails our WinHttpWriteData call */
339 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "Expected ERROR_INVALID_PARAMETER got %u.\n", GetLastError());
340 ok(bytes_rw
== -1, "Expected bytes_rw to remain unchanged.\n");
344 ret
= WinHttpReceiveResponse(request
, NULL
);
345 ok(ret
== TRUE
, "WinHttpReceiveResponse failed: %u.\n", GetLastError());
348 ret
= WinHttpReadData(request
, buffer
, sizeof(buffer
) - 1, &bytes_rw
);
349 ok(ret
== TRUE
, "WinHttpReadData failed: %u.\n", GetLastError());
351 ok(bytes_rw
== strlen(test_post
), "Read %u bytes instead of %d.\n", bytes_rw
, lstrlen(test_post
));
352 ok(strncmp(buffer
, test_post
, bytes_rw
) == 0, "Data read did not match, got '%s'.\n", buffer
);
354 ret
= WinHttpCloseHandle(request
);
355 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing request, got %d.\n", ret
);
357 ret
= WinHttpCloseHandle(connection
);
358 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret
);
359 ret
= WinHttpCloseHandle(session
);
360 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing session, got %d.\n", ret
);
363 static void test_WinHttpTimeFromSystemTime(void)
366 static const SYSTEMTIME time
= {2008, 7, 1, 28, 10, 5, 52, 0};
367 static const WCHAR expected_string
[] =
368 {'M','o','n',',',' ','2','8',' ','J','u','l',' ','2','0','0','8',' ',
369 '1','0',':','0','5',':','5','2',' ','G','M','T',0};
370 WCHAR time_string
[WINHTTP_TIME_FORMAT_BUFSIZE
+1];
372 ret
= WinHttpTimeFromSystemTime(&time
, time_string
);
373 ok(ret
== TRUE
, "WinHttpTimeFromSystemTime failed: %u\n", GetLastError());
374 ok(memcmp(time_string
, expected_string
, sizeof(expected_string
)) == 0,
375 "Time string returned did not match expected time string.\n");
378 static void test_WinHttpTimeToSystemTime(void)
382 static const SYSTEMTIME expected_time
= {2008, 7, 1, 28, 10, 5, 52, 0};
383 static const WCHAR time_string1
[] =
384 {'M','o','n',',',' ','2','8',' ','J','u','l',' ','2','0','0','8',' ',
385 + '1','0',':','0','5',':','5','2',' ','G','M','T','\n',0};
386 static const WCHAR time_string2
[] =
387 {' ','m','o','n',' ','2','8',' ','j','u','l',' ','2','0','0','8',' ',
388 '1','0',' ','0','5',' ','5','2','\n',0};
390 ret
= WinHttpTimeToSystemTime(time_string1
, &time
);
391 ok(ret
== TRUE
, "WinHttpTimeToSystemTime failed: %u\n", GetLastError());
392 ok(memcmp(&time
, &expected_time
, sizeof(SYSTEMTIME
)) == 0,
393 "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n");
395 ret
= WinHttpTimeToSystemTime(time_string2
, &time
);
396 ok(ret
== TRUE
, "WinHttpTimeToSystemTime failed: %u\n", GetLastError());
397 ok(memcmp(&time
, &expected_time
, sizeof(SYSTEMTIME
)) == 0,
398 "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n");
401 static void test_WinHttpAddHeaders(void)
403 HINTERNET session
, request
, connection
;
405 WCHAR buffer
[MAX_PATH
];
406 WCHAR check_buffer
[MAX_PATH
];
407 DWORD index
, len
, oldlen
;
409 static const WCHAR test_site
[] = {'c','r','o','s','s','o','v','e','r','.',
410 'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
411 static const WCHAR test_file
[] = {'/','p','o','s','t','t','e','s','t','.','p','h','p',0};
412 static const WCHAR test_verb
[] = {'P','O','S','T',0};
414 static const WCHAR test_header_begin
[] =
415 {'P','O','S','T',' ','/','p','o','s','t','t','e','s','t','.','p','h','p',' ','H','T','T','P','/','1'};
416 static const WCHAR full_path_test_header_begin
[] =
417 {'P','O','S','T',' ','h','t','t','p',':','/','/','c','r','o','s','s','o','v','e','r','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',':','8','0','/','p','o','s','t','t','e','s','t','.','p','h','p',' ','H','T','T','P','/','1'};
418 static const WCHAR test_header_end
[] = {'\r','\n','\r','\n',0};
419 static const WCHAR test_header_name
[] = {'W','a','r','n','i','n','g',0};
421 static const WCHAR test_flag_coalesce
[] = {'t','e','s','t','2',',',' ','t','e','s','t','4',0};
422 static const WCHAR test_flag_coalesce_reverse
[] = {'t','e','s','t','3',',',' ','t','e','s','t','4',0};
423 static const WCHAR test_flag_coalesce_comma
[] =
424 {'t','e','s','t','2',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',0};
425 static const WCHAR test_flag_coalesce_comma_reverse
[] =
426 {'t','e','s','t','3',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',0};
427 static const WCHAR test_flag_coalesce_semicolon
[] =
428 {'t','e','s','t','2',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',';',' ','t','e','s','t','6',0};
429 static const WCHAR test_flag_coalesce_semicolon_reverse
[] =
430 {'t','e','s','t','3',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',';',' ','t','e','s','t','6',0};
432 static const WCHAR field
[] = {'f','i','e','l','d',0};
433 static const WCHAR value
[] = {'v','a','l','u','e',' ',0};
434 static const WCHAR value_nospace
[] = {'v','a','l','u','e',0};
436 static const WCHAR test_headers
[][14] =
438 {'W','a','r','n','i','n','g',':','t','e','s','t','1',0},
439 {'W','a','r','n','i','n','g',':','t','e','s','t','2',0},
440 {'W','a','r','n','i','n','g',':','t','e','s','t','3',0},
441 {'W','a','r','n','i','n','g',':','t','e','s','t','4',0},
442 {'W','a','r','n','i','n','g',':','t','e','s','t','5',0},
443 {'W','a','r','n','i','n','g',':','t','e','s','t','6',0},
444 {'W','a','r','n','i','n','g',':','t','e','s','t','7',0},
450 {' ','e',' ',':','f',0},
451 {'f','i','e','l','d',':',' ','v','a','l','u','e',' ',0}
453 static const WCHAR test_indices
[][6] =
455 {'t','e','s','t','1',0},
456 {'t','e','s','t','2',0},
457 {'t','e','s','t','3',0},
458 {'t','e','s','t','4',0}
461 session
= WinHttpOpen(test_useragent
, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
,
462 WINHTTP_NO_PROXY_NAME
, WINHTTP_NO_PROXY_BYPASS
, 0);
463 ok(session
!= NULL
, "WinHttpOpen failed to open session.\n");
465 connection
= WinHttpConnect (session
, test_site
, INTERNET_DEFAULT_HTTP_PORT
, 0);
466 ok(connection
!= NULL
, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
468 request
= WinHttpOpenRequest(connection
, test_verb
, test_file
, NULL
, WINHTTP_NO_REFERER
,
469 WINHTTP_DEFAULT_ACCEPT_TYPES
, 0);
470 if (request
== NULL
&& GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED
)
472 skip("Network unreachable, skipping.\n");
475 ok(request
!= NULL
, "WinHttpOpenRequest failed to open a request, error: %u.\n", GetLastError());
478 len
= sizeof(buffer
);
479 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
480 test_header_name
, buffer
, &len
, &index
);
481 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded, found 'Warning' header.\n");
482 ret
= WinHttpAddRequestHeaders(request
, test_headers
[0], -1L, WINHTTP_ADDREQ_FLAG_ADD
);
483 ok(ret
== TRUE
, "WinHttpAddRequestHeader failed to add new header, got %d with error %u.\n", ret
, GetLastError());
486 len
= sizeof(buffer
);
487 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
488 test_header_name
, buffer
, &len
, &index
);
489 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
490 ok(index
== 1, "WinHttpQueryHeaders failed: header index not incremented\n");
491 ok(memcmp(buffer
, test_indices
[0], sizeof(test_indices
[0])) == 0, "WinHttpQueryHeaders failed: incorrect string returned\n");
492 ok(len
== 5*sizeof(WCHAR
), "WinHttpQueryHeaders failed: invalid length returned, expected 5, got %d\n", len
);
494 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
495 test_header_name
, buffer
, &len
, &index
);
496 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded, second index should not exist.\n");
498 /* Try to fetch the header info with a buffer that's big enough to fit the
499 * string but not the NULL terminator.
502 len
= 5*sizeof(WCHAR
);
503 memset(check_buffer
, 0xab, sizeof(check_buffer
));
504 memcpy(buffer
, check_buffer
, sizeof(buffer
));
505 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
506 test_header_name
, buffer
, &len
, &index
);
507 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded with a buffer that's too small.\n");
508 ok(memcmp(buffer
, check_buffer
, sizeof(buffer
)) == 0,
509 "WinHttpQueryHeaders failed, modified the buffer when it should not have.\n");
510 ok(len
== 6*sizeof(WCHAR
), "WinHttpQueryHeaders returned invalid length, expected 12, got %d\n", len
);
512 /* Try with a NULL buffer */
514 len
= sizeof(buffer
);
515 SetLastError(0xdeadbeef);
516 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS_CRLF
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
517 test_header_name
, NULL
, &len
, &index
);
518 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded.\n");
519 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "Expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
520 ok(len
> 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len
);
521 ok(index
== 0, "WinHttpQueryHeaders incorrectly incremented header index.\n");
523 /* Try with a NULL buffer and a length that's too small */
526 SetLastError(0xdeadbeef);
527 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS_CRLF
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
528 test_header_name
, NULL
, &len
, &index
);
529 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded.\n");
530 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
531 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICENT_BUFFER, go %u\n", GetLastError());
532 ok(len
> 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len
);
533 ok(index
== 0, "WinHttpQueryHeaders incorrectly incremented header index.\n");
537 SetLastError(0xdeadbeef);
538 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS_CRLF
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
539 test_header_name
, NULL
, &len
, &index
);
540 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded.\n");
541 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
542 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
543 ok(len
> 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len
);
544 ok(index
== 0, "WinHttpQueryHeaders failed: index was incremented.\n");
549 len
= sizeof(buffer
);
550 memset(buffer
, 0xff, sizeof(buffer
));
551 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS_CRLF
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
552 test_header_name
, buffer
, &len
, &index
);
553 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: got %d\n", ret
);
554 ok(len
+ sizeof(WCHAR
) <= oldlen
, "WinHttpQueryHeaders resulting length longer than advertized.\n");
555 ok((len
< sizeof(buffer
) - sizeof(WCHAR
)) && buffer
[len
/ sizeof(WCHAR
)] == 0, "WinHttpQueryHeaders did not append NULL terminator\n");
556 ok(len
== lstrlenW(buffer
) * sizeof(WCHAR
), "WinHttpQueryHeaders returned incorrect length.\n");
557 ok(memcmp(buffer
, test_header_begin
, sizeof(test_header_begin
)) == 0 ||
558 memcmp(buffer
, full_path_test_header_begin
, sizeof(full_path_test_header_begin
)) == 0,
559 "WinHttpQueryHeaders returned invalid beginning of header string.\n");
560 ok(memcmp(buffer
+ lstrlenW(buffer
) - 4, test_header_end
, sizeof(test_header_end
)) == 0,
561 "WinHttpQueryHeaders returned invalid end of header string.\n");
562 ok(index
== 0, "WinHttpQueryHeaders incremented header index.\n");
566 SetLastError(0xdeadbeef);
567 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
568 test_header_name
, NULL
, &len
, &index
);
569 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded.\n");
570 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
571 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
572 ok(len
> 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len
);
573 ok(index
== 0, "WinHttpQueryHeaders failed: index was incremented.\n");
577 len
= sizeof(buffer
);
578 memset(buffer
, 0xff, sizeof(buffer
));
579 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
580 test_header_name
, buffer
, &len
, &index
);
581 ok(ret
== TRUE
, "WinHttpQueryHeaders failed %u\n", GetLastError());
582 ok(len
+ sizeof(WCHAR
) <= oldlen
, "resulting length longer than advertized\n");
583 ok((len
< sizeof(buffer
) - sizeof(WCHAR
)) && !buffer
[len
/ sizeof(WCHAR
)] && !buffer
[len
/ sizeof(WCHAR
) - 1],
584 "no double NULL terminator\n");
585 ok(memcmp(buffer
, test_header_begin
, sizeof(test_header_begin
)) == 0 ||
586 memcmp(buffer
, full_path_test_header_begin
, sizeof(full_path_test_header_begin
)) == 0,
587 "invalid beginning of header string.\n");
588 ok(index
== 0, "header index was incremented\n");
590 /* tests for more indices */
591 ret
= WinHttpAddRequestHeaders(request
, test_headers
[1], -1L, WINHTTP_ADDREQ_FLAG_ADD
);
592 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed to add duplicate header: %d\n", ret
);
595 len
= sizeof(buffer
);
596 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
597 test_header_name
, buffer
, &len
, &index
);
598 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
599 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
600 ok(memcmp(buffer
, test_indices
[0], sizeof(test_indices
[0])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
602 len
= sizeof(buffer
);
603 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
604 test_header_name
, buffer
, &len
, &index
);
605 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
606 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
607 ok(memcmp(buffer
, test_indices
[1], sizeof(test_indices
[1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
609 ret
= WinHttpAddRequestHeaders(request
, test_headers
[2], -1L, WINHTTP_ADDREQ_FLAG_REPLACE
);
610 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed to add duplicate header.\n");
613 len
= sizeof(buffer
);
614 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
615 test_header_name
, buffer
, &len
, &index
);
616 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
617 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
618 reverse
= (memcmp(buffer
, test_indices
[1], sizeof(test_indices
[1])) != 0); /* Win7 returns values in reverse order of adding */
619 ok(memcmp(buffer
, test_indices
[reverse
? 2 : 1], sizeof(test_indices
[reverse
? 2 : 1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
621 len
= sizeof(buffer
);
622 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
623 test_header_name
, buffer
, &len
, &index
);
624 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
625 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
626 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 2], sizeof(test_indices
[reverse
? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
628 /* add if new flag */
629 ret
= WinHttpAddRequestHeaders(request
, test_headers
[3], -1L, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW
);
630 ok(ret
== FALSE
, "WinHttpAddRequestHeaders incorrectly replaced existing header.\n");
633 len
= sizeof(buffer
);
634 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
635 test_header_name
, buffer
, &len
, &index
);
636 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
637 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
638 ok(memcmp(buffer
, test_indices
[reverse
? 2 : 1], sizeof(test_indices
[reverse
? 2 : 1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
640 len
= sizeof(buffer
);
641 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
642 test_header_name
, buffer
, &len
, &index
);
643 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
644 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
645 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 2], sizeof(test_indices
[reverse
? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
647 len
= sizeof(buffer
);
648 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
649 test_header_name
, buffer
, &len
, &index
);
650 ok(ret
== FALSE
, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
653 ret
= WinHttpAddRequestHeaders(request
, test_headers
[3], -1L, WINHTTP_ADDREQ_FLAG_COALESCE
);
654 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE.\n");
657 len
= sizeof(buffer
);
658 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
659 test_header_name
, buffer
, &len
, &index
);
660 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
661 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
662 ok(memcmp(buffer
, reverse
? test_flag_coalesce_reverse
: test_flag_coalesce
,
663 reverse
? sizeof(test_flag_coalesce_reverse
) : sizeof(test_flag_coalesce
)) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
665 len
= sizeof(buffer
);
666 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
667 test_header_name
, buffer
, &len
, &index
);
668 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
669 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
670 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 2], sizeof(test_indices
[reverse
? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
672 len
= sizeof(buffer
);
673 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
674 test_header_name
, buffer
, &len
, &index
);
675 ok(ret
== FALSE
, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
677 /* coalesce with comma flag */
678 ret
= WinHttpAddRequestHeaders(request
, test_headers
[4], -1L, WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA
);
679 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA.\n");
682 len
= sizeof(buffer
);
683 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
684 test_header_name
, buffer
, &len
, &index
);
685 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
686 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
687 ok(memcmp(buffer
, reverse
? test_flag_coalesce_comma_reverse
: test_flag_coalesce_comma
,
688 reverse
? sizeof(test_flag_coalesce_comma_reverse
) : sizeof(test_flag_coalesce_comma
)) == 0,
689 "WinHttpQueryHeaders returned incorrect string.\n");
691 len
= sizeof(buffer
);
692 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
693 test_header_name
, buffer
, &len
, &index
);
694 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
695 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
696 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 2], sizeof(test_indices
[reverse
? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
698 len
= sizeof(buffer
);
699 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
700 test_header_name
, buffer
, &len
, &index
);
701 ok(ret
== FALSE
, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
704 /* coalesce with semicolon flag */
705 ret
= WinHttpAddRequestHeaders(request
, test_headers
[5], -1L, WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON
);
706 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON.\n");
709 len
= sizeof(buffer
);
710 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
711 test_header_name
, buffer
, &len
, &index
);
712 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
713 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
714 ok(memcmp(buffer
, reverse
? test_flag_coalesce_semicolon_reverse
: test_flag_coalesce_semicolon
,
715 reverse
? sizeof(test_flag_coalesce_semicolon_reverse
) : sizeof(test_flag_coalesce_semicolon
)) == 0,
716 "WinHttpQueryHeaders returned incorrect string.\n");
718 len
= sizeof(buffer
);
719 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
720 test_header_name
, buffer
, &len
, &index
);
721 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
722 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
723 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 2], sizeof(test_indices
[reverse
? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
725 len
= sizeof(buffer
);
726 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
727 test_header_name
, buffer
, &len
, &index
);
728 ok(ret
== FALSE
, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
730 /* add and replace flags */
731 ret
= WinHttpAddRequestHeaders(request
, test_headers
[3], -1L, WINHTTP_ADDREQ_FLAG_ADD
| WINHTTP_ADDREQ_FLAG_REPLACE
);
732 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE.\n");
735 len
= sizeof(buffer
);
736 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
737 test_header_name
, buffer
, &len
, &index
);
738 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
739 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
740 ok(memcmp(buffer
, test_indices
[reverse
? 3 : 2], sizeof(test_indices
[reverse
? 3 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
742 len
= sizeof(buffer
);
743 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
744 test_header_name
, buffer
, &len
, &index
);
745 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
746 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
747 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 3], sizeof(test_indices
[reverse
? 1 : 3])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
749 len
= sizeof(buffer
);
750 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
751 test_header_name
, buffer
, &len
, &index
);
752 ok(ret
== FALSE
, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
754 ret
= WinHttpAddRequestHeaders(request
, test_headers
[8], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
755 ok(!ret
, "WinHttpAddRequestHeaders failed\n");
757 ret
= WinHttpAddRequestHeaders(request
, test_headers
[9], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
758 ok(ret
, "WinHttpAddRequestHeaders failed\n");
760 ret
= WinHttpAddRequestHeaders(request
, test_headers
[10], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
761 ok(!ret
, "WinHttpAddRequestHeaders failed\n");
763 ret
= WinHttpAddRequestHeaders(request
, test_headers
[11], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
764 ok(!ret
, "WinHttpAddRequestHeaders failed\n");
766 ret
= WinHttpAddRequestHeaders(request
, test_headers
[12], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
767 ok(!ret
, "WinHttpAddRequestHeaders failed\n");
769 ret
= WinHttpAddRequestHeaders(request
, test_headers
[13], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
770 ok(ret
, "WinHttpAddRequestHeaders failed\n");
774 len
= sizeof(buffer
);
775 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
776 field
, buffer
, &len
, &index
);
777 ok(ret
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
778 ok(!memcmp(buffer
, value
, sizeof(value
)) || ! memcmp(buffer
, value_nospace
, sizeof(value_nospace
)), "unexpected result\n");
780 ret
= WinHttpCloseHandle(request
);
781 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing request, got %d.\n", ret
);
783 ret
= WinHttpCloseHandle(connection
);
784 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret
);
785 ret
= WinHttpCloseHandle(session
);
786 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing session, got %d.\n", ret
);
790 static void test_secure_connection(void)
792 static const WCHAR google
[] = {'w','w','w','.','g','o','o','g','l','e','.','c','o','m',0};
794 HINTERNET ses
, con
, req
;
795 DWORD size
, status
, policy
, bitness
;
798 WINHTTP_CERTIFICATE_INFO info
;
801 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
802 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
804 policy
= WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
;
805 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_REDIRECT_POLICY
, &policy
, sizeof(policy
));
806 ok(ret
, "failed to set redirect policy %u\n", GetLastError());
808 con
= WinHttpConnect(ses
, google
, 443, 0);
809 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
811 /* try without setting WINHTTP_FLAG_SECURE */
812 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
813 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
815 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
816 if (!ret
&& GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
)
818 skip("Connection failed, skipping.\n");
821 ok(ret
, "failed to send request %u\n", GetLastError());
823 ret
= WinHttpReceiveResponse(req
, NULL
);
824 ok(!ret
|| proxy_active(), "succeeded unexpectedly\n");
827 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_RAW_HEADERS_CRLF
, NULL
, NULL
, &size
, NULL
);
828 ok(!ret
, "succeeded unexpectedly\n");
830 WinHttpCloseHandle(req
);
832 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, WINHTTP_FLAG_SECURE
);
833 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
835 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
836 ok(ret
, "failed to send request %u\n", GetLastError());
839 skip("secure connection failed, skipping remaining secure tests\n");
844 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SERVER_CERT_CONTEXT
, &cert
, &size
);
845 ok(ret
, "failed to retrieve certificate context %u\n", GetLastError());
847 CertFreeCertificateContext(cert
);
849 size
= sizeof(bitness
);
850 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SECURITY_KEY_BITNESS
, &bitness
, &size
);
851 ok(ret
, "failed to retrieve key bitness %u\n", GetLastError());
854 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT
, &info
, &size
);
855 ok(ret
, "failed to retrieve certificate info %u\n", GetLastError());
857 trace("lpszSubjectInfo %s\n", wine_dbgstr_w(info
.lpszSubjectInfo
));
858 trace("lpszIssuerInfo %s\n", wine_dbgstr_w(info
.lpszIssuerInfo
));
859 trace("lpszProtocolName %s\n", wine_dbgstr_w(info
.lpszProtocolName
));
860 trace("lpszSignatureAlgName %s\n", wine_dbgstr_w(info
.lpszSignatureAlgName
));
861 trace("lpszEncryptionAlgName %s\n", wine_dbgstr_w(info
.lpszEncryptionAlgName
));
862 trace("dwKeySize %u\n", info
.dwKeySize
);
864 ret
= WinHttpReceiveResponse(req
, NULL
);
865 ok(ret
, "failed to receive response %u\n", GetLastError());
867 size
= sizeof(status
);
868 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
| WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
869 ok(ret
, "failed unexpectedly %u\n", GetLastError());
870 ok(status
== 200, "request failed unexpectedly %u\n", status
);
873 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_RAW_HEADERS_CRLF
, NULL
, NULL
, &size
, NULL
);
874 ok(!ret
, "succeeded unexpectedly\n");
879 ret
= WinHttpReadData(req
, buffer
, sizeof(buffer
), &size
);
880 ok(ret
== TRUE
, "WinHttpReadData failed: %u.\n", GetLastError());
885 WinHttpCloseHandle(req
);
886 WinHttpCloseHandle(con
);
887 WinHttpCloseHandle(ses
);
890 static void test_request_parameter_defaults(void)
892 static const WCHAR empty
[] = {0};
893 static const WCHAR codeweavers
[] = {'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
895 HINTERNET ses
, con
, req
;
896 DWORD size
, status
, error
;
900 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
901 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
903 con
= WinHttpConnect(ses
, codeweavers
, 0, 0);
904 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
906 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
907 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
909 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
910 ok(ret
, "failed to send request %u\n", GetLastError());
912 ret
= WinHttpReceiveResponse(req
, NULL
);
913 ok(ret
, "failed to receive response %u\n", GetLastError());
915 size
= sizeof(status
);
916 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
| WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
917 ok(ret
, "failed unexpectedly %u\n", GetLastError());
918 ok(status
== 200, "request failed unexpectedly %u\n", status
);
920 WinHttpCloseHandle(req
);
922 req
= WinHttpOpenRequest(con
, empty
, empty
, empty
, NULL
, NULL
, 0);
923 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
925 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
926 ok(ret
, "failed to send request %u\n", GetLastError());
928 ret
= WinHttpReceiveResponse(req
, NULL
);
929 ok(ret
, "failed to receive response %u\n", GetLastError());
932 SetLastError(0xdeadbeef);
933 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_VERSION
, NULL
, NULL
, &size
, NULL
);
934 error
= GetLastError();
935 ok(!ret
, "succeeded unexpectedly\n");
936 ok(error
== ERROR_INSUFFICIENT_BUFFER
, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error
);
938 version
= HeapAlloc(GetProcessHeap(), 0, size
);
939 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_VERSION
, NULL
, version
, &size
, NULL
);
940 ok(ret
, "failed unexpectedly %u\n", GetLastError());
941 ok(lstrlenW(version
) == size
/ sizeof(WCHAR
), "unexpected size %u\n", size
);
942 HeapFree(GetProcessHeap(), 0, version
);
944 size
= sizeof(status
);
945 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
| WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
946 ok(ret
, "failed unexpectedly %u\n", GetLastError());
947 ok(status
== 200, "request failed unexpectedly %u\n", status
);
949 WinHttpCloseHandle(req
);
950 WinHttpCloseHandle(con
);
951 WinHttpCloseHandle(ses
);
954 static const WCHAR Connections
[] = {
955 'S','o','f','t','w','a','r','e','\\',
956 'M','i','c','r','o','s','o','f','t','\\',
957 'W','i','n','d','o','w','s','\\',
958 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
959 'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\',
960 'C','o','n','n','e','c','t','i','o','n','s',0 };
961 static const WCHAR WinHttpSettings
[] = {
962 'W','i','n','H','t','t','p','S','e','t','t','i','n','g','s',0 };
964 static DWORD
get_default_proxy_reg_value( BYTE
*buf
, DWORD len
, DWORD
*type
)
970 l
= RegOpenKeyExW( HKEY_LOCAL_MACHINE
, Connections
, 0, KEY_READ
, &key
);
975 l
= RegQueryValueExW( key
, WinHttpSettings
, NULL
, type
, NULL
, &size
);
979 l
= RegQueryValueExW( key
, WinHttpSettings
, NULL
, type
, buf
,
989 static void set_default_proxy_reg_value( BYTE
*buf
, DWORD len
, DWORD type
)
994 l
= RegCreateKeyExW( HKEY_LOCAL_MACHINE
, Connections
, 0, NULL
, 0,
995 KEY_WRITE
, NULL
, &key
, NULL
);
999 RegSetValueExW( key
, WinHttpSettings
, 0, type
, buf
, len
);
1001 RegDeleteValueW( key
, WinHttpSettings
);
1006 static void test_set_default_proxy_config(void)
1008 static const WCHAR wideString
[] = { 0x226f, 0x575b, 0 };
1009 static const WCHAR normalString
[] = { 'f','o','o',0 };
1011 BYTE
*saved_proxy_settings
= NULL
;
1012 WINHTTP_PROXY_INFO info
;
1015 /* FIXME: it would be simpler to read the current settings using
1016 * WinHttpGetDefaultProxyConfiguration and save them using
1017 * WinHttpSetDefaultProxyConfiguration, but they appear to have a bug.
1019 * If a proxy is configured in the registry, e.g. via 'proxcfg -p "foo"',
1020 * the access type reported by WinHttpGetDefaultProxyConfiguration is 1,
1021 * WINHTTP_ACCESS_TYPE_NO_PROXY, whereas it should be
1022 * WINHTTP_ACCESS_TYPE_NAMED_PROXY.
1023 * If WinHttpSetDefaultProxyConfiguration is called with dwAccessType = 1,
1024 * the lpszProxy and lpszProxyBypass values are ignored.
1025 * Thus, if a proxy is set with proxycfg, then calling
1026 * WinHttpGetDefaultProxyConfiguration followed by
1027 * WinHttpSetDefaultProxyConfiguration results in the proxy settings
1028 * getting deleted from the registry.
1030 * Instead I read the current registry value and restore it directly.
1032 len
= get_default_proxy_reg_value( NULL
, 0, &type
);
1035 saved_proxy_settings
= HeapAlloc( GetProcessHeap(), 0, len
);
1036 len
= get_default_proxy_reg_value( saved_proxy_settings
, len
, &type
);
1041 /* Crashes on Vista and higher */
1042 SetLastError(0xdeadbeef);
1043 ret
= WinHttpSetDefaultProxyConfiguration(NULL
);
1044 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1045 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1048 /* test with invalid access type */
1049 info
.dwAccessType
= 0xdeadbeef;
1050 info
.lpszProxy
= info
.lpszProxyBypass
= NULL
;
1051 SetLastError(0xdeadbeef);
1052 ret
= WinHttpSetDefaultProxyConfiguration(&info
);
1053 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1054 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1056 /* at a minimum, the proxy server must be set */
1057 info
.dwAccessType
= WINHTTP_ACCESS_TYPE_NAMED_PROXY
;
1058 info
.lpszProxy
= info
.lpszProxyBypass
= NULL
;
1059 SetLastError(0xdeadbeef);
1060 ret
= WinHttpSetDefaultProxyConfiguration(&info
);
1061 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1062 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1063 info
.lpszProxyBypass
= normalString
;
1064 SetLastError(0xdeadbeef);
1065 ret
= WinHttpSetDefaultProxyConfiguration(&info
);
1066 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1067 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1069 /* the proxy server can't have wide characters */
1070 info
.lpszProxy
= wideString
;
1071 SetLastError(0xdeadbeef);
1072 ret
= WinHttpSetDefaultProxyConfiguration(&info
);
1073 ok((!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
) ||
1074 broken(ret
), /* Earlier winhttp versions on W2K/XP */
1075 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1077 info
.lpszProxy
= normalString
;
1078 SetLastError(0xdeadbeef);
1079 ret
= WinHttpSetDefaultProxyConfiguration(&info
);
1082 ok(ret
, "always true\n");
1083 set_default_proxy_reg_value( saved_proxy_settings
, len
, type
);
1085 else if (GetLastError() == ERROR_ACCESS_DENIED
)
1086 skip("couldn't set default proxy configuration: access denied\n");
1088 ok(ret
, "WinHttpSetDefaultProxyConfiguration failed: %d\n",
1092 static void test_Timeouts (void)
1096 HINTERNET ses
, req
, con
;
1097 static const WCHAR codeweavers
[] = {'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
1100 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1101 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
1103 SetLastError(0xdeadbeef);
1104 ret
= WinHttpSetTimeouts(ses
, -2, 0, 0, 0);
1105 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1106 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1108 SetLastError(0xdeadbeef);
1109 ret
= WinHttpSetTimeouts(ses
, 0, -2, 0, 0);
1110 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1111 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1113 SetLastError(0xdeadbeef);
1114 ret
= WinHttpSetTimeouts(ses
, 0, 0, -2, 0);
1115 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1116 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1118 SetLastError(0xdeadbeef);
1119 ret
= WinHttpSetTimeouts(ses
, 0, 0, 0, -2);
1120 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1121 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1123 SetLastError(0xdeadbeef);
1124 ret
= WinHttpSetTimeouts(ses
, -1, -1, -1, -1);
1125 ok(ret
, "%u\n", GetLastError());
1127 SetLastError(0xdeadbeef);
1128 ret
= WinHttpSetTimeouts(ses
, 0, 0, 0, 0);
1129 ok(ret
, "%u\n", GetLastError());
1131 SetLastError(0xdeadbeef);
1132 ret
= WinHttpSetTimeouts(ses
, 0x0123, 0x4567, 0x89ab, 0xcdef);
1133 ok(ret
, "%u\n", GetLastError());
1135 SetLastError(0xdeadbeef);
1137 size
= sizeof(DWORD
);
1138 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1139 ok(ret
, "%u\n", GetLastError());
1140 ok(value
== 0x0123, "Expected 0x0123, got %u\n", value
);
1142 SetLastError(0xdeadbeef);
1144 size
= sizeof(DWORD
);
1145 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1146 ok(ret
, "%u\n", GetLastError());
1147 ok(value
== 0x4567, "Expected 0x4567, got %u\n", value
);
1149 SetLastError(0xdeadbeef);
1151 size
= sizeof(DWORD
);
1152 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1153 ok(ret
, "%u\n", GetLastError());
1154 ok(value
== 0x89ab, "Expected 0x89ab, got %u\n", value
);
1156 SetLastError(0xdeadbeef);
1158 size
= sizeof(DWORD
);
1159 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1160 ok(ret
, "%u\n", GetLastError());
1161 ok(value
== 0xcdef, "Expected 0xcdef, got %u\n", value
);
1163 SetLastError(0xdeadbeef);
1165 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1166 ok(ret
, "%u\n", GetLastError());
1168 SetLastError(0xdeadbeef);
1170 size
= sizeof(DWORD
);
1171 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1172 ok(ret
, "%u\n", GetLastError());
1173 ok(value
== 0, "Expected 0, got %u\n", value
);
1175 SetLastError(0xdeadbeef);
1177 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1178 ok(ret
, "%u\n", GetLastError());
1180 SetLastError(0xdeadbeef);
1182 size
= sizeof(DWORD
);
1183 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1184 ok(ret
, "%u\n", GetLastError());
1185 ok(value
== 0, "Expected 0, got %u\n", value
);
1187 SetLastError(0xdeadbeef);
1189 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1190 ok(ret
, "%u\n", GetLastError());
1192 SetLastError(0xdeadbeef);
1194 size
= sizeof(DWORD
);
1195 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1196 ok(ret
, "%u\n", GetLastError());
1197 ok(value
== 0, "Expected 0, got %u\n", value
);
1199 SetLastError(0xdeadbeef);
1201 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1202 ok(ret
, "%u\n", GetLastError());
1204 SetLastError(0xdeadbeef);
1206 size
= sizeof(DWORD
);
1207 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1208 ok(ret
, "%u\n", GetLastError());
1209 ok(value
== 0, "Expected 0, got %u\n", value
);
1211 SetLastError(0xdeadbeef);
1213 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1214 ok(ret
, "%u\n", GetLastError());
1216 SetLastError(0xdeadbeef);
1218 size
= sizeof(DWORD
);
1219 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1220 ok(ret
, "%u\n", GetLastError());
1221 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1223 SetLastError(0xdeadbeef);
1225 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1226 ok(ret
, "%u\n", GetLastError());
1228 SetLastError(0xdeadbeef);
1230 size
= sizeof(DWORD
);
1231 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1232 ok(ret
, "%u\n", GetLastError());
1233 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1235 SetLastError(0xdeadbeef);
1237 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1238 ok(ret
, "%u\n", GetLastError());
1240 SetLastError(0xdeadbeef);
1242 size
= sizeof(DWORD
);
1243 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1244 ok(ret
, "%u\n", GetLastError());
1245 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1247 SetLastError(0xdeadbeef);
1249 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1250 ok(ret
, "%u\n", GetLastError());
1252 SetLastError(0xdeadbeef);
1254 size
= sizeof(DWORD
);
1255 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1256 ok(ret
, "%u\n", GetLastError());
1257 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1259 con
= WinHttpConnect(ses
, codeweavers
, 0, 0);
1260 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
1262 /* Timeout values should match the last one set for session */
1263 SetLastError(0xdeadbeef);
1265 size
= sizeof(DWORD
);
1266 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1267 ok(ret
, "%u\n", GetLastError());
1268 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1270 SetLastError(0xdeadbeef);
1272 size
= sizeof(DWORD
);
1273 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1274 ok(ret
, "%u\n", GetLastError());
1275 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1277 SetLastError(0xdeadbeef);
1279 size
= sizeof(DWORD
);
1280 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1281 ok(ret
, "%u\n", GetLastError());
1282 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1284 SetLastError(0xdeadbeef);
1286 size
= sizeof(DWORD
);
1287 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1288 ok(ret
, "%u\n", GetLastError());
1289 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1291 SetLastError(0xdeadbeef);
1292 ret
= WinHttpSetTimeouts(con
, -2, 0, 0, 0);
1293 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1294 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1296 SetLastError(0xdeadbeef);
1297 ret
= WinHttpSetTimeouts(con
, 0, -2, 0, 0);
1298 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1299 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1301 SetLastError(0xdeadbeef);
1302 ret
= WinHttpSetTimeouts(con
, 0, 0, -2, 0);
1303 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1304 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1306 SetLastError(0xdeadbeef);
1307 ret
= WinHttpSetTimeouts(con
, 0, 0, 0, -2);
1308 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1309 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1311 SetLastError(0xdeadbeef);
1312 ret
= WinHttpSetTimeouts(con
, -1, -1, -1, -1);
1313 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1314 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1316 SetLastError(0xdeadbeef);
1317 ret
= WinHttpSetTimeouts(con
, 0, 0, 0, 0);
1318 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1319 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1321 SetLastError(0xdeadbeef);
1323 ret
= WinHttpSetOption(con
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1324 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1325 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1327 SetLastError(0xdeadbeef);
1329 ret
= WinHttpSetOption(con
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1330 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1331 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1333 SetLastError(0xdeadbeef);
1335 ret
= WinHttpSetOption(con
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1336 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1337 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1339 SetLastError(0xdeadbeef);
1341 ret
= WinHttpSetOption(con
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1342 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1343 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1345 /* Changing timeout values for session should affect the values for connection */
1346 SetLastError(0xdeadbeef);
1348 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1349 ok(ret
, "%u\n", GetLastError());
1351 SetLastError(0xdeadbeef);
1353 size
= sizeof(DWORD
);
1354 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1355 ok(ret
, "%u\n", GetLastError());
1356 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1358 SetLastError(0xdeadbeef);
1360 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1361 ok(ret
, "%u\n", GetLastError());
1363 SetLastError(0xdeadbeef);
1365 size
= sizeof(DWORD
);
1366 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1367 ok(ret
, "%u\n", GetLastError());
1368 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1370 SetLastError(0xdeadbeef);
1372 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1373 ok(ret
, "%u\n", GetLastError());
1375 SetLastError(0xdeadbeef);
1377 size
= sizeof(DWORD
);
1378 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1379 ok(ret
, "%u\n", GetLastError());
1380 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1382 SetLastError(0xdeadbeef);
1384 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1385 ok(ret
, "%u\n", GetLastError());
1387 SetLastError(0xdeadbeef);
1389 size
= sizeof(DWORD
);
1390 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1391 ok(ret
, "%u\n", GetLastError());
1392 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1394 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
1395 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
1397 /* Timeout values should match the last one set for session */
1398 SetLastError(0xdeadbeef);
1400 size
= sizeof(DWORD
);
1401 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1402 ok(ret
, "%u\n", GetLastError());
1403 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1405 SetLastError(0xdeadbeef);
1407 size
= sizeof(DWORD
);
1408 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1409 ok(ret
, "%u\n", GetLastError());
1410 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1412 SetLastError(0xdeadbeef);
1414 size
= sizeof(DWORD
);
1415 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1416 ok(ret
, "%u\n", GetLastError());
1417 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1419 SetLastError(0xdeadbeef);
1421 size
= sizeof(DWORD
);
1422 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1423 ok(ret
, "%u\n", GetLastError());
1424 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1426 SetLastError(0xdeadbeef);
1427 ret
= WinHttpSetTimeouts(req
, -2, 0, 0, 0);
1428 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1429 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1431 SetLastError(0xdeadbeef);
1432 ret
= WinHttpSetTimeouts(req
, 0, -2, 0, 0);
1433 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1434 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1436 SetLastError(0xdeadbeef);
1437 ret
= WinHttpSetTimeouts(req
, 0, 0, -2, 0);
1438 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1439 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1441 SetLastError(0xdeadbeef);
1442 ret
= WinHttpSetTimeouts(req
, 0, 0, 0, -2);
1443 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1444 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1446 SetLastError(0xdeadbeef);
1447 ret
= WinHttpSetTimeouts(req
, -1, -1, -1, -1);
1448 ok(ret
, "%u\n", GetLastError());
1450 SetLastError(0xdeadbeef);
1451 ret
= WinHttpSetTimeouts(req
, 0, 0, 0, 0);
1452 ok(ret
, "%u\n", GetLastError());
1454 SetLastError(0xdeadbeef);
1455 ret
= WinHttpSetTimeouts(req
, 0xcdef, 0x89ab, 0x4567, 0x0123);
1456 ok(ret
, "%u\n", GetLastError());
1458 SetLastError(0xdeadbeef);
1460 size
= sizeof(DWORD
);
1461 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1462 ok(ret
, "%u\n", GetLastError());
1463 ok(value
== 0xcdef, "Expected 0xcdef, got %u\n", value
);
1465 SetLastError(0xdeadbeef);
1467 size
= sizeof(DWORD
);
1468 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1469 ok(ret
, "%u\n", GetLastError());
1470 ok(value
== 0x89ab, "Expected 0x89ab, got %u\n", value
);
1472 SetLastError(0xdeadbeef);
1474 size
= sizeof(DWORD
);
1475 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1476 ok(ret
, "%u\n", GetLastError());
1477 ok(value
== 0x4567, "Expected 0x4567, got %u\n", value
);
1479 SetLastError(0xdeadbeef);
1481 size
= sizeof(DWORD
);
1482 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1483 ok(ret
, "%u\n", GetLastError());
1484 ok(value
== 0x0123, "Expected 0x0123, got %u\n", value
);
1486 SetLastError(0xdeadbeef);
1488 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1489 ok(ret
, "%u\n", GetLastError());
1491 SetLastError(0xdeadbeef);
1493 size
= sizeof(DWORD
);
1494 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1495 ok(ret
, "%u\n", GetLastError());
1496 ok(value
== 0, "Expected 0, got %u\n", value
);
1498 SetLastError(0xdeadbeef);
1500 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1501 ok(ret
, "%u\n", GetLastError());
1503 SetLastError(0xdeadbeef);
1505 size
= sizeof(DWORD
);
1506 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1507 ok(ret
, "%u\n", GetLastError());
1508 ok(value
== 0, "Expected 0, got %u\n", value
);
1510 SetLastError(0xdeadbeef);
1512 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1513 ok(ret
, "%u\n", GetLastError());
1515 SetLastError(0xdeadbeef);
1517 size
= sizeof(DWORD
);
1518 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1519 ok(ret
, "%u\n", GetLastError());
1520 ok(value
== 0, "Expected 0, got %u\n", value
);
1522 SetLastError(0xdeadbeef);
1524 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1525 ok(ret
, "%u\n", GetLastError());
1527 SetLastError(0xdeadbeef);
1529 size
= sizeof(DWORD
);
1530 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1531 ok(ret
, "%u\n", GetLastError());
1532 ok(value
== 0, "Expected 0, got %u\n", value
);
1534 SetLastError(0xdeadbeef);
1536 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1537 ok(ret
, "%u\n", GetLastError());
1539 SetLastError(0xdeadbeef);
1541 size
= sizeof(DWORD
);
1542 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1543 ok(ret
, "%u\n", GetLastError());
1544 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1546 SetLastError(0xdeadbeef);
1548 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1549 ok(ret
, "%u\n", GetLastError());
1551 SetLastError(0xdeadbeef);
1553 size
= sizeof(DWORD
);
1554 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1555 ok(ret
, "%u\n", GetLastError());
1556 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1558 SetLastError(0xdeadbeef);
1560 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1561 ok(ret
, "%u\n", GetLastError());
1563 SetLastError(0xdeadbeef);
1565 size
= sizeof(DWORD
);
1566 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1567 ok(ret
, "%u\n", GetLastError());
1568 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1570 SetLastError(0xdeadbeef);
1572 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1573 ok(ret
, "%u\n", GetLastError());
1575 SetLastError(0xdeadbeef);
1577 size
= sizeof(DWORD
);
1578 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1579 ok(ret
, "%u\n", GetLastError());
1580 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1582 /* Changing timeout values for session should not affect the values for a request,
1583 * neither should the other way around.
1585 SetLastError(0xdeadbeef);
1587 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1588 ok(ret
, "%u\n", GetLastError());
1590 SetLastError(0xdeadbeef);
1592 size
= sizeof(DWORD
);
1593 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1594 ok(ret
, "%u\n", GetLastError());
1595 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1597 SetLastError(0xdeadbeef);
1599 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1600 ok(ret
, "%u\n", GetLastError());
1602 SetLastError(0xdeadbeef);
1604 size
= sizeof(DWORD
);
1605 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1606 ok(ret
, "%u\n", GetLastError());
1607 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1609 SetLastError(0xdeadbeef);
1611 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1612 ok(ret
, "%u\n", GetLastError());
1614 SetLastError(0xdeadbeef);
1616 size
= sizeof(DWORD
);
1617 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1618 ok(ret
, "%u\n", GetLastError());
1619 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1621 SetLastError(0xdeadbeef);
1623 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1624 ok(ret
, "%u\n", GetLastError());
1626 SetLastError(0xdeadbeef);
1628 size
= sizeof(DWORD
);
1629 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1630 ok(ret
, "%u\n", GetLastError());
1631 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1633 SetLastError(0xdeadbeef);
1635 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1636 ok(ret
, "%u\n", GetLastError());
1638 SetLastError(0xdeadbeef);
1640 size
= sizeof(DWORD
);
1641 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1642 ok(ret
, "%u\n", GetLastError());
1643 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1645 SetLastError(0xdeadbeef);
1647 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1648 ok(ret
, "%u\n", GetLastError());
1650 SetLastError(0xdeadbeef);
1652 size
= sizeof(DWORD
);
1653 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1654 ok(ret
, "%u\n", GetLastError());
1655 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1657 SetLastError(0xdeadbeef);
1659 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1660 ok(ret
, "%u\n", GetLastError());
1662 SetLastError(0xdeadbeef);
1664 size
= sizeof(DWORD
);
1665 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1666 ok(ret
, "%u\n", GetLastError());
1667 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1669 SetLastError(0xdeadbeef);
1671 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1672 ok(ret
, "%u\n", GetLastError());
1674 SetLastError(0xdeadbeef);
1676 size
= sizeof(DWORD
);
1677 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1678 ok(ret
, "%u\n", GetLastError());
1679 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1681 WinHttpCloseHandle(req
);
1682 WinHttpCloseHandle(con
);
1683 WinHttpCloseHandle(ses
);
1686 static void test_resolve_timeout(void)
1688 static const WCHAR codeweavers
[] =
1689 {'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
1690 static const WCHAR nxdomain
[] =
1691 {'n','x','d','o','m','a','i','n','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
1693 HINTERNET ses
, con
, req
;
1697 if (! proxy_active())
1699 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1700 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
1703 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &timeout
, sizeof(timeout
));
1704 ok(ret
, "failed to set resolve timeout %u\n", GetLastError());
1706 con
= WinHttpConnect(ses
, nxdomain
, 0, 0);
1707 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
1709 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
1710 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
1712 SetLastError(0xdeadbeef);
1713 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
1714 ok(!ret
, "sent request\n");
1715 ok(GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED
,
1716 "expected ERROR_WINHTTP_NAME_NOT_RESOLVED got %u\n", GetLastError());
1718 WinHttpCloseHandle(req
);
1719 WinHttpCloseHandle(con
);
1720 WinHttpCloseHandle(ses
);
1723 skip("Skipping host resolution tests, host resolution preformed by proxy\n");
1725 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1726 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
1729 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &timeout
, sizeof(timeout
));
1730 ok(ret
, "failed to set resolve timeout %u\n", GetLastError());
1732 con
= WinHttpConnect(ses
, codeweavers
, 0, 0);
1733 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
1735 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
1736 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
1738 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
1739 ok(ret
, "failed to send request\n");
1741 WinHttpCloseHandle(req
);
1742 WinHttpCloseHandle(con
);
1743 WinHttpCloseHandle(ses
);
1746 static const char page1
[] =
1748 "<HEAD><TITLE>winhttp test page</TITLE></HEAD>\r\n"
1749 "<BODY>The quick brown fox jumped over the lazy dog<P></BODY>\r\n"
1752 static const char okmsg
[] =
1753 "HTTP/1.1 200 OK\r\n"
1754 "Server: winetest\r\n"
1757 static const char noauthmsg
[] =
1758 "HTTP/1.1 401 Unauthorized\r\n"
1759 "Server: winetest\r\n"
1760 "Connection: close\r\n"
1761 "WWW-Authenticate: Basic realm=\"placebo\"\r\n"
1764 static const char proxymsg
[] =
1765 "HTTP/1.1 407 Proxy Authentication Required\r\n"
1766 "Server: winetest\r\n"
1767 "Proxy-Connection: close\r\n"
1768 "Proxy-Authenticate: Basic realm=\"placebo\"\r\n"
1777 static DWORD CALLBACK
server_thread(LPVOID param
)
1779 struct server_info
*si
= param
;
1782 struct sockaddr_in sa
;
1785 int last_request
= 0;
1787 WSAStartup(MAKEWORD(1,1), &wsaData
);
1789 s
= socket(AF_INET
, SOCK_STREAM
, 0);
1790 if (s
== INVALID_SOCKET
)
1794 setsockopt(s
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&on
, sizeof on
);
1796 memset(&sa
, 0, sizeof sa
);
1797 sa
.sin_family
= AF_INET
;
1798 sa
.sin_port
= htons(si
->port
);
1799 sa
.sin_addr
.S_un
.S_addr
= inet_addr("127.0.0.1");
1801 r
= bind(s
, (struct sockaddr
*)&sa
, sizeof(sa
));
1806 SetEvent(si
->event
);
1809 c
= accept(s
, NULL
, NULL
);
1811 memset(buffer
, 0, sizeof buffer
);
1812 for(i
= 0; i
< sizeof buffer
- 1; i
++)
1814 r
= recv(c
, &buffer
[i
], 1, 0);
1817 if (i
< 4) continue;
1818 if (buffer
[i
- 2] == '\n' && buffer
[i
] == '\n' &&
1819 buffer
[i
- 3] == '\r' && buffer
[i
- 1] == '\r')
1822 if (strstr(buffer
, "GET /basic"))
1824 send(c
, okmsg
, sizeof okmsg
- 1, 0);
1825 send(c
, page1
, sizeof page1
- 1, 0);
1827 if (strstr(buffer
, "/auth"))
1829 if (strstr(buffer
, "Authorization: Basic dXNlcjpwd2Q="))
1830 send(c
, okmsg
, sizeof okmsg
- 1, 0);
1832 send(c
, noauthmsg
, sizeof noauthmsg
- 1, 0);
1834 if (strstr(buffer
, "/no_headers"))
1836 send(c
, page1
, sizeof page1
- 1, 0);
1838 if (strstr(buffer
, "GET /quit"))
1840 send(c
, okmsg
, sizeof okmsg
- 1, 0);
1841 send(c
, page1
, sizeof page1
- 1, 0);
1847 } while (!last_request
);
1853 static void test_basic_request(int port
, const WCHAR
*verb
, const WCHAR
*path
)
1855 HINTERNET ses
, con
, req
;
1857 DWORD count
, status
, size
;
1860 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1861 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
1863 con
= WinHttpConnect(ses
, localhostW
, port
, 0);
1864 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
1866 req
= WinHttpOpenRequest(con
, verb
, path
, NULL
, NULL
, NULL
, 0);
1867 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
1869 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
1870 ok(ret
, "failed to send request %u\n", GetLastError());
1872 ret
= WinHttpReceiveResponse(req
, NULL
);
1873 ok(ret
, "failed to receive response %u\n", GetLastError());
1875 size
= sizeof(status
);
1876 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
|WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
1877 ok(ret
, "failed to query status code %u\n", GetLastError());
1878 ok(status
== 200, "request failed unexpectedly %u\n", status
);
1881 memset(buffer
, 0, sizeof(buffer
));
1882 ret
= WinHttpReadData(req
, buffer
, sizeof buffer
, &count
);
1883 ok(ret
, "failed to read data %u\n", GetLastError());
1884 ok(count
== sizeof page1
- 1, "count was wrong\n");
1885 ok(!memcmp(buffer
, page1
, sizeof page1
), "http data wrong\n");
1887 WinHttpCloseHandle(req
);
1888 WinHttpCloseHandle(con
);
1889 WinHttpCloseHandle(ses
);
1892 static void test_basic_authentication(int port
)
1894 static const WCHAR authW
[] = {'/','a','u','t','h',0};
1895 static const WCHAR userW
[] = {'u','s','e','r',0};
1896 static const WCHAR passW
[] = {'p','w','d',0};
1897 HINTERNET ses
, con
, req
;
1898 DWORD status
, size
, error
;
1901 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1902 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
1904 con
= WinHttpConnect(ses
, localhostW
, port
, 0);
1905 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
1907 req
= WinHttpOpenRequest(con
, NULL
, authW
, NULL
, NULL
, NULL
, 0);
1908 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
1910 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
1911 ok(ret
, "failed to send request %u\n", GetLastError());
1913 ret
= WinHttpReceiveResponse(req
, NULL
);
1914 ok(ret
, "failed to receive response %u\n", GetLastError());
1916 size
= sizeof(status
);
1917 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
|WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
1918 ok(ret
, "failed to query status code %u\n", GetLastError());
1919 ok(status
== 401, "request failed unexpectedly %u\n", status
);
1921 SetLastError(0xdeadbeef);
1922 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, userW
, NULL
, NULL
);
1923 error
= GetLastError();
1924 ok(!ret
, "expected failure\n");
1925 ok(error
== ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %u\n", error
);
1927 SetLastError(0xdeadbeef);
1928 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, NULL
, passW
, NULL
);
1929 error
= GetLastError();
1930 ok(!ret
, "expected failure\n");
1931 ok(error
== ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %u\n", error
);
1933 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, userW
, passW
, NULL
);
1934 ok(ret
, "failed to set credentials %u\n", GetLastError());
1936 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
1937 ok(ret
, "failed to send request %u\n", GetLastError());
1939 ret
= WinHttpReceiveResponse(req
, NULL
);
1940 ok(ret
, "failed to receive response %u\n", GetLastError());
1942 size
= sizeof(status
);
1943 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
|WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
1944 ok(ret
, "failed to query status code %u\n", GetLastError());
1945 ok(status
== 200, "request failed unexpectedly %u\n", status
);
1947 WinHttpCloseHandle(req
);
1948 WinHttpCloseHandle(con
);
1949 WinHttpCloseHandle(ses
);
1952 static void test_no_headers(int port
)
1954 static const WCHAR no_headersW
[] = {'/','n','o','_','h','e','a','d','e','r','s',0};
1955 HINTERNET ses
, con
, req
;
1959 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1960 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
1962 con
= WinHttpConnect(ses
, localhostW
, port
, 0);
1963 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
1965 req
= WinHttpOpenRequest(con
, NULL
, no_headersW
, NULL
, NULL
, NULL
, 0);
1966 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
1968 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
1969 ok(ret
, "failed to send request %u\n", GetLastError());
1971 SetLastError(0xdeadbeef);
1972 ret
= WinHttpReceiveResponse(req
, NULL
);
1973 error
= GetLastError();
1974 ok(!ret
, "expected failure\n");
1975 ok(error
== ERROR_WINHTTP_INVALID_SERVER_RESPONSE
, "got %u\n", error
);
1977 WinHttpCloseHandle(req
);
1978 WinHttpCloseHandle(con
);
1979 WinHttpCloseHandle(ses
);
1982 static void test_bad_header( int port
)
1984 static const WCHAR bad_headerW
[] =
1985 {'C','o','n','t','e','n','t','-','T','y','p','e',':',' ',
1986 't','e','x','t','/','h','t','m','l','\n','\r',0};
1987 static const WCHAR text_htmlW
[] = {'t','e','x','t','/','h','t','m','l',0};
1988 static const WCHAR content_typeW
[] = {'C','o','n','t','e','n','t','-','T','y','p','e',0};
1990 HINTERNET ses
, con
, req
;
1994 ses
= WinHttpOpen( test_useragent
, 0, NULL
, NULL
, 0 );
1995 ok( ses
!= NULL
, "failed to open session %u\n", GetLastError() );
1997 con
= WinHttpConnect( ses
, localhostW
, port
, 0 );
1998 ok( con
!= NULL
, "failed to open a connection %u\n", GetLastError() );
2000 req
= WinHttpOpenRequest( con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0 );
2001 ok( req
!= NULL
, "failed to open a request %u\n", GetLastError() );
2003 ret
= WinHttpAddRequestHeaders( req
, bad_headerW
, ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
2004 ok( ret
, "failed to add header %u\n", GetLastError() );
2008 len
= sizeof(buffer
);
2009 ret
= WinHttpQueryHeaders( req
, WINHTTP_QUERY_CUSTOM
|WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
2010 content_typeW
, buffer
, &len
, &index
);
2011 ok( ret
, "failed to query headers %u\n", GetLastError() );
2012 ok( !lstrcmpW( buffer
, text_htmlW
), "got %s\n", wine_dbgstr_w(buffer
) );
2014 WinHttpCloseHandle( req
);
2015 WinHttpCloseHandle( con
);
2016 WinHttpCloseHandle( ses
);
2019 static void test_credentials(void)
2021 static WCHAR userW
[] = {'u','s','e','r',0};
2022 static WCHAR passW
[] = {'p','a','s','s',0};
2023 static WCHAR proxy_userW
[] = {'p','r','o','x','y','u','s','e','r',0};
2024 static WCHAR proxy_passW
[] = {'p','r','o','x','y','p','a','s','s',0};
2025 HINTERNET ses
, con
, req
;
2030 ses
= WinHttpOpen(test_useragent
, 0, proxy_userW
, proxy_passW
, 0);
2031 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
2033 con
= WinHttpConnect(ses
, localhostW
, 0, 0);
2034 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
2036 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
2037 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
2039 size
= sizeof(buffer
)/sizeof(WCHAR
);
2040 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PROXY_USERNAME
, &buffer
, &size
);
2041 ok(ret
, "failed to query proxy username %u\n", GetLastError());
2042 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2043 ok(!size
, "expected 0, got %u\n", size
);
2045 size
= sizeof(buffer
)/sizeof(WCHAR
);
2046 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PROXY_PASSWORD
, &buffer
, &size
);
2047 ok(ret
, "failed to query proxy password %u\n", GetLastError());
2048 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2049 ok(!size
, "expected 0, got %u\n", size
);
2051 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_PROXY_USERNAME
, proxy_userW
, lstrlenW(proxy_userW
));
2052 ok(ret
, "failed to set username %u\n", GetLastError());
2054 size
= sizeof(buffer
)/sizeof(WCHAR
);
2055 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PROXY_USERNAME
, &buffer
, &size
);
2056 ok(ret
, "failed to query proxy username %u\n", GetLastError());
2057 ok(!winetest_strcmpW(buffer
, proxy_userW
), "unexpected result %s\n", wine_dbgstr_w(buffer
));
2058 ok(size
== lstrlenW(proxy_userW
) * sizeof(WCHAR
), "unexpected result %u\n", size
);
2060 size
= sizeof(buffer
)/sizeof(WCHAR
);
2061 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_USERNAME
, &buffer
, &size
);
2062 ok(ret
, "failed to query username %u\n", GetLastError());
2063 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2064 ok(!size
, "expected 0, got %u\n", size
);
2066 size
= sizeof(buffer
)/sizeof(WCHAR
);
2067 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PASSWORD
, &buffer
, &size
);
2068 ok(ret
, "failed to query password %u\n", GetLastError());
2069 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2070 ok(!size
, "expected 0, got %u\n", size
);
2072 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_PROXY_PASSWORD
, proxy_passW
, lstrlenW(proxy_passW
));
2073 ok(ret
, "failed to set proxy password %u\n", GetLastError());
2075 size
= sizeof(buffer
)/sizeof(WCHAR
);
2076 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PROXY_PASSWORD
, &buffer
, &size
);
2077 ok(ret
, "failed to query proxy password %u\n", GetLastError());
2078 ok(!winetest_strcmpW(buffer
, proxy_passW
), "unexpected result %s\n", wine_dbgstr_w(buffer
));
2079 ok(size
== lstrlenW(proxy_passW
) * sizeof(WCHAR
), "unexpected result %u\n", size
);
2081 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_USERNAME
, userW
, lstrlenW(userW
));
2082 ok(ret
, "failed to set username %u\n", GetLastError());
2084 size
= sizeof(buffer
)/sizeof(WCHAR
);
2085 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_USERNAME
, &buffer
, &size
);
2086 ok(ret
, "failed to query username %u\n", GetLastError());
2087 ok(!winetest_strcmpW(buffer
, userW
), "unexpected result %s\n", wine_dbgstr_w(buffer
));
2088 ok(size
== lstrlenW(userW
) * sizeof(WCHAR
), "unexpected result %u\n", size
);
2090 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_PASSWORD
, passW
, lstrlenW(passW
));
2091 ok(ret
, "failed to set password %u\n", GetLastError());
2093 size
= sizeof(buffer
)/sizeof(WCHAR
);
2094 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PASSWORD
, &buffer
, &size
);
2095 ok(ret
, "failed to query password %u\n", GetLastError());
2096 ok(!winetest_strcmpW(buffer
, passW
), "unexpected result %s\n", wine_dbgstr_w(buffer
));
2097 ok(size
== lstrlenW(passW
) * sizeof(WCHAR
), "unexpected result %u\n", size
);
2099 WinHttpCloseHandle(req
);
2101 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
2102 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
2104 SetLastError(0xdeadbeef);
2105 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, userW
, NULL
, NULL
);
2106 error
= GetLastError();
2107 ok(!ret
, "expected failure\n");
2108 ok(error
== ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %u\n", error
);
2110 SetLastError(0xdeadbeef);
2111 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, NULL
, passW
, NULL
);
2112 error
= GetLastError();
2113 ok(!ret
, "expected failure\n");
2114 ok(error
== ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %u\n", error
);
2116 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, userW
, passW
, NULL
);
2117 ok(ret
, "failed to set credentials %u\n", GetLastError());
2119 size
= sizeof(buffer
)/sizeof(WCHAR
);
2120 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_USERNAME
, &buffer
, &size
);
2121 ok(ret
, "failed to query username %u\n", GetLastError());
2123 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2124 ok(!size
, "expected 0, got %u\n", size
);
2127 size
= sizeof(buffer
)/sizeof(WCHAR
);
2128 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PASSWORD
, &buffer
, &size
);
2129 ok(ret
, "failed to query password %u\n", GetLastError());
2131 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2132 ok(!size
, "expected 0, got %u\n", size
);
2135 WinHttpCloseHandle(req
);
2136 WinHttpCloseHandle(con
);
2137 WinHttpCloseHandle(ses
);
2140 static void test_IWinHttpRequest(void)
2142 static const WCHAR usernameW
[] = {'u','s','e','r','n','a','m','e',0};
2143 static const WCHAR passwordW
[] = {'p','a','s','s','w','o','r','d',0};
2144 static const WCHAR url1W
[] = {'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0};
2145 static const WCHAR url2W
[] = {'w','i','n','e','h','q','.','o','r','g',0};
2146 static const WCHAR url3W
[] = {'h','t','t','p',':','/','/','c','r','o','s','s','o','v','e','r','.',
2147 'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m','/',
2148 'p','o','s','t','t','e','s','t','.','p','h','p',0};
2149 static const WCHAR method1W
[] = {'G','E','T',0};
2150 static const WCHAR method2W
[] = {'I','N','V','A','L','I','D',0};
2151 static const WCHAR method3W
[] = {'P','O','S','T',0};
2152 static const WCHAR proxy_serverW
[] = {'p','r','o','x','y','s','e','r','v','e','r',0};
2153 static const WCHAR bypas_listW
[] = {'b','y','p','a','s','s','l','i','s','t',0};
2154 static const WCHAR connectionW
[] = {'C','o','n','n','e','c','t','i','o','n',0};
2155 static const WCHAR dateW
[] = {'D','a','t','e',0};
2156 static const WCHAR test_dataW
[] = {'t','e','s','t','d','a','t','a',128,0};
2158 IWinHttpRequest
*req
;
2159 BSTR method
, url
, username
, password
, response
= NULL
, status_text
= NULL
, headers
= NULL
;
2160 BSTR date
, today
, connection
, value
= NULL
;
2161 VARIANT async
, empty
, timeout
, body
, proxy_server
, bypass_list
, data
;
2162 VARIANT_BOOL succeeded
;
2164 WCHAR todayW
[WINHTTP_TIME_FORMAT_BUFSIZE
];
2167 GetSystemTime( &st
);
2168 WinHttpTimeFromSystemTime( &st
, todayW
);
2170 CoInitialize( NULL
);
2171 hr
= CoCreateInstance( &CLSID_WinHttpRequest
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWinHttpRequest
, (void **)&req
);
2172 ok( hr
== S_OK
, "got %08x\n", hr
);
2174 V_VT( &empty
) = VT_ERROR
;
2175 V_ERROR( &empty
) = 0xdeadbeef;
2177 V_VT( &async
) = VT_BOOL
;
2178 V_BOOL( &async
) = VARIANT_FALSE
;
2180 method
= SysAllocString( method3W
);
2181 url
= SysAllocString( url3W
);
2182 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
2183 ok( hr
== S_OK
, "got %08x\n", hr
);
2184 SysFreeString( method
);
2185 SysFreeString( url
);
2187 V_VT( &data
) = VT_BSTR
;
2188 V_BSTR( &data
) = SysAllocString( test_dataW
);
2189 hr
= IWinHttpRequest_Send( req
, data
);
2190 ok( hr
== S_OK
|| broken(hr
== HRESULT_FROM_WIN32(ERROR_WINHTTP_INVALID_SERVER_RESPONSE
)),
2192 SysFreeString( V_BSTR( &data
) );
2194 hr
= IWinHttpRequest_Open( req
, NULL
, NULL
, empty
);
2195 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2197 method
= SysAllocString( method1W
);
2198 hr
= IWinHttpRequest_Open( req
, method
, NULL
, empty
);
2199 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2201 hr
= IWinHttpRequest_Open( req
, method
, NULL
, async
);
2202 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2204 url
= SysAllocString( url1W
);
2205 hr
= IWinHttpRequest_Open( req
, NULL
, url
, empty
);
2206 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2208 hr
= IWinHttpRequest_Abort( req
);
2209 ok( hr
== S_OK
, "got %08x\n", hr
);
2211 hr
= IWinHttpRequest_Open( req
, method
, url
, empty
);
2212 ok( hr
== S_OK
, "got %08x\n", hr
);
2214 hr
= IWinHttpRequest_Abort( req
);
2215 ok( hr
== S_OK
, "got %08x\n", hr
);
2217 hr
= IWinHttpRequest_Release( req
);
2218 ok( hr
== S_OK
, "got %08x\n", hr
);
2220 hr
= CoCreateInstance( &CLSID_WinHttpRequest
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWinHttpRequest
, (void **)&req
);
2221 ok( hr
== S_OK
, "got %08x\n", hr
);
2223 SysFreeString( url
);
2224 url
= SysAllocString( url2W
);
2225 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
2226 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_UNRECOGNIZED_SCHEME
), "got %08x\n", hr
);
2228 SysFreeString( method
);
2229 method
= SysAllocString( method2W
);
2230 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
2231 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_UNRECOGNIZED_SCHEME
), "got %08x\n", hr
);
2233 SysFreeString( method
);
2234 method
= SysAllocString( method1W
);
2235 SysFreeString( url
);
2236 url
= SysAllocString( url1W
);
2237 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
2238 ok( hr
== S_OK
, "got %08x\n", hr
);
2240 hr
= IWinHttpRequest_Abort( req
);
2241 ok( hr
== S_OK
, "got %08x\n", hr
);
2243 hr
= IWinHttpRequest_Send( req
, empty
);
2244 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN
), "got %08x\n", hr
);
2246 hr
= IWinHttpRequest_Abort( req
);
2247 ok( hr
== S_OK
, "got %08x\n", hr
);
2249 hr
= IWinHttpRequest_Release( req
);
2250 ok( hr
== S_OK
, "got %08x\n", hr
);
2252 hr
= CoCreateInstance( &CLSID_WinHttpRequest
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWinHttpRequest
, (void **)&req
);
2253 ok( hr
== S_OK
, "got %08x\n", hr
);
2255 hr
= IWinHttpRequest_get_ResponseText( req
, NULL
);
2256 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2258 hr
= IWinHttpRequest_get_ResponseText( req
, &response
);
2259 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2261 hr
= IWinHttpRequest_get_Status( req
, NULL
);
2262 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2264 hr
= IWinHttpRequest_get_Status( req
, &status
);
2265 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2267 hr
= IWinHttpRequest_get_StatusText( req
, NULL
);
2268 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2270 hr
= IWinHttpRequest_get_StatusText( req
, &status_text
);
2271 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2273 hr
= IWinHttpRequest_get_ResponseBody( req
, NULL
);
2274 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2276 hr
= IWinHttpRequest_SetTimeouts( req
, 10000, 10000, 10000, 10000 );
2277 ok( hr
== S_OK
, "got %08x\n", hr
);
2279 hr
= IWinHttpRequest_SetCredentials( req
, NULL
, NULL
, 0xdeadbeef );
2280 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN
), "got %08x\n", hr
);
2282 VariantInit( &proxy_server
);
2283 V_VT( &proxy_server
) = VT_ERROR
;
2284 VariantInit( &bypass_list
);
2285 V_VT( &bypass_list
) = VT_ERROR
;
2286 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2287 ok( hr
== S_OK
, "got %08x\n", hr
);
2289 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_PROXY
, proxy_server
, bypass_list
);
2290 ok( hr
== S_OK
, "got %08x\n", hr
);
2292 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2293 ok( hr
== S_OK
, "got %08x\n", hr
);
2295 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, NULL
);
2296 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2298 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, &headers
);
2299 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2301 hr
= IWinHttpRequest_GetResponseHeader( req
, NULL
, NULL
);
2302 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2304 connection
= SysAllocString( connectionW
);
2305 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, NULL
);
2306 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2308 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, &value
);
2309 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2311 hr
= IWinHttpRequest_SetRequestHeader( req
, NULL
, NULL
);
2312 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2314 date
= SysAllocString( dateW
);
2315 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, NULL
);
2316 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN
), "got %08x\n", hr
);
2318 today
= SysAllocString( todayW
);
2319 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, today
);
2320 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN
), "got %08x\n", hr
);
2322 hr
= IWinHttpRequest_SetAutoLogonPolicy( req
, 0xdeadbeef );
2323 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2325 hr
= IWinHttpRequest_SetAutoLogonPolicy( req
, AutoLogonPolicy_OnlyIfBypassProxy
);
2326 ok( hr
== S_OK
, "got %08x\n", hr
);
2328 SysFreeString( method
);
2329 method
= SysAllocString( method1W
);
2330 SysFreeString( url
);
2331 url
= SysAllocString( url1W
);
2332 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
2333 ok( hr
== S_OK
, "got %08x\n", hr
);
2335 hr
= IWinHttpRequest_get_ResponseText( req
, NULL
);
2336 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2338 hr
= IWinHttpRequest_get_ResponseText( req
, &response
);
2339 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2341 hr
= IWinHttpRequest_get_Status( req
, &status
);
2342 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2344 hr
= IWinHttpRequest_get_StatusText( req
, &status_text
);
2345 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2347 hr
= IWinHttpRequest_get_ResponseBody( req
, NULL
);
2348 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2350 hr
= IWinHttpRequest_SetTimeouts( req
, 10000, 10000, 10000, 10000 );
2351 ok( hr
== S_OK
, "got %08x\n", hr
);
2353 hr
= IWinHttpRequest_SetCredentials( req
, NULL
, NULL
, 0xdeadbeef );
2354 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2356 username
= SysAllocString( usernameW
);
2357 hr
= IWinHttpRequest_SetCredentials( req
, username
, NULL
, 0xdeadbeef );
2358 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2360 password
= SysAllocString( passwordW
);
2361 hr
= IWinHttpRequest_SetCredentials( req
, NULL
, password
, 0xdeadbeef );
2362 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2364 hr
= IWinHttpRequest_SetCredentials( req
, username
, password
, 0xdeadbeef );
2365 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2367 hr
= IWinHttpRequest_SetCredentials( req
, NULL
, password
, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
);
2368 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2370 hr
= IWinHttpRequest_SetCredentials( req
, username
, password
, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
);
2371 ok( hr
== S_OK
, "got %08x\n", hr
);
2373 V_VT( &proxy_server
) = VT_BSTR
;
2374 V_BSTR( &proxy_server
) = SysAllocString( proxy_serverW
);
2375 V_VT( &bypass_list
) = VT_BSTR
;
2376 V_BSTR( &bypass_list
) = SysAllocString( bypas_listW
);
2377 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_PROXY
, proxy_server
, bypass_list
);
2378 ok( hr
== S_OK
, "got %08x\n", hr
);
2380 hr
= IWinHttpRequest_SetProxy( req
, 0xdeadbeef, proxy_server
, bypass_list
);
2381 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2383 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2384 ok( hr
== S_OK
, "got %08x\n", hr
);
2386 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, &headers
);
2387 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2389 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, &value
);
2390 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2392 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, today
);
2393 ok( hr
== S_OK
, "got %08x\n", hr
);
2395 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, NULL
);
2396 ok( hr
== S_OK
, "got %08x\n", hr
);
2398 hr
= IWinHttpRequest_SetAutoLogonPolicy( req
, AutoLogonPolicy_OnlyIfBypassProxy
);
2399 ok( hr
== S_OK
, "got %08x\n", hr
);
2401 hr
= IWinHttpRequest_Send( req
, empty
);
2402 ok( hr
== S_OK
, "got %08x\n", hr
);
2404 hr
= IWinHttpRequest_Send( req
, empty
);
2405 ok( hr
== S_OK
, "got %08x\n", hr
);
2407 hr
= IWinHttpRequest_get_ResponseText( req
, NULL
);
2408 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2410 hr
= IWinHttpRequest_get_ResponseText( req
, &response
);
2411 ok( hr
== S_OK
, "got %08x\n", hr
);
2412 SysFreeString( response
);
2414 hr
= IWinHttpRequest_get_Status( req
, NULL
);
2415 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2418 hr
= IWinHttpRequest_get_Status( req
, &status
);
2419 ok( hr
== S_OK
, "got %08x\n", hr
);
2420 trace("%d\n", status
);
2422 hr
= IWinHttpRequest_get_StatusText( req
, NULL
);
2423 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2425 hr
= IWinHttpRequest_get_StatusText( req
, &status_text
);
2426 ok( hr
== S_OK
, "got %08x\n", hr
);
2427 trace("%s\n", wine_dbgstr_w(status_text
));
2428 SysFreeString( status_text
);
2430 hr
= IWinHttpRequest_get_ResponseBody( req
, NULL
);
2431 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2433 hr
= IWinHttpRequest_SetCredentials( req
, username
, password
, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
);
2434 ok( hr
== S_OK
, "got %08x\n", hr
);
2436 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_PROXY
, proxy_server
, bypass_list
);
2437 ok( hr
== S_OK
, "got %08x\n", hr
);
2439 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2440 ok( hr
== S_OK
, "got %08x\n", hr
);
2442 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, NULL
);
2443 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2445 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, &headers
);
2446 ok( hr
== S_OK
, "got %08x\n", hr
);
2447 SysFreeString( headers
);
2449 hr
= IWinHttpRequest_GetResponseHeader( req
, NULL
, NULL
);
2450 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2452 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, NULL
);
2453 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2455 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, &value
);
2456 ok( hr
== S_OK
, "got %08x\n", hr
);
2457 SysFreeString( value
);
2459 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, today
);
2460 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_AFTER_SEND
), "got %08x\n", hr
);
2462 hr
= IWinHttpRequest_SetAutoLogonPolicy( req
, AutoLogonPolicy_OnlyIfBypassProxy
);
2463 ok( hr
== S_OK
, "got %08x\n", hr
);
2465 VariantInit( &timeout
);
2466 V_VT( &timeout
) = VT_I4
;
2467 V_I4( &timeout
) = 10;
2468 hr
= IWinHttpRequest_WaitForResponse( req
, timeout
, &succeeded
);
2469 ok( hr
== S_OK
, "got %08x\n", hr
);
2471 hr
= IWinHttpRequest_get_Status( req
, &status
);
2472 ok( hr
== S_OK
, "got %08x\n", hr
);
2474 hr
= IWinHttpRequest_get_StatusText( req
, &status_text
);
2475 ok( hr
== S_OK
, "got %08x\n", hr
);
2476 SysFreeString( status_text
);
2478 hr
= IWinHttpRequest_SetCredentials( req
, username
, password
, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
);
2479 ok( hr
== S_OK
, "got %08x\n", hr
);
2481 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_PROXY
, proxy_server
, bypass_list
);
2482 ok( hr
== S_OK
, "got %08x\n", hr
);
2484 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2485 ok( hr
== S_OK
, "got %08x\n", hr
);
2487 hr
= IWinHttpRequest_Send( req
, empty
);
2488 ok( hr
== S_OK
, "got %08x\n", hr
);
2490 hr
= IWinHttpRequest_get_ResponseText( req
, NULL
);
2491 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2493 hr
= IWinHttpRequest_get_ResponseText( req
, &response
);
2494 ok( hr
== S_OK
, "got %08x\n", hr
);
2495 SysFreeString( response
);
2497 hr
= IWinHttpRequest_get_ResponseBody( req
, NULL
);
2498 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2500 VariantInit( &body
);
2501 V_VT( &body
) = VT_ERROR
;
2502 hr
= IWinHttpRequest_get_ResponseBody( req
, &body
);
2503 ok( hr
== S_OK
, "got %08x\n", hr
);
2504 ok( V_VT( &body
) == (VT_ARRAY
|VT_UI1
), "got %08x\n", V_VT( &body
) );
2506 hr
= VariantClear( &body
);
2507 ok( hr
== S_OK
, "got %08x\n", hr
);
2509 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_PROXY
, proxy_server
, bypass_list
);
2510 ok( hr
== S_OK
, "got %08x\n", hr
);
2512 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2513 ok( hr
== S_OK
, "got %08x\n", hr
);
2515 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, &headers
);
2516 ok( hr
== S_OK
, "got %08x\n", hr
);
2517 SysFreeString( headers
);
2519 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, &value
);
2520 ok( hr
== S_OK
, "got %08x\n", hr
);
2521 SysFreeString( value
);
2523 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, today
);
2524 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_AFTER_SEND
), "got %08x\n", hr
);
2526 hr
= IWinHttpRequest_SetAutoLogonPolicy( req
, AutoLogonPolicy_OnlyIfBypassProxy
);
2527 ok( hr
== S_OK
, "got %08x\n", hr
);
2529 hr
= IWinHttpRequest_Send( req
, empty
);
2530 ok( hr
== S_OK
, "got %08x\n", hr
);
2532 hr
= IWinHttpRequest_Abort( req
);
2533 ok( hr
== S_OK
, "got %08x\n", hr
);
2535 hr
= IWinHttpRequest_Abort( req
);
2536 ok( hr
== S_OK
, "got %08x\n", hr
);
2538 hr
= IWinHttpRequest_Release( req
);
2539 ok( hr
== S_OK
, "got %08x\n", hr
);
2541 SysFreeString( method
);
2542 SysFreeString( url
);
2543 SysFreeString( username
);
2544 SysFreeString( password
);
2545 SysFreeString( connection
);
2546 SysFreeString( date
);
2547 SysFreeString( today
);
2548 VariantClear( &proxy_server
);
2549 VariantClear( &bypass_list
);
2553 static void test_WinHttpDetectAutoProxyConfigUrl(void)
2559 if (0) /* crashes on some win2k systems */
2561 SetLastError(0xdeadbeef);
2562 ret
= WinHttpDetectAutoProxyConfigUrl( 0, NULL
);
2563 error
= GetLastError();
2564 ok( !ret
, "expected failure\n" );
2565 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2568 SetLastError(0xdeadbeef);
2569 ret
= WinHttpDetectAutoProxyConfigUrl( 0, &url
);
2570 error
= GetLastError();
2571 ok( !ret
, "expected failure\n" );
2572 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2574 if (0) /* crashes on some win2k systems */
2576 SetLastError(0xdeadbeef);
2577 ret
= WinHttpDetectAutoProxyConfigUrl( WINHTTP_AUTO_DETECT_TYPE_DNS_A
, NULL
);
2578 error
= GetLastError();
2579 ok( !ret
, "expected failure\n" );
2580 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2583 SetLastError(0xdeadbeef);
2584 ret
= WinHttpDetectAutoProxyConfigUrl( WINHTTP_AUTO_DETECT_TYPE_DNS_A
, &url
);
2585 error
= GetLastError();
2587 ok( error
== ERROR_WINHTTP_AUTODETECTION_FAILED
, "got %u\n", error
);
2590 trace("%s\n", wine_dbgstr_w(url
));
2595 static void test_WinHttpGetIEProxyConfigForCurrentUser(void)
2599 WINHTTP_CURRENT_USER_IE_PROXY_CONFIG cfg
;
2601 memset( &cfg
, 0, sizeof(cfg
) );
2603 SetLastError(0xdeadbeef);
2604 ret
= WinHttpGetIEProxyConfigForCurrentUser( NULL
);
2605 error
= GetLastError();
2606 ok( !ret
, "expected failure\n" );
2607 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2609 ret
= WinHttpGetIEProxyConfigForCurrentUser( &cfg
);
2610 ok( ret
, "expected success\n" );
2611 trace("%d\n", cfg
.fAutoDetect
);
2612 trace("%s\n", wine_dbgstr_w(cfg
.lpszAutoConfigUrl
));
2613 trace("%s\n", wine_dbgstr_w(cfg
.lpszProxy
));
2614 trace("%s\n", wine_dbgstr_w(cfg
.lpszProxyBypass
));
2615 GlobalFree( cfg
.lpszAutoConfigUrl
);
2616 GlobalFree( cfg
.lpszProxy
);
2617 GlobalFree( cfg
.lpszProxyBypass
);
2620 static void test_WinHttpGetProxyForUrl(void)
2622 static const WCHAR urlW
[] = {'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0};
2623 static const WCHAR emptyW
[] = {0};
2627 WINHTTP_AUTOPROXY_OPTIONS options
;
2628 WINHTTP_PROXY_INFO info
;
2630 memset( &options
, 0, sizeof(options
) );
2632 SetLastError(0xdeadbeef);
2633 ret
= WinHttpGetProxyForUrl( NULL
, NULL
, NULL
, NULL
);
2634 error
= GetLastError();
2635 ok( !ret
, "expected failure\n" );
2636 ok( error
== ERROR_INVALID_HANDLE
, "got %u\n", error
);
2638 session
= WinHttpOpen( test_useragent
, 0, NULL
, NULL
, 0 );
2639 ok( session
!= NULL
, "failed to open session %u\n", GetLastError() );
2641 SetLastError(0xdeadbeef);
2642 ret
= WinHttpGetProxyForUrl( session
, NULL
, NULL
, NULL
);
2643 error
= GetLastError();
2644 ok( !ret
, "expected failure\n" );
2645 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2647 SetLastError(0xdeadbeef);
2648 ret
= WinHttpGetProxyForUrl( session
, emptyW
, NULL
, NULL
);
2649 error
= GetLastError();
2650 ok( !ret
, "expected failure\n" );
2651 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2653 SetLastError(0xdeadbeef);
2654 ret
= WinHttpGetProxyForUrl( session
, urlW
, NULL
, NULL
);
2655 error
= GetLastError();
2656 ok( !ret
, "expected failure\n" );
2657 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2659 SetLastError(0xdeadbeef);
2660 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, &info
);
2661 error
= GetLastError();
2662 ok( !ret
, "expected failure\n" );
2663 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2665 options
.dwFlags
= WINHTTP_AUTOPROXY_AUTO_DETECT
;
2666 options
.dwAutoDetectFlags
= WINHTTP_AUTO_DETECT_TYPE_DNS_A
;
2668 SetLastError(0xdeadbeef);
2669 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, NULL
);
2670 error
= GetLastError();
2671 ok( !ret
, "expected failure\n" );
2672 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2674 options
.dwFlags
= WINHTTP_AUTOPROXY_AUTO_DETECT
;
2675 options
.dwAutoDetectFlags
= 0;
2677 SetLastError(0xdeadbeef);
2678 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, &info
);
2679 error
= GetLastError();
2680 ok( !ret
, "expected failure\n" );
2681 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2683 options
.dwFlags
= WINHTTP_AUTOPROXY_AUTO_DETECT
| WINHTTP_AUTOPROXY_CONFIG_URL
;
2684 options
.dwAutoDetectFlags
= WINHTTP_AUTO_DETECT_TYPE_DNS_A
;
2686 SetLastError(0xdeadbeef);
2687 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, &info
);
2688 error
= GetLastError();
2689 ok( !ret
, "expected failure\n" );
2690 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
2692 options
.dwFlags
= WINHTTP_AUTOPROXY_AUTO_DETECT
;
2693 options
.dwAutoDetectFlags
= WINHTTP_AUTO_DETECT_TYPE_DNS_A
;
2695 memset( &info
, 0, sizeof(info
) );
2696 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, &info
);
2699 trace("%u\n", info
.dwAccessType
);
2700 trace("%s\n", wine_dbgstr_w(info
.lpszProxy
));
2701 trace("%s\n", wine_dbgstr_w(info
.lpszProxyBypass
));
2702 GlobalFree( (WCHAR
*)info
.lpszProxy
);
2703 GlobalFree( (WCHAR
*)info
.lpszProxyBypass
);
2705 WinHttpCloseHandle( session
);
2708 START_TEST (winhttp
)
2710 static const WCHAR basicW
[] = {'/','b','a','s','i','c',0};
2711 static const WCHAR quitW
[] = {'/','q','u','i','t',0};
2712 struct server_info si
;
2718 test_WinHttpTimeFromSystemTime();
2719 test_WinHttpTimeToSystemTime();
2720 test_WinHttpAddHeaders();
2721 test_secure_connection();
2722 test_request_parameter_defaults();
2724 test_set_default_proxy_config();
2725 test_empty_headers_param();
2727 test_resolve_timeout();
2729 test_IWinHttpRequest();
2730 test_WinHttpDetectAutoProxyConfigUrl();
2731 test_WinHttpGetIEProxyConfigForCurrentUser();
2732 test_WinHttpGetProxyForUrl();
2734 si
.event
= CreateEvent(NULL
, 0, 0, NULL
);
2737 thread
= CreateThread(NULL
, 0, server_thread
, (LPVOID
)&si
, 0, NULL
);
2738 ok(thread
!= NULL
, "failed to create thread %u\n", GetLastError());
2740 ret
= WaitForSingleObject(si
.event
, 10000);
2741 ok(ret
== WAIT_OBJECT_0
, "failed to start winhttp test server %u\n", GetLastError());
2742 if (ret
!= WAIT_OBJECT_0
)
2745 test_basic_request(si
.port
, NULL
, basicW
);
2746 test_no_headers(si
.port
);
2747 test_basic_authentication(si
.port
);
2748 test_bad_header(si
.port
);
2750 /* send the basic request again to shutdown the server thread */
2751 test_basic_request(si
.port
, NULL
, quitW
);
2753 WaitForSingleObject(thread
, 3000);