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
21 #define WIN32_NO_STATUS
23 #define COM_NO_WINDOWS_H
31 //#include <ws2tcpip.h>
35 //#include "initguid.h"
36 #include <httprequest.h>
38 #include <wine/test.h>
40 static const WCHAR test_useragent
[] =
41 {'W','i','n','e',' ','R','e','g','r','e','s','s','i','o','n',' ','T','e','s','t',0};
42 static const WCHAR test_winehq
[] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0};
43 static const WCHAR localhostW
[] = {'l','o','c','a','l','h','o','s','t',0};
45 static BOOL
proxy_active(void)
47 WINHTTP_PROXY_INFO proxy_info
;
50 if (WinHttpGetDefaultProxyConfiguration(&proxy_info
))
52 active
= (proxy_info
.lpszProxy
!= NULL
);
54 GlobalFree(proxy_info
.lpszProxy
);
55 if (proxy_info
.lpszProxyBypass
!= NULL
)
56 GlobalFree(proxy_info
.lpszProxyBypass
);
64 static void test_QueryOption(void)
67 HINTERNET session
, request
, connection
;
70 SetLastError(0xdeadbeef);
71 session
= WinHttpOpen(test_useragent
, 0, 0, 0, 0);
72 ok(session
!= NULL
, "WinHttpOpen failed to open session, error %u\n", GetLastError());
74 SetLastError(0xdeadbeef);
75 ret
= WinHttpQueryOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, NULL
, NULL
);
76 ok(!ret
, "should fail to set redirect policy %u\n", GetLastError());
77 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
78 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
81 SetLastError(0xdeadbeef);
82 ret
= WinHttpQueryOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, NULL
, &size
);
83 ok(!ret
, "should fail to query option\n");
84 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
85 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
86 ok(size
== 4, "expected 4, got %u\n", size
);
89 size
= sizeof(feature
) - 1;
90 SetLastError(0xdeadbeef);
91 ret
= WinHttpQueryOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, &size
);
92 ok(!ret
, "should fail to query option\n");
93 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
94 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
95 ok(size
== 4, "expected 4, got %u\n", size
);
98 size
= sizeof(feature
) + 1;
99 SetLastError(0xdeadbeef);
100 ret
= WinHttpQueryOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, &size
);
101 ok(ret
, "failed to query option %u\n", GetLastError());
102 ok(size
== sizeof(feature
), "WinHttpQueryOption should set the size: %u\n", size
);
103 ok(feature
== WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP
,
104 "expected WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, got %#x\n", feature
);
106 SetLastError(0xdeadbeef);
107 ret
= WinHttpSetOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, NULL
, sizeof(feature
));
108 ok(!ret
, "should fail to set redirect policy %u\n", GetLastError());
109 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
110 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
112 feature
= WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
;
113 SetLastError(0xdeadbeef);
114 ret
= WinHttpSetOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, sizeof(feature
) - 1);
115 ok(!ret
, "should fail to set redirect policy %u\n", GetLastError());
116 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
117 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
119 feature
= WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
;
120 SetLastError(0xdeadbeef);
121 ret
= WinHttpSetOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, sizeof(feature
) + 1);
122 ok(!ret
, "should fail to set redirect policy %u\n", GetLastError());
123 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
124 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
126 feature
= WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
;
127 SetLastError(0xdeadbeef);
128 ret
= WinHttpSetOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, sizeof(feature
));
129 ok(ret
, "failed to set redirect policy %u\n", GetLastError());
131 feature
= 0xdeadbeef;
132 size
= sizeof(feature
);
133 SetLastError(0xdeadbeef);
134 ret
= WinHttpQueryOption(session
, WINHTTP_OPTION_REDIRECT_POLICY
, &feature
, &size
);
135 ok(ret
, "failed to query option %u\n", GetLastError());
136 ok(feature
== WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
,
137 "expected WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS, got %#x\n", feature
);
139 feature
= WINHTTP_DISABLE_COOKIES
;
140 SetLastError(0xdeadbeef);
141 ret
= WinHttpSetOption(session
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, sizeof(feature
));
142 ok(!ret
, "should fail to set disable feature for a session\n");
143 ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
144 "expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError());
146 SetLastError(0xdeadbeef);
147 connection
= WinHttpConnect(session
, test_winehq
, INTERNET_DEFAULT_HTTP_PORT
, 0);
148 ok(connection
!= NULL
, "WinHttpConnect failed to open a connection, error: %u\n", GetLastError());
150 feature
= WINHTTP_DISABLE_COOKIES
;
151 SetLastError(0xdeadbeef);
152 ret
= WinHttpSetOption(connection
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, sizeof(feature
));
153 ok(!ret
, "should fail to set disable feature for a connection\n");
154 ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
155 "expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError());
157 SetLastError(0xdeadbeef);
158 request
= WinHttpOpenRequest(connection
, NULL
, NULL
, NULL
, WINHTTP_NO_REFERER
,
159 WINHTTP_DEFAULT_ACCEPT_TYPES
, 0);
160 if (request
== NULL
&& GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED
)
162 skip("Network unreachable, skipping the test\n");
166 feature
= 0xdeadbeef;
167 size
= sizeof(feature
);
168 SetLastError(0xdeadbeef);
169 ret
= WinHttpQueryOption(request
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, &size
);
170 ok(!ret
, "should fail to query disable feature for a request\n");
171 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
172 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
175 size
= sizeof(feature
);
176 SetLastError(0xdeadbeef);
177 ret
= WinHttpSetOption(request
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, sizeof(feature
));
178 ok(ret
, "failed to set feature %u\n", GetLastError());
180 feature
= 0xffffffff;
181 size
= sizeof(feature
);
182 SetLastError(0xdeadbeef);
183 ret
= WinHttpSetOption(request
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, sizeof(feature
));
184 ok(ret
, "failed to set feature %u\n", GetLastError());
186 feature
= WINHTTP_DISABLE_COOKIES
;
187 size
= sizeof(feature
);
188 SetLastError(0xdeadbeef);
189 ret
= WinHttpSetOption(request
, WINHTTP_OPTION_DISABLE_FEATURE
, &feature
, sizeof(feature
));
190 ok(ret
, "failed to set feature %u\n", GetLastError());
193 SetLastError(0xdeadbeef);
194 ret
= WinHttpQueryOption(request
, WINHTTP_OPTION_DISABLE_FEATURE
, NULL
, &size
);
195 ok(!ret
, "should fail to query disable feature for a request\n");
196 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
197 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
199 SetLastError(0xdeadbeef);
200 ret
= WinHttpCloseHandle(request
);
201 ok(ret
, "WinHttpCloseHandle failed on closing request: %u\n", GetLastError());
204 SetLastError(0xdeadbeef);
205 ret
= WinHttpCloseHandle(connection
);
206 ok(ret
, "WinHttpCloseHandle failed on closing connection: %u\n", GetLastError());
207 SetLastError(0xdeadbeef);
208 ret
= WinHttpCloseHandle(session
);
209 ok(ret
, "WinHttpCloseHandle failed on closing session: %u\n", GetLastError());
212 static void test_OpenRequest (void)
215 HINTERNET session
, request
, connection
;
217 session
= WinHttpOpen(test_useragent
, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
,
218 WINHTTP_NO_PROXY_NAME
, WINHTTP_NO_PROXY_BYPASS
, 0);
219 ok(session
!= NULL
, "WinHttpOpen failed to open session.\n");
221 /* Test with a bad server name */
222 SetLastError(0xdeadbeef);
223 connection
= WinHttpConnect(session
, NULL
, INTERNET_DEFAULT_HTTP_PORT
, 0);
224 ok (connection
== NULL
, "WinHttpConnect succeeded in opening connection to NULL server argument.\n");
225 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError());
227 /* Test with a valid server name */
228 connection
= WinHttpConnect (session
, test_winehq
, INTERNET_DEFAULT_HTTP_PORT
, 0);
229 ok(connection
!= NULL
, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
231 request
= WinHttpOpenRequest(connection
, NULL
, NULL
, NULL
, WINHTTP_NO_REFERER
,
232 WINHTTP_DEFAULT_ACCEPT_TYPES
, 0);
233 if (request
== NULL
&& GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED
)
235 skip("Network unreachable, skipping.\n");
238 ok(request
!= NULL
, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
240 ret
= WinHttpSendRequest(request
, WINHTTP_NO_ADDITIONAL_HEADERS
, 0, NULL
, 0, 0, 0);
241 if (!ret
&& GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
)
243 skip("Connection failed, skipping.\n");
246 ok(ret
== TRUE
, "WinHttpSendRequest failed: %u\n", GetLastError());
247 ret
= WinHttpCloseHandle(request
);
248 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing request, got %d.\n", ret
);
251 ret
= WinHttpCloseHandle(connection
);
252 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret
);
253 ret
= WinHttpCloseHandle(session
);
254 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing session, got %d.\n", ret
);
258 static void test_empty_headers_param(void)
260 static const WCHAR empty
[] = {0};
261 HINTERNET ses
, con
, req
;
264 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
265 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
267 con
= WinHttpConnect(ses
, test_winehq
, 80, 0);
268 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
270 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
271 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
273 ret
= WinHttpSendRequest(req
, empty
, 0, NULL
, 0, 0, 0);
274 if (!ret
&& GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
)
276 skip("connection failed, skipping\n");
279 ok(ret
, "failed to send request %u\n", GetLastError());
282 WinHttpCloseHandle(req
);
283 WinHttpCloseHandle(con
);
284 WinHttpCloseHandle(ses
);
287 static void test_SendRequest (void)
289 static const WCHAR content_type
[] =
290 {'C','o','n','t','e','n','t','-','T','y','p','e',':',' ','a','p','p','l','i','c','a','t','i','o','n',
291 '/','x','-','w','w','w','-','f','o','r','m','-','u','r','l','e','n','c','o','d','e','d',0};
292 static const WCHAR test_file
[] = {'t','e','s','t','s','/','p','o','s','t','.','p','h','p',0};
293 static const WCHAR test_verb
[] = {'P','O','S','T',0};
294 static CHAR post_data
[] = "mode=Test";
295 static const char test_post
[] = "mode => Test\0\n";
296 HINTERNET session
, request
, connection
;
297 DWORD header_len
, optional_len
, total_len
, bytes_rw
, size
;
304 total_len
= optional_len
= sizeof(post_data
);
305 memset(buffer
, 0xff, sizeof(buffer
));
307 session
= WinHttpOpen(test_useragent
, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
,
308 WINHTTP_NO_PROXY_NAME
, WINHTTP_NO_PROXY_BYPASS
, 0);
309 ok(session
!= NULL
, "WinHttpOpen failed to open session.\n");
311 connection
= WinHttpConnect (session
, test_winehq
, INTERNET_DEFAULT_HTTP_PORT
, 0);
312 ok(connection
!= NULL
, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
314 request
= WinHttpOpenRequest(connection
, test_verb
, test_file
, NULL
, WINHTTP_NO_REFERER
,
315 WINHTTP_DEFAULT_ACCEPT_TYPES
, WINHTTP_FLAG_BYPASS_PROXY_CACHE
);
316 if (request
== NULL
&& GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED
)
318 skip("Network unreachable, skipping.\n");
321 ok(request
!= NULL
, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
322 if (!request
) goto done
;
324 context
= 0xdeadbeef;
325 ret
= WinHttpSetOption(request
, WINHTTP_OPTION_CONTEXT_VALUE
, &context
, sizeof(context
));
326 ok(ret
, "WinHttpSetOption failed: %u\n", GetLastError());
329 ret
= WinHttpSendRequest(request
, content_type
, header_len
, post_data
, optional_len
, total_len
, context
);
330 if (!ret
&& GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
)
332 skip("connection failed, skipping\n");
335 ok(ret
== TRUE
, "WinHttpSendRequest failed: %u\n", GetLastError());
338 size
= sizeof(context
);
339 ret
= WinHttpQueryOption(request
, WINHTTP_OPTION_CONTEXT_VALUE
, &context
, &size
);
340 ok(ret
, "WinHttpQueryOption failed: %u\n", GetLastError());
341 ok(context
== 0xdeadbef0, "expected 0xdeadbef0, got %lx\n", context
);
343 for (i
= 3; post_data
[i
]; i
++)
346 ret
= WinHttpWriteData(request
, &post_data
[i
], 1, &bytes_rw
);
348 ok(bytes_rw
== 1, "WinHttpWriteData failed, wrote %u bytes instead of 1 byte.\n", bytes_rw
);
349 else /* Since we already passed all optional data in WinHttpSendRequest Win7 fails our WinHttpWriteData call */
351 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "Expected ERROR_INVALID_PARAMETER got %u.\n", GetLastError());
352 ok(bytes_rw
== -1, "Expected bytes_rw to remain unchanged.\n");
356 ret
= WinHttpReceiveResponse(request
, NULL
);
357 ok(ret
== TRUE
, "WinHttpReceiveResponse failed: %u.\n", GetLastError());
360 ret
= WinHttpReadData(request
, buffer
, sizeof(buffer
) - 1, &bytes_rw
);
361 ok(ret
== TRUE
, "WinHttpReadData failed: %u.\n", GetLastError());
363 ok(bytes_rw
== sizeof(test_post
) - 1, "Read %u bytes\n", bytes_rw
);
364 ok(!memcmp(buffer
, test_post
, sizeof(test_post
) - 1), "Data read did not match.\n");
367 ret
= WinHttpCloseHandle(request
);
368 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing request, got %d.\n", ret
);
369 ret
= WinHttpCloseHandle(connection
);
370 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret
);
371 ret
= WinHttpCloseHandle(session
);
372 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing session, got %d.\n", ret
);
375 static void test_WinHttpTimeFromSystemTime(void)
378 static const SYSTEMTIME time
= {2008, 7, 1, 28, 10, 5, 52, 0};
379 static const WCHAR expected_string
[] =
380 {'M','o','n',',',' ','2','8',' ','J','u','l',' ','2','0','0','8',' ',
381 '1','0',':','0','5',':','5','2',' ','G','M','T',0};
382 WCHAR time_string
[WINHTTP_TIME_FORMAT_BUFSIZE
+1];
384 ret
= WinHttpTimeFromSystemTime(&time
, time_string
);
385 ok(ret
== TRUE
, "WinHttpTimeFromSystemTime failed: %u\n", GetLastError());
386 ok(memcmp(time_string
, expected_string
, sizeof(expected_string
)) == 0,
387 "Time string returned did not match expected time string.\n");
390 static void test_WinHttpTimeToSystemTime(void)
394 static const SYSTEMTIME expected_time
= {2008, 7, 1, 28, 10, 5, 52, 0};
395 static const WCHAR time_string1
[] =
396 {'M','o','n',',',' ','2','8',' ','J','u','l',' ','2','0','0','8',' ',
397 + '1','0',':','0','5',':','5','2',' ','G','M','T','\n',0};
398 static const WCHAR time_string2
[] =
399 {' ','m','o','n',' ','2','8',' ','j','u','l',' ','2','0','0','8',' ',
400 '1','0',' ','0','5',' ','5','2','\n',0};
402 ret
= WinHttpTimeToSystemTime(time_string1
, &time
);
403 ok(ret
== TRUE
, "WinHttpTimeToSystemTime failed: %u\n", GetLastError());
404 ok(memcmp(&time
, &expected_time
, sizeof(SYSTEMTIME
)) == 0,
405 "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n");
407 ret
= WinHttpTimeToSystemTime(time_string2
, &time
);
408 ok(ret
== TRUE
, "WinHttpTimeToSystemTime failed: %u\n", GetLastError());
409 ok(memcmp(&time
, &expected_time
, sizeof(SYSTEMTIME
)) == 0,
410 "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n");
413 static void test_WinHttpAddHeaders(void)
415 HINTERNET session
, request
, connection
;
417 WCHAR buffer
[MAX_PATH
];
418 WCHAR check_buffer
[MAX_PATH
];
419 DWORD index
, len
, oldlen
;
421 static const WCHAR test_file
[] = {'/','p','o','s','t','t','e','s','t','.','p','h','p',0};
422 static const WCHAR test_verb
[] = {'P','O','S','T',0};
423 static const WCHAR test_header_begin
[] =
424 {'P','O','S','T',' ','/','p','o','s','t','t','e','s','t','.','p','h','p',' ','H','T','T','P','/','1'};
425 static const WCHAR full_path_test_header_begin
[] =
426 {'P','O','S','T',' ','h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',':','8','0','/','p','o','s','t','.','p','h','p',' ','H','T','T','P','/','1'};
427 static const WCHAR test_header_end
[] = {'\r','\n','\r','\n',0};
428 static const WCHAR test_header_name
[] = {'W','a','r','n','i','n','g',0};
430 static const WCHAR test_flag_coalesce
[] = {'t','e','s','t','2',',',' ','t','e','s','t','4',0};
431 static const WCHAR test_flag_coalesce_reverse
[] = {'t','e','s','t','3',',',' ','t','e','s','t','4',0};
432 static const WCHAR test_flag_coalesce_comma
[] =
433 {'t','e','s','t','2',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',0};
434 static const WCHAR test_flag_coalesce_comma_reverse
[] =
435 {'t','e','s','t','3',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',0};
436 static const WCHAR test_flag_coalesce_semicolon
[] =
437 {'t','e','s','t','2',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',';',' ','t','e','s','t','6',0};
438 static const WCHAR test_flag_coalesce_semicolon_reverse
[] =
439 {'t','e','s','t','3',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',';',' ','t','e','s','t','6',0};
441 static const WCHAR field
[] = {'f','i','e','l','d',0};
442 static const WCHAR value
[] = {'v','a','l','u','e',' ',0};
443 static const WCHAR value_nospace
[] = {'v','a','l','u','e',0};
445 static const WCHAR test_headers
[][14] =
447 {'W','a','r','n','i','n','g',':','t','e','s','t','1',0},
448 {'W','a','r','n','i','n','g',':','t','e','s','t','2',0},
449 {'W','a','r','n','i','n','g',':','t','e','s','t','3',0},
450 {'W','a','r','n','i','n','g',':','t','e','s','t','4',0},
451 {'W','a','r','n','i','n','g',':','t','e','s','t','5',0},
452 {'W','a','r','n','i','n','g',':','t','e','s','t','6',0},
453 {'W','a','r','n','i','n','g',':','t','e','s','t','7',0},
459 {' ','e',' ',':','f',0},
460 {'f','i','e','l','d',':',' ','v','a','l','u','e',' ',0}
462 static const WCHAR test_indices
[][6] =
464 {'t','e','s','t','1',0},
465 {'t','e','s','t','2',0},
466 {'t','e','s','t','3',0},
467 {'t','e','s','t','4',0}
470 session
= WinHttpOpen(test_useragent
, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
,
471 WINHTTP_NO_PROXY_NAME
, WINHTTP_NO_PROXY_BYPASS
, 0);
472 ok(session
!= NULL
, "WinHttpOpen failed to open session.\n");
474 connection
= WinHttpConnect (session
, test_winehq
, INTERNET_DEFAULT_HTTP_PORT
, 0);
475 ok(connection
!= NULL
, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
477 request
= WinHttpOpenRequest(connection
, test_verb
, test_file
, NULL
, WINHTTP_NO_REFERER
,
478 WINHTTP_DEFAULT_ACCEPT_TYPES
, 0);
479 if (request
== NULL
&& GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED
)
481 skip("Network unreachable, skipping.\n");
484 ok(request
!= NULL
, "WinHttpOpenRequest failed to open a request, error: %u.\n", GetLastError());
487 len
= sizeof(buffer
);
488 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
489 test_header_name
, buffer
, &len
, &index
);
490 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded, found 'Warning' header.\n");
491 ret
= WinHttpAddRequestHeaders(request
, test_headers
[0], -1L, WINHTTP_ADDREQ_FLAG_ADD
);
492 ok(ret
== TRUE
, "WinHttpAddRequestHeader failed to add new header, got %d with error %u.\n", ret
, GetLastError());
495 len
= sizeof(buffer
);
496 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
497 test_header_name
, buffer
, &len
, &index
);
498 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
499 ok(index
== 1, "WinHttpQueryHeaders failed: header index not incremented\n");
500 ok(memcmp(buffer
, test_indices
[0], sizeof(test_indices
[0])) == 0, "WinHttpQueryHeaders failed: incorrect string returned\n");
501 ok(len
== 5*sizeof(WCHAR
), "WinHttpQueryHeaders failed: invalid length returned, expected 5, got %d\n", len
);
503 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
504 test_header_name
, buffer
, &len
, &index
);
505 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded, second index should not exist.\n");
507 /* Try to fetch the header info with a buffer that's big enough to fit the
508 * string but not the NULL terminator.
511 len
= 5*sizeof(WCHAR
);
512 memset(check_buffer
, 0xab, sizeof(check_buffer
));
513 memcpy(buffer
, check_buffer
, sizeof(buffer
));
514 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
515 test_header_name
, buffer
, &len
, &index
);
516 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded with a buffer that's too small.\n");
517 ok(memcmp(buffer
, check_buffer
, sizeof(buffer
)) == 0,
518 "WinHttpQueryHeaders failed, modified the buffer when it should not have.\n");
519 ok(len
== 6*sizeof(WCHAR
), "WinHttpQueryHeaders returned invalid length, expected 12, got %d\n", len
);
521 /* Try with a NULL buffer */
523 len
= sizeof(buffer
);
524 SetLastError(0xdeadbeef);
525 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS_CRLF
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
526 test_header_name
, NULL
, &len
, &index
);
527 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded.\n");
528 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "Expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
529 ok(len
> 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len
);
530 ok(index
== 0, "WinHttpQueryHeaders incorrectly incremented header index.\n");
532 /* Try with a NULL buffer and a length that's too small */
535 SetLastError(0xdeadbeef);
536 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS_CRLF
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
537 test_header_name
, NULL
, &len
, &index
);
538 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded.\n");
539 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
540 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICENT_BUFFER, go %u\n", GetLastError());
541 ok(len
> 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len
);
542 ok(index
== 0, "WinHttpQueryHeaders incorrectly incremented header index.\n");
546 SetLastError(0xdeadbeef);
547 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS_CRLF
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
548 test_header_name
, NULL
, &len
, &index
);
549 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded.\n");
550 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
551 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
552 ok(len
> 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len
);
553 ok(index
== 0, "WinHttpQueryHeaders failed: index was incremented.\n");
558 len
= sizeof(buffer
);
559 memset(buffer
, 0xff, sizeof(buffer
));
560 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS_CRLF
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
561 test_header_name
, buffer
, &len
, &index
);
562 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: got %d\n", ret
);
563 ok(len
+ sizeof(WCHAR
) <= oldlen
, "WinHttpQueryHeaders resulting length longer than advertized.\n");
564 ok((len
< sizeof(buffer
) - sizeof(WCHAR
)) && buffer
[len
/ sizeof(WCHAR
)] == 0, "WinHttpQueryHeaders did not append NULL terminator\n");
565 ok(len
== lstrlenW(buffer
) * sizeof(WCHAR
), "WinHttpQueryHeaders returned incorrect length.\n");
566 ok(memcmp(buffer
, test_header_begin
, sizeof(test_header_begin
)) == 0 ||
567 memcmp(buffer
, full_path_test_header_begin
, sizeof(full_path_test_header_begin
)) == 0,
568 "WinHttpQueryHeaders returned invalid beginning of header string.\n");
569 ok(memcmp(buffer
+ lstrlenW(buffer
) - 4, test_header_end
, sizeof(test_header_end
)) == 0,
570 "WinHttpQueryHeaders returned invalid end of header string.\n");
571 ok(index
== 0, "WinHttpQueryHeaders incremented header index.\n");
575 SetLastError(0xdeadbeef);
576 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
577 test_header_name
, NULL
, &len
, &index
);
578 ok(ret
== FALSE
, "WinHttpQueryHeaders unexpectedly succeeded.\n");
579 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER
,
580 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
581 ok(len
> 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len
);
582 ok(index
== 0, "WinHttpQueryHeaders failed: index was incremented.\n");
586 len
= sizeof(buffer
);
587 memset(buffer
, 0xff, sizeof(buffer
));
588 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_RAW_HEADERS
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
589 test_header_name
, buffer
, &len
, &index
);
590 ok(ret
== TRUE
, "WinHttpQueryHeaders failed %u\n", GetLastError());
591 ok(len
+ sizeof(WCHAR
) <= oldlen
, "resulting length longer than advertized\n");
592 ok((len
< sizeof(buffer
) - sizeof(WCHAR
)) && !buffer
[len
/ sizeof(WCHAR
)] && !buffer
[len
/ sizeof(WCHAR
) - 1],
593 "no double NULL terminator\n");
594 ok(memcmp(buffer
, test_header_begin
, sizeof(test_header_begin
)) == 0 ||
595 memcmp(buffer
, full_path_test_header_begin
, sizeof(full_path_test_header_begin
)) == 0,
596 "invalid beginning of header string.\n");
597 ok(index
== 0, "header index was incremented\n");
599 /* tests for more indices */
600 ret
= WinHttpAddRequestHeaders(request
, test_headers
[1], -1L, WINHTTP_ADDREQ_FLAG_ADD
);
601 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed to add duplicate header: %d\n", ret
);
604 len
= sizeof(buffer
);
605 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
606 test_header_name
, buffer
, &len
, &index
);
607 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
608 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
609 ok(memcmp(buffer
, test_indices
[0], sizeof(test_indices
[0])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
611 len
= sizeof(buffer
);
612 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
613 test_header_name
, buffer
, &len
, &index
);
614 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
615 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
616 ok(memcmp(buffer
, test_indices
[1], sizeof(test_indices
[1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
618 ret
= WinHttpAddRequestHeaders(request
, test_headers
[2], -1L, WINHTTP_ADDREQ_FLAG_REPLACE
);
619 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed to add duplicate header.\n");
622 len
= sizeof(buffer
);
623 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
624 test_header_name
, buffer
, &len
, &index
);
625 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
626 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
627 reverse
= (memcmp(buffer
, test_indices
[1], sizeof(test_indices
[1])) != 0); /* Win7 returns values in reverse order of adding */
628 ok(memcmp(buffer
, test_indices
[reverse
? 2 : 1], sizeof(test_indices
[reverse
? 2 : 1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
630 len
= sizeof(buffer
);
631 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
632 test_header_name
, buffer
, &len
, &index
);
633 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
634 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
635 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 2], sizeof(test_indices
[reverse
? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
637 /* add if new flag */
638 ret
= WinHttpAddRequestHeaders(request
, test_headers
[3], -1L, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW
);
639 ok(ret
== FALSE
, "WinHttpAddRequestHeaders incorrectly replaced existing header.\n");
642 len
= sizeof(buffer
);
643 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
644 test_header_name
, buffer
, &len
, &index
);
645 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
646 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
647 ok(memcmp(buffer
, test_indices
[reverse
? 2 : 1], sizeof(test_indices
[reverse
? 2 : 1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
649 len
= sizeof(buffer
);
650 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
651 test_header_name
, buffer
, &len
, &index
);
652 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
653 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
654 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 2], sizeof(test_indices
[reverse
? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
656 len
= sizeof(buffer
);
657 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
658 test_header_name
, buffer
, &len
, &index
);
659 ok(ret
== FALSE
, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
662 ret
= WinHttpAddRequestHeaders(request
, test_headers
[3], -1L, WINHTTP_ADDREQ_FLAG_COALESCE
);
663 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE.\n");
666 len
= sizeof(buffer
);
667 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
668 test_header_name
, buffer
, &len
, &index
);
669 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
670 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
671 ok(memcmp(buffer
, reverse
? test_flag_coalesce_reverse
: test_flag_coalesce
,
672 reverse
? sizeof(test_flag_coalesce_reverse
) : sizeof(test_flag_coalesce
)) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
674 len
= sizeof(buffer
);
675 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
676 test_header_name
, buffer
, &len
, &index
);
677 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
678 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
679 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 2], sizeof(test_indices
[reverse
? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
681 len
= sizeof(buffer
);
682 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
683 test_header_name
, buffer
, &len
, &index
);
684 ok(ret
== FALSE
, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
686 /* coalesce with comma flag */
687 ret
= WinHttpAddRequestHeaders(request
, test_headers
[4], -1L, WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA
);
688 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA.\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
== 1, "WinHttpQueryHeaders failed to increment index.\n");
696 ok(memcmp(buffer
, reverse
? test_flag_coalesce_comma_reverse
: test_flag_coalesce_comma
,
697 reverse
? sizeof(test_flag_coalesce_comma_reverse
) : sizeof(test_flag_coalesce_comma
)) == 0,
698 "WinHttpQueryHeaders returned incorrect string.\n");
700 len
= sizeof(buffer
);
701 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
702 test_header_name
, buffer
, &len
, &index
);
703 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
704 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
705 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 2], sizeof(test_indices
[reverse
? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
707 len
= sizeof(buffer
);
708 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
709 test_header_name
, buffer
, &len
, &index
);
710 ok(ret
== FALSE
, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
713 /* coalesce with semicolon flag */
714 ret
= WinHttpAddRequestHeaders(request
, test_headers
[5], -1L, WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON
);
715 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON.\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
== 1, "WinHttpQueryHeaders failed to increment index.\n");
723 ok(memcmp(buffer
, reverse
? test_flag_coalesce_semicolon_reverse
: test_flag_coalesce_semicolon
,
724 reverse
? sizeof(test_flag_coalesce_semicolon_reverse
) : sizeof(test_flag_coalesce_semicolon
)) == 0,
725 "WinHttpQueryHeaders returned incorrect string.\n");
727 len
= sizeof(buffer
);
728 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
729 test_header_name
, buffer
, &len
, &index
);
730 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
731 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
732 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 2], sizeof(test_indices
[reverse
? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
734 len
= sizeof(buffer
);
735 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
736 test_header_name
, buffer
, &len
, &index
);
737 ok(ret
== FALSE
, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
739 /* add and replace flags */
740 ret
= WinHttpAddRequestHeaders(request
, test_headers
[3], -1L, WINHTTP_ADDREQ_FLAG_ADD
| WINHTTP_ADDREQ_FLAG_REPLACE
);
741 ok(ret
== TRUE
, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE.\n");
744 len
= sizeof(buffer
);
745 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
746 test_header_name
, buffer
, &len
, &index
);
747 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
748 ok(index
== 1, "WinHttpQueryHeaders failed to increment index.\n");
749 ok(memcmp(buffer
, test_indices
[reverse
? 3 : 2], sizeof(test_indices
[reverse
? 3 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
751 len
= sizeof(buffer
);
752 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
753 test_header_name
, buffer
, &len
, &index
);
754 ok(ret
== TRUE
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
755 ok(index
== 2, "WinHttpQueryHeaders failed to increment index.\n");
756 ok(memcmp(buffer
, test_indices
[reverse
? 1 : 3], sizeof(test_indices
[reverse
? 1 : 3])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
758 len
= sizeof(buffer
);
759 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
760 test_header_name
, buffer
, &len
, &index
);
761 ok(ret
== FALSE
, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
763 ret
= WinHttpAddRequestHeaders(request
, test_headers
[8], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
764 ok(!ret
, "WinHttpAddRequestHeaders failed\n");
766 ret
= WinHttpAddRequestHeaders(request
, test_headers
[9], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
767 ok(ret
, "WinHttpAddRequestHeaders failed\n");
769 ret
= WinHttpAddRequestHeaders(request
, test_headers
[10], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
770 ok(!ret
, "WinHttpAddRequestHeaders failed\n");
772 ret
= WinHttpAddRequestHeaders(request
, test_headers
[11], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
773 ok(!ret
, "WinHttpAddRequestHeaders failed\n");
775 ret
= WinHttpAddRequestHeaders(request
, test_headers
[12], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
776 ok(!ret
, "WinHttpAddRequestHeaders failed\n");
778 ret
= WinHttpAddRequestHeaders(request
, test_headers
[13], ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
779 ok(ret
, "WinHttpAddRequestHeaders failed\n");
783 len
= sizeof(buffer
);
784 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_CUSTOM
| WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
785 field
, buffer
, &len
, &index
);
786 ok(ret
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
787 ok(!memcmp(buffer
, value
, sizeof(value
)) || ! memcmp(buffer
, value_nospace
, sizeof(value_nospace
)), "unexpected result\n");
789 ret
= WinHttpCloseHandle(request
);
790 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing request, got %d.\n", ret
);
792 ret
= WinHttpCloseHandle(connection
);
793 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret
);
794 ret
= WinHttpCloseHandle(session
);
795 ok(ret
== TRUE
, "WinHttpCloseHandle failed on closing session, got %d.\n", ret
);
799 static void CALLBACK
cert_error(HINTERNET handle
, DWORD_PTR ctx
, DWORD status
, LPVOID buf
, DWORD len
)
801 DWORD flags
= *(DWORD
*)buf
;
805 trace("WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR\n");
808 #define X(x) if (flags & x) trace("%s\n", #x);
809 X(WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED
)
810 X(WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT
)
811 X(WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED
)
812 X(WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA
)
813 X(WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID
)
814 X(WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID
)
815 X(WINHTTP_CALLBACK_STATUS_FLAG_CERT_WRONG_USAGE
)
819 static void test_secure_connection(void)
821 HINTERNET ses
, con
, req
;
822 DWORD size
, status
, policy
, bitness
, read_size
;
825 WINHTTP_CERTIFICATE_INFO info
;
828 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
829 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
831 policy
= WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
;
832 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_REDIRECT_POLICY
, &policy
, sizeof(policy
));
833 ok(ret
, "failed to set redirect policy %u\n", GetLastError());
835 con
= WinHttpConnect(ses
, test_winehq
, 443, 0);
836 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
838 /* try without setting WINHTTP_FLAG_SECURE */
839 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
840 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
842 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
843 if (!ret
&& GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
)
845 skip("Connection failed, skipping.\n");
848 ok(ret
, "failed to send request %u\n", GetLastError());
850 ret
= WinHttpReceiveResponse(req
, NULL
);
851 ok(!ret
|| proxy_active(), "succeeded unexpectedly\n");
854 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_RAW_HEADERS_CRLF
, NULL
, NULL
, &size
, NULL
);
855 ok(!ret
, "succeeded unexpectedly\n");
857 WinHttpCloseHandle(req
);
859 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, WINHTTP_FLAG_SECURE
);
860 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
862 WinHttpSetStatusCallback(req
, cert_error
, WINHTTP_CALLBACK_STATUS_SECURE_FAILURE
, 0);
864 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
865 if (!ret
&& (GetLastError() == ERROR_WINHTTP_SECURE_FAILURE
|| GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
))
867 skip("secure connection failed, skipping remaining secure tests\n");
870 ok(ret
, "failed to send request %u\n", GetLastError());
873 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SERVER_CERT_CONTEXT
, &cert
, &size
);
874 ok(ret
, "failed to retrieve certificate context %u\n", GetLastError());
875 if (ret
) CertFreeCertificateContext(cert
);
877 size
= sizeof(bitness
);
878 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SECURITY_KEY_BITNESS
, &bitness
, &size
);
879 ok(ret
, "failed to retrieve key bitness %u\n", GetLastError());
882 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT
, &info
, &size
);
883 ok(ret
, "failed to retrieve certificate info %u\n", GetLastError());
887 trace("lpszSubjectInfo %s\n", wine_dbgstr_w(info
.lpszSubjectInfo
));
888 trace("lpszIssuerInfo %s\n", wine_dbgstr_w(info
.lpszIssuerInfo
));
889 trace("lpszProtocolName %s\n", wine_dbgstr_w(info
.lpszProtocolName
));
890 trace("lpszSignatureAlgName %s\n", wine_dbgstr_w(info
.lpszSignatureAlgName
));
891 trace("lpszEncryptionAlgName %s\n", wine_dbgstr_w(info
.lpszEncryptionAlgName
));
892 trace("dwKeySize %u\n", info
.dwKeySize
);
895 ret
= WinHttpReceiveResponse(req
, NULL
);
896 ok(ret
, "failed to receive response %u\n", GetLastError());
898 size
= sizeof(status
);
899 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
| WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
900 ok(ret
, "failed unexpectedly %u\n", GetLastError());
901 ok(status
== 200, "request failed unexpectedly %u\n", status
);
904 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_RAW_HEADERS_CRLF
, NULL
, NULL
, &size
, NULL
);
905 ok(!ret
, "succeeded unexpectedly\n");
911 ret
= WinHttpReadData(req
, buffer
, sizeof(buffer
), &size
);
912 ok(ret
== TRUE
, "WinHttpReadData failed: %u.\n", GetLastError());
916 ok(read_size
> 2014, "read_size = %u\n", read_size
);
919 WinHttpCloseHandle(req
);
920 WinHttpCloseHandle(con
);
921 WinHttpCloseHandle(ses
);
924 static void test_request_parameter_defaults(void)
926 static const WCHAR empty
[] = {0};
927 HINTERNET ses
, con
, req
;
928 DWORD size
, status
, error
;
932 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
933 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
935 con
= WinHttpConnect(ses
, test_winehq
, 0, 0);
936 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
938 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
939 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
941 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
942 if (!ret
&& GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
)
944 skip("connection failed, skipping\n");
947 ok(ret
, "failed to send request %u\n", GetLastError());
949 ret
= WinHttpReceiveResponse(req
, NULL
);
950 ok(ret
, "failed to receive response %u\n", GetLastError());
952 size
= sizeof(status
);
953 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
| WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
954 ok(ret
, "failed unexpectedly %u\n", GetLastError());
955 ok(status
== 200, "request failed unexpectedly %u\n", status
);
957 WinHttpCloseHandle(req
);
959 req
= WinHttpOpenRequest(con
, empty
, empty
, empty
, NULL
, NULL
, 0);
960 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
962 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
963 if (!ret
&& (GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
|| GetLastError() == ERROR_WINHTTP_TIMEOUT
))
965 skip("connection failed, skipping\n");
968 ok(ret
, "failed to send request %u\n", GetLastError());
970 ret
= WinHttpReceiveResponse(req
, NULL
);
971 ok(ret
, "failed to receive response %u\n", GetLastError());
974 SetLastError(0xdeadbeef);
975 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_VERSION
, NULL
, NULL
, &size
, NULL
);
976 error
= GetLastError();
977 ok(!ret
, "succeeded unexpectedly\n");
978 ok(error
== ERROR_INSUFFICIENT_BUFFER
, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error
);
980 version
= HeapAlloc(GetProcessHeap(), 0, size
);
981 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_VERSION
, NULL
, version
, &size
, NULL
);
982 ok(ret
, "failed unexpectedly %u\n", GetLastError());
983 ok(lstrlenW(version
) == size
/ sizeof(WCHAR
), "unexpected size %u\n", size
);
984 HeapFree(GetProcessHeap(), 0, version
);
986 size
= sizeof(status
);
987 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
| WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
988 ok(ret
, "failed unexpectedly %u\n", GetLastError());
989 ok(status
== 200, "request failed unexpectedly %u\n", status
);
992 WinHttpCloseHandle(req
);
993 WinHttpCloseHandle(con
);
994 WinHttpCloseHandle(ses
);
997 static const WCHAR Connections
[] = {
998 'S','o','f','t','w','a','r','e','\\',
999 'M','i','c','r','o','s','o','f','t','\\',
1000 'W','i','n','d','o','w','s','\\',
1001 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
1002 'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s','\\',
1003 'C','o','n','n','e','c','t','i','o','n','s',0 };
1004 static const WCHAR WinHttpSettings
[] = {
1005 'W','i','n','H','t','t','p','S','e','t','t','i','n','g','s',0 };
1007 static DWORD
get_default_proxy_reg_value( BYTE
*buf
, DWORD len
, DWORD
*type
)
1013 l
= RegOpenKeyExW( HKEY_LOCAL_MACHINE
, Connections
, 0, KEY_READ
, &key
);
1018 l
= RegQueryValueExW( key
, WinHttpSettings
, NULL
, type
, NULL
, &size
);
1022 l
= RegQueryValueExW( key
, WinHttpSettings
, NULL
, type
, buf
,
1032 static void set_default_proxy_reg_value( BYTE
*buf
, DWORD len
, DWORD type
)
1037 l
= RegCreateKeyExW( HKEY_LOCAL_MACHINE
, Connections
, 0, NULL
, 0,
1038 KEY_WRITE
, NULL
, &key
, NULL
);
1042 RegSetValueExW( key
, WinHttpSettings
, 0, type
, buf
, len
);
1044 RegDeleteValueW( key
, WinHttpSettings
);
1049 static void test_set_default_proxy_config(void)
1051 static WCHAR wideString
[] = { 0x226f, 0x575b, 0 };
1052 static WCHAR normalString
[] = { 'f','o','o',0 };
1054 BYTE
*saved_proxy_settings
= NULL
;
1055 WINHTTP_PROXY_INFO info
;
1058 /* FIXME: it would be simpler to read the current settings using
1059 * WinHttpGetDefaultProxyConfiguration and save them using
1060 * WinHttpSetDefaultProxyConfiguration, but they appear to have a bug.
1062 * If a proxy is configured in the registry, e.g. via 'proxcfg -p "foo"',
1063 * the access type reported by WinHttpGetDefaultProxyConfiguration is 1,
1064 * WINHTTP_ACCESS_TYPE_NO_PROXY, whereas it should be
1065 * WINHTTP_ACCESS_TYPE_NAMED_PROXY.
1066 * If WinHttpSetDefaultProxyConfiguration is called with dwAccessType = 1,
1067 * the lpszProxy and lpszProxyBypass values are ignored.
1068 * Thus, if a proxy is set with proxycfg, then calling
1069 * WinHttpGetDefaultProxyConfiguration followed by
1070 * WinHttpSetDefaultProxyConfiguration results in the proxy settings
1071 * getting deleted from the registry.
1073 * Instead I read the current registry value and restore it directly.
1075 len
= get_default_proxy_reg_value( NULL
, 0, &type
);
1078 saved_proxy_settings
= HeapAlloc( GetProcessHeap(), 0, len
);
1079 len
= get_default_proxy_reg_value( saved_proxy_settings
, len
, &type
);
1084 /* Crashes on Vista and higher */
1085 SetLastError(0xdeadbeef);
1086 ret
= WinHttpSetDefaultProxyConfiguration(NULL
);
1087 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1088 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1091 /* test with invalid access type */
1092 info
.dwAccessType
= 0xdeadbeef;
1093 info
.lpszProxy
= info
.lpszProxyBypass
= NULL
;
1094 SetLastError(0xdeadbeef);
1095 ret
= WinHttpSetDefaultProxyConfiguration(&info
);
1096 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1097 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1099 /* at a minimum, the proxy server must be set */
1100 info
.dwAccessType
= WINHTTP_ACCESS_TYPE_NAMED_PROXY
;
1101 info
.lpszProxy
= info
.lpszProxyBypass
= NULL
;
1102 SetLastError(0xdeadbeef);
1103 ret
= WinHttpSetDefaultProxyConfiguration(&info
);
1104 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1105 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1106 info
.lpszProxyBypass
= normalString
;
1107 SetLastError(0xdeadbeef);
1108 ret
= WinHttpSetDefaultProxyConfiguration(&info
);
1109 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1110 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1112 /* the proxy server can't have wide characters */
1113 info
.lpszProxy
= wideString
;
1114 SetLastError(0xdeadbeef);
1115 ret
= WinHttpSetDefaultProxyConfiguration(&info
);
1116 if (!ret
&& GetLastError() == ERROR_ACCESS_DENIED
)
1117 skip("couldn't set default proxy configuration: access denied\n");
1119 ok((!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
) ||
1120 broken(ret
), /* Earlier winhttp versions on W2K/XP */
1121 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1123 info
.lpszProxy
= normalString
;
1124 SetLastError(0xdeadbeef);
1125 ret
= WinHttpSetDefaultProxyConfiguration(&info
);
1126 if (!ret
&& GetLastError() == ERROR_ACCESS_DENIED
)
1127 skip("couldn't set default proxy configuration: access denied\n");
1129 ok(ret
, "WinHttpSetDefaultProxyConfiguration failed: %d\n",
1132 set_default_proxy_reg_value( saved_proxy_settings
, len
, type
);
1135 static void test_Timeouts (void)
1139 HINTERNET ses
, req
, con
;
1141 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1142 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
1144 SetLastError(0xdeadbeef);
1145 ret
= WinHttpSetTimeouts(ses
, -2, 0, 0, 0);
1146 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1147 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1149 SetLastError(0xdeadbeef);
1150 ret
= WinHttpSetTimeouts(ses
, 0, -2, 0, 0);
1151 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1152 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1154 SetLastError(0xdeadbeef);
1155 ret
= WinHttpSetTimeouts(ses
, 0, 0, -2, 0);
1156 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1157 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1159 SetLastError(0xdeadbeef);
1160 ret
= WinHttpSetTimeouts(ses
, 0, 0, 0, -2);
1161 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1162 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1164 SetLastError(0xdeadbeef);
1165 ret
= WinHttpSetTimeouts(ses
, -1, -1, -1, -1);
1166 ok(ret
, "%u\n", GetLastError());
1168 SetLastError(0xdeadbeef);
1169 ret
= WinHttpSetTimeouts(ses
, 0, 0, 0, 0);
1170 ok(ret
, "%u\n", GetLastError());
1172 SetLastError(0xdeadbeef);
1173 ret
= WinHttpSetTimeouts(ses
, 0x0123, 0x4567, 0x89ab, 0xcdef);
1174 ok(ret
, "%u\n", GetLastError());
1176 SetLastError(0xdeadbeef);
1178 size
= sizeof(DWORD
);
1179 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1180 ok(ret
, "%u\n", GetLastError());
1181 ok(value
== 0x0123, "Expected 0x0123, got %u\n", value
);
1183 SetLastError(0xdeadbeef);
1185 size
= sizeof(DWORD
);
1186 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1187 ok(ret
, "%u\n", GetLastError());
1188 ok(value
== 0x4567, "Expected 0x4567, got %u\n", value
);
1190 SetLastError(0xdeadbeef);
1192 size
= sizeof(DWORD
);
1193 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1194 ok(ret
, "%u\n", GetLastError());
1195 ok(value
== 0x89ab, "Expected 0x89ab, got %u\n", value
);
1197 SetLastError(0xdeadbeef);
1199 size
= sizeof(DWORD
);
1200 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1201 ok(ret
, "%u\n", GetLastError());
1202 ok(value
== 0xcdef, "Expected 0xcdef, got %u\n", value
);
1204 SetLastError(0xdeadbeef);
1206 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1207 ok(ret
, "%u\n", GetLastError());
1209 SetLastError(0xdeadbeef);
1211 size
= sizeof(DWORD
);
1212 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1213 ok(ret
, "%u\n", GetLastError());
1214 ok(value
== 0, "Expected 0, got %u\n", value
);
1216 SetLastError(0xdeadbeef);
1218 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1219 ok(ret
, "%u\n", GetLastError());
1221 SetLastError(0xdeadbeef);
1223 size
= sizeof(DWORD
);
1224 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1225 ok(ret
, "%u\n", GetLastError());
1226 ok(value
== 0, "Expected 0, got %u\n", value
);
1228 SetLastError(0xdeadbeef);
1230 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1231 ok(ret
, "%u\n", GetLastError());
1233 SetLastError(0xdeadbeef);
1235 size
= sizeof(DWORD
);
1236 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1237 ok(ret
, "%u\n", GetLastError());
1238 ok(value
== 0, "Expected 0, got %u\n", value
);
1240 SetLastError(0xdeadbeef);
1242 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1243 ok(ret
, "%u\n", GetLastError());
1245 SetLastError(0xdeadbeef);
1247 size
= sizeof(DWORD
);
1248 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1249 ok(ret
, "%u\n", GetLastError());
1250 ok(value
== 0, "Expected 0, got %u\n", value
);
1252 SetLastError(0xdeadbeef);
1254 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1255 ok(ret
, "%u\n", GetLastError());
1257 SetLastError(0xdeadbeef);
1259 size
= sizeof(DWORD
);
1260 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1261 ok(ret
, "%u\n", GetLastError());
1262 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1264 SetLastError(0xdeadbeef);
1266 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1267 ok(ret
, "%u\n", GetLastError());
1269 SetLastError(0xdeadbeef);
1271 size
= sizeof(DWORD
);
1272 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1273 ok(ret
, "%u\n", GetLastError());
1274 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1276 SetLastError(0xdeadbeef);
1278 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1279 ok(ret
, "%u\n", GetLastError());
1281 SetLastError(0xdeadbeef);
1283 size
= sizeof(DWORD
);
1284 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1285 ok(ret
, "%u\n", GetLastError());
1286 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1288 SetLastError(0xdeadbeef);
1290 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1291 ok(ret
, "%u\n", GetLastError());
1293 SetLastError(0xdeadbeef);
1295 size
= sizeof(DWORD
);
1296 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1297 ok(ret
, "%u\n", GetLastError());
1298 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1300 con
= WinHttpConnect(ses
, test_winehq
, 0, 0);
1301 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
1303 /* Timeout values should match the last one set for session */
1304 SetLastError(0xdeadbeef);
1306 size
= sizeof(DWORD
);
1307 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1308 ok(ret
, "%u\n", GetLastError());
1309 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1311 SetLastError(0xdeadbeef);
1313 size
= sizeof(DWORD
);
1314 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1315 ok(ret
, "%u\n", GetLastError());
1316 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1318 SetLastError(0xdeadbeef);
1320 size
= sizeof(DWORD
);
1321 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1322 ok(ret
, "%u\n", GetLastError());
1323 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1325 SetLastError(0xdeadbeef);
1327 size
= sizeof(DWORD
);
1328 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1329 ok(ret
, "%u\n", GetLastError());
1330 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1332 SetLastError(0xdeadbeef);
1333 ret
= WinHttpSetTimeouts(con
, -2, 0, 0, 0);
1334 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1335 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1337 SetLastError(0xdeadbeef);
1338 ret
= WinHttpSetTimeouts(con
, 0, -2, 0, 0);
1339 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1340 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1342 SetLastError(0xdeadbeef);
1343 ret
= WinHttpSetTimeouts(con
, 0, 0, -2, 0);
1344 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1345 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1347 SetLastError(0xdeadbeef);
1348 ret
= WinHttpSetTimeouts(con
, 0, 0, 0, -2);
1349 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1350 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1352 SetLastError(0xdeadbeef);
1353 ret
= WinHttpSetTimeouts(con
, -1, -1, -1, -1);
1354 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1355 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1357 SetLastError(0xdeadbeef);
1358 ret
= WinHttpSetTimeouts(con
, 0, 0, 0, 0);
1359 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1360 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1362 SetLastError(0xdeadbeef);
1364 ret
= WinHttpSetOption(con
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1365 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1366 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1368 SetLastError(0xdeadbeef);
1370 ret
= WinHttpSetOption(con
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1371 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1372 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1374 SetLastError(0xdeadbeef);
1376 ret
= WinHttpSetOption(con
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1377 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1378 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1380 SetLastError(0xdeadbeef);
1382 ret
= WinHttpSetOption(con
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1383 ok(!ret
&& GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
,
1384 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1386 /* Changing timeout values for session should affect the values for connection */
1387 SetLastError(0xdeadbeef);
1389 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1390 ok(ret
, "%u\n", GetLastError());
1392 SetLastError(0xdeadbeef);
1394 size
= sizeof(DWORD
);
1395 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1396 ok(ret
, "%u\n", GetLastError());
1397 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1399 SetLastError(0xdeadbeef);
1401 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1402 ok(ret
, "%u\n", GetLastError());
1404 SetLastError(0xdeadbeef);
1406 size
= sizeof(DWORD
);
1407 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1408 ok(ret
, "%u\n", GetLastError());
1409 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1411 SetLastError(0xdeadbeef);
1413 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1414 ok(ret
, "%u\n", GetLastError());
1416 SetLastError(0xdeadbeef);
1418 size
= sizeof(DWORD
);
1419 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1420 ok(ret
, "%u\n", GetLastError());
1421 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1423 SetLastError(0xdeadbeef);
1425 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1426 ok(ret
, "%u\n", GetLastError());
1428 SetLastError(0xdeadbeef);
1430 size
= sizeof(DWORD
);
1431 ret
= WinHttpQueryOption(con
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1432 ok(ret
, "%u\n", GetLastError());
1433 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1435 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
1436 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
1438 /* Timeout values should match the last one set for session */
1439 SetLastError(0xdeadbeef);
1441 size
= sizeof(DWORD
);
1442 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1443 ok(ret
, "%u\n", GetLastError());
1444 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1446 SetLastError(0xdeadbeef);
1448 size
= sizeof(DWORD
);
1449 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1450 ok(ret
, "%u\n", GetLastError());
1451 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1453 SetLastError(0xdeadbeef);
1455 size
= sizeof(DWORD
);
1456 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1457 ok(ret
, "%u\n", GetLastError());
1458 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1460 SetLastError(0xdeadbeef);
1462 size
= sizeof(DWORD
);
1463 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1464 ok(ret
, "%u\n", GetLastError());
1465 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1467 SetLastError(0xdeadbeef);
1468 ret
= WinHttpSetTimeouts(req
, -2, 0, 0, 0);
1469 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1470 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1472 SetLastError(0xdeadbeef);
1473 ret
= WinHttpSetTimeouts(req
, 0, -2, 0, 0);
1474 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1475 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1477 SetLastError(0xdeadbeef);
1478 ret
= WinHttpSetTimeouts(req
, 0, 0, -2, 0);
1479 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1480 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1482 SetLastError(0xdeadbeef);
1483 ret
= WinHttpSetTimeouts(req
, 0, 0, 0, -2);
1484 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
1485 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1487 SetLastError(0xdeadbeef);
1488 ret
= WinHttpSetTimeouts(req
, -1, -1, -1, -1);
1489 ok(ret
, "%u\n", GetLastError());
1491 SetLastError(0xdeadbeef);
1492 ret
= WinHttpSetTimeouts(req
, 0, 0, 0, 0);
1493 ok(ret
, "%u\n", GetLastError());
1495 SetLastError(0xdeadbeef);
1496 ret
= WinHttpSetTimeouts(req
, 0xcdef, 0x89ab, 0x4567, 0x0123);
1497 ok(ret
, "%u\n", GetLastError());
1499 SetLastError(0xdeadbeef);
1501 size
= sizeof(DWORD
);
1502 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1503 ok(ret
, "%u\n", GetLastError());
1504 ok(value
== 0xcdef, "Expected 0xcdef, got %u\n", value
);
1506 SetLastError(0xdeadbeef);
1508 size
= sizeof(DWORD
);
1509 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1510 ok(ret
, "%u\n", GetLastError());
1511 ok(value
== 0x89ab, "Expected 0x89ab, got %u\n", value
);
1513 SetLastError(0xdeadbeef);
1515 size
= sizeof(DWORD
);
1516 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1517 ok(ret
, "%u\n", GetLastError());
1518 ok(value
== 0x4567, "Expected 0x4567, got %u\n", value
);
1520 SetLastError(0xdeadbeef);
1522 size
= sizeof(DWORD
);
1523 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1524 ok(ret
, "%u\n", GetLastError());
1525 ok(value
== 0x0123, "Expected 0x0123, got %u\n", value
);
1527 SetLastError(0xdeadbeef);
1529 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1530 ok(ret
, "%u\n", GetLastError());
1532 SetLastError(0xdeadbeef);
1534 size
= sizeof(DWORD
);
1535 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1536 ok(ret
, "%u\n", GetLastError());
1537 ok(value
== 0, "Expected 0, got %u\n", value
);
1539 SetLastError(0xdeadbeef);
1541 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1542 ok(ret
, "%u\n", GetLastError());
1544 SetLastError(0xdeadbeef);
1546 size
= sizeof(DWORD
);
1547 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1548 ok(ret
, "%u\n", GetLastError());
1549 ok(value
== 0, "Expected 0, got %u\n", value
);
1551 SetLastError(0xdeadbeef);
1553 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1554 ok(ret
, "%u\n", GetLastError());
1556 SetLastError(0xdeadbeef);
1558 size
= sizeof(DWORD
);
1559 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1560 ok(ret
, "%u\n", GetLastError());
1561 ok(value
== 0, "Expected 0, got %u\n", value
);
1563 SetLastError(0xdeadbeef);
1565 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1566 ok(ret
, "%u\n", GetLastError());
1568 SetLastError(0xdeadbeef);
1570 size
= sizeof(DWORD
);
1571 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1572 ok(ret
, "%u\n", GetLastError());
1573 ok(value
== 0, "Expected 0, got %u\n", value
);
1575 SetLastError(0xdeadbeef);
1577 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1578 ok(ret
, "%u\n", GetLastError());
1580 SetLastError(0xdeadbeef);
1582 size
= sizeof(DWORD
);
1583 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1584 ok(ret
, "%u\n", GetLastError());
1585 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1587 SetLastError(0xdeadbeef);
1589 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1590 ok(ret
, "%u\n", GetLastError());
1592 SetLastError(0xdeadbeef);
1594 size
= sizeof(DWORD
);
1595 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1596 ok(ret
, "%u\n", GetLastError());
1597 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1599 SetLastError(0xdeadbeef);
1601 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1602 ok(ret
, "%u\n", GetLastError());
1604 SetLastError(0xdeadbeef);
1606 size
= sizeof(DWORD
);
1607 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1608 ok(ret
, "%u\n", GetLastError());
1609 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1611 SetLastError(0xdeadbeef);
1613 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1614 ok(ret
, "%u\n", GetLastError());
1616 SetLastError(0xdeadbeef);
1618 size
= sizeof(DWORD
);
1619 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1620 ok(ret
, "%u\n", GetLastError());
1621 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1623 /* Changing timeout values for session should not affect the values for a request,
1624 * neither should the other way around.
1626 SetLastError(0xdeadbeef);
1628 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1629 ok(ret
, "%u\n", GetLastError());
1631 SetLastError(0xdeadbeef);
1633 size
= sizeof(DWORD
);
1634 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1635 ok(ret
, "%u\n", GetLastError());
1636 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1638 SetLastError(0xdeadbeef);
1640 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1641 ok(ret
, "%u\n", GetLastError());
1643 SetLastError(0xdeadbeef);
1645 size
= sizeof(DWORD
);
1646 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1647 ok(ret
, "%u\n", GetLastError());
1648 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1650 SetLastError(0xdeadbeef);
1652 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1653 ok(ret
, "%u\n", GetLastError());
1655 SetLastError(0xdeadbeef);
1657 size
= sizeof(DWORD
);
1658 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1659 ok(ret
, "%u\n", GetLastError());
1660 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1662 SetLastError(0xdeadbeef);
1664 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1665 ok(ret
, "%u\n", GetLastError());
1667 SetLastError(0xdeadbeef);
1669 size
= sizeof(DWORD
);
1670 ret
= WinHttpQueryOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1671 ok(ret
, "%u\n", GetLastError());
1672 ok(value
== 0xdead, "Expected 0xdead, got %u\n", value
);
1674 SetLastError(0xdeadbeef);
1676 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, sizeof(value
));
1677 ok(ret
, "%u\n", GetLastError());
1679 SetLastError(0xdeadbeef);
1681 size
= sizeof(DWORD
);
1682 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &value
, &size
);
1683 ok(ret
, "%u\n", GetLastError());
1684 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1686 SetLastError(0xdeadbeef);
1688 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, sizeof(value
));
1689 ok(ret
, "%u\n", GetLastError());
1691 SetLastError(0xdeadbeef);
1693 size
= sizeof(DWORD
);
1694 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_CONNECT_TIMEOUT
, &value
, &size
);
1695 ok(ret
, "%u\n", GetLastError());
1696 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1698 SetLastError(0xdeadbeef);
1700 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, sizeof(value
));
1701 ok(ret
, "%u\n", GetLastError());
1703 SetLastError(0xdeadbeef);
1705 size
= sizeof(DWORD
);
1706 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_SEND_TIMEOUT
, &value
, &size
);
1707 ok(ret
, "%u\n", GetLastError());
1708 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1710 SetLastError(0xdeadbeef);
1712 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, sizeof(value
));
1713 ok(ret
, "%u\n", GetLastError());
1715 SetLastError(0xdeadbeef);
1717 size
= sizeof(DWORD
);
1718 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_RECEIVE_TIMEOUT
, &value
, &size
);
1719 ok(ret
, "%u\n", GetLastError());
1720 ok(value
== 0xbeefdead, "Expected 0xbeefdead, got %u\n", value
);
1722 WinHttpCloseHandle(req
);
1723 WinHttpCloseHandle(con
);
1724 WinHttpCloseHandle(ses
);
1727 static void test_resolve_timeout(void)
1729 static const WCHAR nxdomain
[] =
1730 {'n','x','d','o','m','a','i','n','.','w','i','n','e','h','q','.','o','r','g',0};
1731 HINTERNET ses
, con
, req
;
1735 if (! proxy_active())
1737 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1738 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
1741 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &timeout
, sizeof(timeout
));
1742 ok(ret
, "failed to set resolve timeout %u\n", GetLastError());
1744 con
= WinHttpConnect(ses
, nxdomain
, 0, 0);
1745 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
1747 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
1748 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
1750 SetLastError(0xdeadbeef);
1751 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
1754 skip("nxdomain returned success. Broken ISP redirects?\n");
1757 ok(GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED
,
1758 "expected ERROR_WINHTTP_NAME_NOT_RESOLVED got %u\n", GetLastError());
1760 WinHttpCloseHandle(req
);
1761 WinHttpCloseHandle(con
);
1762 WinHttpCloseHandle(ses
);
1765 skip("Skipping host resolution tests, host resolution preformed by proxy\n");
1767 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1768 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
1771 ret
= WinHttpSetOption(ses
, WINHTTP_OPTION_RESOLVE_TIMEOUT
, &timeout
, sizeof(timeout
));
1772 ok(ret
, "failed to set resolve timeout %u\n", GetLastError());
1774 con
= WinHttpConnect(ses
, test_winehq
, 0, 0);
1775 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
1777 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
1778 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
1780 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
1781 if (!ret
&& GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
)
1783 skip("connection failed, skipping\n");
1786 ok(ret
, "failed to send request\n");
1789 WinHttpCloseHandle(req
);
1790 WinHttpCloseHandle(con
);
1791 WinHttpCloseHandle(ses
);
1794 static const char page1
[] =
1796 "<HEAD><TITLE>winhttp test page</TITLE></HEAD>\r\n"
1797 "<BODY>The quick brown fox jumped over the lazy dog<P></BODY>\r\n"
1800 static const char okmsg
[] =
1801 "HTTP/1.1 200 OK\r\n"
1802 "Server: winetest\r\n"
1805 static const char nocontentmsg
[] =
1806 "HTTP/1.1 204 No Content\r\n"
1807 "Server: winetest\r\n"
1810 static const char notmodified
[] =
1811 "HTTP/1.1 304 Not Modified\r\n"
1814 static const char noauthmsg
[] =
1815 "HTTP/1.1 401 Unauthorized\r\n"
1816 "Server: winetest\r\n"
1817 "Connection: close\r\n"
1818 "WWW-Authenticate: Basic realm=\"placebo\"\r\n"
1821 static const char okauthmsg
[] =
1822 "HTTP/1.1 200 OK\r\n"
1823 "Server: winetest\r\n"
1824 "Connection: close\r\n"
1827 static const char headmsg
[] =
1828 "HTTP/1.1 200 OK\r\n"
1829 "Content-Length: 100\r\n"
1838 #define BIG_BUFFER_LEN 0x2250
1840 static DWORD CALLBACK
server_thread(LPVOID param
)
1842 struct server_info
*si
= param
;
1843 int r
, c
= -1, i
, on
;
1845 struct sockaddr_in sa
;
1848 int last_request
= 0;
1850 WSAStartup(MAKEWORD(1,1), &wsaData
);
1852 s
= socket(AF_INET
, SOCK_STREAM
, 0);
1853 if (s
== INVALID_SOCKET
)
1857 setsockopt(s
, SOL_SOCKET
, SO_REUSEADDR
, (char*)&on
, sizeof on
);
1859 memset(&sa
, 0, sizeof sa
);
1860 sa
.sin_family
= AF_INET
;
1861 sa
.sin_port
= htons(si
->port
);
1862 sa
.sin_addr
.S_un
.S_addr
= inet_addr("127.0.0.1");
1864 r
= bind(s
, (struct sockaddr
*)&sa
, sizeof(sa
));
1869 SetEvent(si
->event
);
1872 if (c
== -1) c
= accept(s
, NULL
, NULL
);
1874 memset(buffer
, 0, sizeof buffer
);
1875 for(i
= 0; i
< sizeof buffer
- 1; i
++)
1877 r
= recv(c
, &buffer
[i
], 1, 0);
1880 if (i
< 4) continue;
1881 if (buffer
[i
- 2] == '\n' && buffer
[i
] == '\n' &&
1882 buffer
[i
- 3] == '\r' && buffer
[i
- 1] == '\r')
1885 if (strstr(buffer
, "GET /basic"))
1887 send(c
, okmsg
, sizeof okmsg
- 1, 0);
1888 send(c
, page1
, sizeof page1
- 1, 0);
1890 if (strstr(buffer
, "/auth"))
1892 if (strstr(buffer
, "Authorization: Basic dXNlcjpwd2Q="))
1893 send(c
, okauthmsg
, sizeof okauthmsg
- 1, 0);
1895 send(c
, noauthmsg
, sizeof noauthmsg
- 1, 0);
1897 if (strstr(buffer
, "/big"))
1899 char msg
[BIG_BUFFER_LEN
];
1900 memset(msg
, 'm', sizeof(msg
));
1901 send(c
, okmsg
, sizeof(okmsg
) - 1, 0);
1902 send(c
, msg
, sizeof(msg
), 0);
1904 if (strstr(buffer
, "/no_headers"))
1906 send(c
, page1
, sizeof page1
- 1, 0);
1908 if (strstr(buffer
, "GET /no_content"))
1910 send(c
, nocontentmsg
, sizeof nocontentmsg
- 1, 0);
1913 if (strstr(buffer
, "GET /not_modified"))
1915 send(c
, notmodified
, sizeof notmodified
- 1, 0);
1918 if (strstr(buffer
, "HEAD /head"))
1920 send(c
, headmsg
, sizeof headmsg
- 1, 0);
1923 if (strstr(buffer
, "GET /quit"))
1925 send(c
, okmsg
, sizeof okmsg
- 1, 0);
1926 send(c
, page1
, sizeof page1
- 1, 0);
1933 } while (!last_request
);
1939 static void test_basic_request(int port
, const WCHAR
*verb
, const WCHAR
*path
)
1941 HINTERNET ses
, con
, req
;
1943 DWORD count
, status
, size
, error
, supported
, first
, target
;
1946 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1947 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
1949 con
= WinHttpConnect(ses
, localhostW
, port
, 0);
1950 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
1952 req
= WinHttpOpenRequest(con
, verb
, path
, NULL
, NULL
, NULL
, 0);
1953 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
1955 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
1956 ok(ret
, "failed to send request %u\n", GetLastError());
1958 ret
= WinHttpReceiveResponse(req
, NULL
);
1959 ok(ret
, "failed to receive response %u\n", GetLastError());
1961 size
= sizeof(status
);
1962 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
|WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
1963 ok(ret
, "failed to query status code %u\n", GetLastError());
1964 ok(status
== 200, "request failed unexpectedly %u\n", status
);
1966 supported
= first
= target
= 0xdeadbeef;
1967 SetLastError(0xdeadbeef);
1968 ret
= WinHttpQueryAuthSchemes(req
, &supported
, &first
, &target
);
1969 error
= GetLastError();
1970 ok(!ret
, "unexpected success\n");
1971 todo_wine
ok(error
== ERROR_INVALID_OPERATION
, "expected ERROR_INVALID_OPERATION, got %u\n", error
);
1972 ok(supported
== 0xdeadbeef, "got %x\n", supported
);
1973 ok(first
== 0xdeadbeef, "got %x\n", first
);
1974 ok(target
== 0xdeadbeef, "got %x\n", target
);
1977 memset(buffer
, 0, sizeof(buffer
));
1978 ret
= WinHttpReadData(req
, buffer
, sizeof buffer
, &count
);
1979 ok(ret
, "failed to read data %u\n", GetLastError());
1980 ok(count
== sizeof page1
- 1, "count was wrong\n");
1981 ok(!memcmp(buffer
, page1
, sizeof page1
), "http data wrong\n");
1983 WinHttpCloseHandle(req
);
1984 WinHttpCloseHandle(con
);
1985 WinHttpCloseHandle(ses
);
1988 static void test_basic_authentication(int port
)
1990 static const WCHAR authW
[] = {'/','a','u','t','h',0};
1991 static const WCHAR userW
[] = {'u','s','e','r',0};
1992 static const WCHAR passW
[] = {'p','w','d',0};
1993 HINTERNET ses
, con
, req
;
1994 DWORD status
, size
, error
, supported
, first
, target
;
1997 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
1998 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
2000 con
= WinHttpConnect(ses
, localhostW
, port
, 0);
2001 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
2003 req
= WinHttpOpenRequest(con
, NULL
, authW
, NULL
, NULL
, NULL
, 0);
2004 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
2006 SetLastError(0xdeadbeef);
2007 ret
= WinHttpQueryAuthSchemes(NULL
, NULL
, NULL
, NULL
);
2008 error
= GetLastError();
2009 ok(!ret
, "expected failure\n");
2010 ok(error
== ERROR_INVALID_HANDLE
, "expected ERROR_INVALID_HANDLE, got %u\n", error
);
2012 SetLastError(0xdeadbeef);
2013 ret
= WinHttpQueryAuthSchemes(req
, NULL
, NULL
, NULL
);
2014 error
= GetLastError();
2015 ok(!ret
, "expected failure\n");
2016 ok(error
== ERROR_INVALID_PARAMETER
|| error
== ERROR_INVALID_OPERATION
, "got %u\n", error
);
2018 supported
= 0xdeadbeef;
2019 SetLastError(0xdeadbeef);
2020 ret
= WinHttpQueryAuthSchemes(req
, &supported
, NULL
, NULL
);
2021 error
= GetLastError();
2022 ok(!ret
, "expected failure\n");
2023 ok(error
== ERROR_INVALID_PARAMETER
|| error
== ERROR_INVALID_OPERATION
, "got %u\n", error
);
2024 ok(supported
== 0xdeadbeef, "got %x\n", supported
);
2026 supported
= first
= 0xdeadbeef;
2027 SetLastError(0xdeadbeef);
2028 ret
= WinHttpQueryAuthSchemes(req
, &supported
, &first
, NULL
);
2029 error
= GetLastError();
2030 ok(!ret
, "expected failure\n");
2031 ok(error
== ERROR_INVALID_PARAMETER
|| error
== ERROR_INVALID_OPERATION
, "got %u\n", error
);
2032 ok(supported
== 0xdeadbeef, "got %x\n", supported
);
2033 ok(first
== 0xdeadbeef, "got %x\n", first
);
2035 supported
= first
= target
= 0xdeadbeef;
2036 SetLastError(0xdeadbeef);
2037 ret
= WinHttpQueryAuthSchemes(req
, &supported
, &first
, &target
);
2038 error
= GetLastError();
2039 ok(!ret
, "expected failure\n");
2040 todo_wine
ok(error
== ERROR_INVALID_OPERATION
, "expected ERROR_INVALID_OPERATION, got %u\n", error
);
2041 ok(supported
== 0xdeadbeef, "got %x\n", supported
);
2042 ok(first
== 0xdeadbeef, "got %x\n", first
);
2043 ok(target
== 0xdeadbeef, "got %x\n", target
);
2045 supported
= first
= target
= 0xdeadbeef;
2046 SetLastError(0xdeadbeef);
2047 ret
= WinHttpQueryAuthSchemes(NULL
, &supported
, &first
, &target
);
2048 error
= GetLastError();
2049 ok(!ret
, "expected failure\n");
2050 ok(error
== ERROR_INVALID_HANDLE
, "expected ERROR_INVALID_HANDLE, got %u\n", error
);
2051 ok(supported
== 0xdeadbeef, "got %x\n", supported
);
2052 ok(first
== 0xdeadbeef, "got %x\n", first
);
2053 ok(target
== 0xdeadbeef, "got %x\n", target
);
2055 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
2056 ok(ret
, "failed to send request %u\n", GetLastError());
2058 ret
= WinHttpReceiveResponse(req
, NULL
);
2059 ok(ret
, "failed to receive response %u\n", GetLastError());
2061 size
= sizeof(status
);
2062 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
|WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
2063 ok(ret
, "failed to query status code %u\n", GetLastError());
2064 ok(status
== 401, "request failed unexpectedly %u\n", status
);
2066 supported
= first
= target
= 0xdeadbeef;
2067 ret
= WinHttpQueryAuthSchemes(req
, &supported
, &first
, &target
);
2068 ok(ret
, "failed to query authentication schemes %u\n", GetLastError());
2069 ok(supported
== WINHTTP_AUTH_SCHEME_BASIC
, "got %x\n", supported
);
2070 ok(first
== WINHTTP_AUTH_SCHEME_BASIC
, "got %x\n", first
);
2071 ok(target
== WINHTTP_AUTH_TARGET_SERVER
, "got %x\n", target
);
2073 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_NTLM
, NULL
, NULL
, NULL
);
2074 ok(ret
, "failed to set credentials %u\n", GetLastError());
2076 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_PASSPORT
, NULL
, NULL
, NULL
);
2077 ok(ret
, "failed to set credentials %u\n", GetLastError());
2079 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_NEGOTIATE
, NULL
, NULL
, NULL
);
2080 ok(ret
, "failed to set credentials %u\n", GetLastError());
2082 SetLastError(0xdeadbeef);
2083 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_DIGEST
, NULL
, NULL
, NULL
);
2084 error
= GetLastError();
2085 ok(!ret
, "expected failure\n");
2086 ok(error
== ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %u\n", error
);
2088 SetLastError(0xdeadbeef);
2089 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, NULL
, NULL
, NULL
);
2090 error
= GetLastError();
2091 ok(!ret
, "expected failure\n");
2092 ok(error
== ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %u\n", error
);
2094 SetLastError(0xdeadbeef);
2095 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, userW
, NULL
, NULL
);
2096 error
= GetLastError();
2097 ok(!ret
, "expected failure\n");
2098 ok(error
== ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %u\n", error
);
2100 SetLastError(0xdeadbeef);
2101 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, NULL
, passW
, NULL
);
2102 error
= GetLastError();
2103 ok(!ret
, "expected failure\n");
2104 ok(error
== ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %u\n", error
);
2106 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, userW
, passW
, NULL
);
2107 ok(ret
, "failed to set credentials %u\n", GetLastError());
2109 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
2110 ok(ret
, "failed to send request %u\n", GetLastError());
2112 ret
= WinHttpReceiveResponse(req
, NULL
);
2113 ok(ret
, "failed to receive response %u\n", GetLastError());
2115 size
= sizeof(status
);
2116 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
|WINHTTP_QUERY_FLAG_NUMBER
, NULL
, &status
, &size
, NULL
);
2117 ok(ret
, "failed to query status code %u\n", GetLastError());
2118 ok(status
== 200, "request failed unexpectedly %u\n", status
);
2120 WinHttpCloseHandle(req
);
2121 WinHttpCloseHandle(con
);
2122 WinHttpCloseHandle(ses
);
2125 static void test_no_headers(int port
)
2127 static const WCHAR no_headersW
[] = {'/','n','o','_','h','e','a','d','e','r','s',0};
2128 HINTERNET ses
, con
, req
;
2132 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
2133 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
2135 con
= WinHttpConnect(ses
, localhostW
, port
, 0);
2136 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
2138 req
= WinHttpOpenRequest(con
, NULL
, no_headersW
, NULL
, NULL
, NULL
, 0);
2139 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
2141 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
2144 error
= GetLastError();
2145 ok(error
== ERROR_WINHTTP_INVALID_SERVER_RESPONSE
, "got %u\n", error
);
2149 SetLastError(0xdeadbeef);
2150 ret
= WinHttpReceiveResponse(req
, NULL
);
2151 error
= GetLastError();
2152 ok(!ret
, "expected failure\n");
2153 ok(error
== ERROR_WINHTTP_INVALID_SERVER_RESPONSE
, "got %u\n", error
);
2156 WinHttpCloseHandle(req
);
2157 WinHttpCloseHandle(con
);
2158 WinHttpCloseHandle(ses
);
2161 static void test_no_content(int port
)
2163 static const WCHAR no_contentW
[] = {'/','n','o','_','c','o','n','t','e','n','t',0};
2164 HINTERNET ses
, con
, req
;
2166 DWORD size
, len
= sizeof(buf
), bytes_read
, status
;
2169 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
2170 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
2172 con
= WinHttpConnect(ses
, localhostW
, port
, 0);
2173 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
2175 req
= WinHttpOpenRequest(con
, NULL
, no_contentW
, NULL
, NULL
, NULL
, 0);
2176 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
2179 SetLastError(0xdeadbeef);
2180 ret
= WinHttpQueryDataAvailable(req
, &size
);
2182 ok(!ret
, "expected error\n");
2183 ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_STATE
,
2184 "expected ERROR_WINHTTP_INCORRECT_HANDLE_STATE, got 0x%08x\n", GetLastError());
2185 ok(size
== 12345 || broken(size
== 0) /* Win <= 2003 */,
2186 "expected 12345, got %u\n", size
);
2189 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
2190 ok(ret
, "expected success\n");
2192 ret
= WinHttpReceiveResponse(req
, NULL
);
2193 ok(ret
, "expected success\n");
2195 size
= sizeof(status
);
2196 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
| WINHTTP_QUERY_FLAG_NUMBER
,
2197 NULL
, &status
, &size
, NULL
);
2198 ok(ret
, "expected success\n");
2199 ok(status
== 204, "expected status 204, got %d\n", status
);
2201 SetLastError(0xdeadbeef);
2202 size
= sizeof(status
);
2204 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_CONTENT_LENGTH
| WINHTTP_QUERY_FLAG_NUMBER
,
2205 NULL
, &status
, &size
, 0);
2206 ok(!ret
, "expected no content-length header\n");
2207 ok(GetLastError() == ERROR_WINHTTP_HEADER_NOT_FOUND
,
2208 "wrong error %u\n", GetLastError() );
2209 ok(status
== 12345, "expected 0, got %d\n", status
);
2212 ret
= WinHttpQueryDataAvailable(req
, &size
);
2213 ok(ret
, "expected success\n");
2214 ok(size
== 0, "expected 0, got %d\n", size
);
2216 ret
= WinHttpReadData(req
, buf
, len
, &bytes_read
);
2217 ok(ret
, "expected success\n");
2218 ok( bytes_read
== 0, "expected 0, got %u available\n", bytes_read
);
2221 ret
= WinHttpQueryDataAvailable(req
, &size
);
2222 ok(ret
, "expected success\n");
2223 ok(size
== 0, "expected 0, got %d\n", size
);
2225 WinHttpCloseHandle(req
);
2228 SetLastError(0xdeadbeef);
2229 ret
= WinHttpQueryDataAvailable(req
, &size
);
2230 ok(!ret
, "expected error\n");
2231 ok(GetLastError() == ERROR_INVALID_HANDLE
,
2232 "expected ERROR_INVALID_HANDLE, got 0x%08x\n", GetLastError());
2233 ok(size
== 12345, "expected 12345, got %u\n", size
);
2235 WinHttpCloseHandle(con
);
2236 WinHttpCloseHandle(ses
);
2239 static void test_head_request(int port
)
2241 static const WCHAR verbW
[] = {'H','E','A','D',0};
2242 static const WCHAR headW
[] = {'/','h','e','a','d',0};
2243 HINTERNET ses
, con
, req
;
2245 DWORD size
, len
, count
, status
;
2248 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
2249 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
2251 con
= WinHttpConnect(ses
, localhostW
, port
, 0);
2252 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
2254 req
= WinHttpOpenRequest(con
, verbW
, headW
, NULL
, NULL
, NULL
, 0);
2255 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
2257 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
2258 ok(ret
, "failed to send request %u\n", GetLastError());
2260 ret
= WinHttpReceiveResponse(req
, NULL
);
2261 ok(ret
, "failed to receive response %u\n", GetLastError());
2263 status
= 0xdeadbeef;
2264 size
= sizeof(status
);
2265 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_STATUS_CODE
| WINHTTP_QUERY_FLAG_NUMBER
,
2266 NULL
, &status
, &size
, NULL
);
2267 ok(ret
, "failed to get status code %u\n", GetLastError());
2268 ok(status
== 200, "got %u\n", status
);
2272 ret
= WinHttpQueryHeaders(req
, WINHTTP_QUERY_CONTENT_LENGTH
| WINHTTP_QUERY_FLAG_NUMBER
,
2273 NULL
, &len
, &size
, 0);
2274 ok(ret
, "failed to get content-length header %u\n", GetLastError());
2275 ok(len
== 100, "got %u\n", len
);
2278 ret
= WinHttpQueryDataAvailable(req
, &count
);
2279 ok(ret
, "failed to query data available %u\n", GetLastError());
2280 ok(!count
, "got %u\n", count
);
2284 ret
= WinHttpReadData(req
, buf
, len
, &count
);
2285 ok(ret
, "failed to read data %u\n", GetLastError());
2286 ok(!count
, "got %u\n", count
);
2289 ret
= WinHttpQueryDataAvailable(req
, &count
);
2290 ok(ret
, "failed to query data available %u\n", GetLastError());
2291 ok(!count
, "got %u\n", count
);
2293 WinHttpCloseHandle(req
);
2294 WinHttpCloseHandle(con
);
2295 WinHttpCloseHandle(ses
);
2298 static void test_not_modified(int port
)
2300 static const WCHAR pathW
[] = {'/','n','o','t','_','m','o','d','i','f','i','e','d',0};
2301 static const WCHAR ifmodifiedW
[] = {'I','f','-','M','o','d','i','f','i','e','d','-','S','i','n','c','e',':',' '};
2303 HINTERNET session
, request
, connection
;
2304 DWORD status
, size
, start
= GetTickCount();
2306 WCHAR today
[(sizeof(ifmodifiedW
) + WINHTTP_TIME_FORMAT_BUFSIZE
)/sizeof(WCHAR
) + 3];
2308 memcpy(today
, ifmodifiedW
, sizeof(ifmodifiedW
));
2310 WinHttpTimeFromSystemTime(&st
, &today
[sizeof(ifmodifiedW
)/sizeof(WCHAR
)]);
2312 session
= WinHttpOpen(test_useragent
, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
,
2313 WINHTTP_NO_PROXY_NAME
, WINHTTP_NO_PROXY_BYPASS
, 0);
2314 ok(session
!= NULL
, "WinHttpOpen failed: %u\n", GetLastError());
2316 connection
= WinHttpConnect(session
, localhostW
, port
, 0);
2317 ok(connection
!= NULL
, "WinHttpConnect failed: %u\n", GetLastError());
2319 request
= WinHttpOpenRequest(connection
, NULL
, pathW
, NULL
, WINHTTP_NO_REFERER
,
2320 WINHTTP_DEFAULT_ACCEPT_TYPES
, WINHTTP_FLAG_BYPASS_PROXY_CACHE
);
2321 ok(request
!= NULL
, "WinHttpOpenrequest failed: %u\n", GetLastError());
2323 ret
= WinHttpSendRequest(request
, today
, ~0u, NULL
, 0, 0, 0);
2324 ok(ret
, "WinHttpSendRequest failed: %u\n", GetLastError());
2326 ret
= WinHttpReceiveResponse(request
, NULL
);
2327 ok(ret
, "WinHttpReceiveResponse failed: %u\n", GetLastError());
2329 size
= sizeof(status
);
2330 ret
= WinHttpQueryHeaders(request
, WINHTTP_QUERY_STATUS_CODE
|WINHTTP_QUERY_FLAG_NUMBER
,
2331 NULL
, &status
, &size
, NULL
);
2332 ok(ret
, "WinHttpQueryHeaders failed: %u\n", GetLastError());
2333 ok(status
== HTTP_STATUS_NOT_MODIFIED
, "got %u\n", status
);
2336 ret
= WinHttpQueryDataAvailable(request
, &size
);
2337 ok(ret
, "WinHttpQueryDataAvailable failed: %u\n", GetLastError());
2338 ok(!size
, "got %u\n", size
);
2340 WinHttpCloseHandle(request
);
2341 WinHttpCloseHandle(connection
);
2342 WinHttpCloseHandle(session
);
2343 start
= GetTickCount() - start
;
2344 ok(start
<= 2000, "Expected less than 2 seconds for the test, got %u ms\n", start
);
2347 static void test_bad_header( int port
)
2349 static const WCHAR bad_headerW
[] =
2350 {'C','o','n','t','e','n','t','-','T','y','p','e',':',' ',
2351 't','e','x','t','/','h','t','m','l','\n','\r',0};
2352 static const WCHAR text_htmlW
[] = {'t','e','x','t','/','h','t','m','l',0};
2353 static const WCHAR content_typeW
[] = {'C','o','n','t','e','n','t','-','T','y','p','e',0};
2355 HINTERNET ses
, con
, req
;
2359 ses
= WinHttpOpen( test_useragent
, 0, NULL
, NULL
, 0 );
2360 ok( ses
!= NULL
, "failed to open session %u\n", GetLastError() );
2362 con
= WinHttpConnect( ses
, localhostW
, port
, 0 );
2363 ok( con
!= NULL
, "failed to open a connection %u\n", GetLastError() );
2365 req
= WinHttpOpenRequest( con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0 );
2366 ok( req
!= NULL
, "failed to open a request %u\n", GetLastError() );
2368 ret
= WinHttpAddRequestHeaders( req
, bad_headerW
, ~0u, WINHTTP_ADDREQ_FLAG_ADD
);
2369 ok( ret
, "failed to add header %u\n", GetLastError() );
2373 len
= sizeof(buffer
);
2374 ret
= WinHttpQueryHeaders( req
, WINHTTP_QUERY_CUSTOM
|WINHTTP_QUERY_FLAG_REQUEST_HEADERS
,
2375 content_typeW
, buffer
, &len
, &index
);
2376 ok( ret
, "failed to query headers %u\n", GetLastError() );
2377 ok( !lstrcmpW( buffer
, text_htmlW
), "got %s\n", wine_dbgstr_w(buffer
) );
2379 WinHttpCloseHandle( req
);
2380 WinHttpCloseHandle( con
);
2381 WinHttpCloseHandle( ses
);
2384 static void test_multiple_reads(int port
)
2386 static const WCHAR bigW
[] = {'b','i','g',0};
2387 HINTERNET ses
, con
, req
;
2388 DWORD total_len
= 0;
2391 ses
= WinHttpOpen(test_useragent
, 0, NULL
, NULL
, 0);
2392 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
2394 con
= WinHttpConnect(ses
, localhostW
, port
, 0);
2395 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
2397 req
= WinHttpOpenRequest(con
, NULL
, bigW
, NULL
, NULL
, NULL
, 0);
2398 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
2400 ret
= WinHttpSendRequest(req
, NULL
, 0, NULL
, 0, 0, 0);
2401 ok(ret
, "failed to send request %u\n", GetLastError());
2403 ret
= WinHttpReceiveResponse(req
, NULL
);
2404 ok(ret
== TRUE
, "expected success\n");
2408 DWORD len
= 0xdeadbeef;
2409 ret
= WinHttpQueryDataAvailable( req
, &len
);
2410 ok( ret
, "WinHttpQueryDataAvailable failed with error %u\n", GetLastError() );
2411 if (ret
) ok( len
!= 0xdeadbeef, "WinHttpQueryDataAvailable return wrong length\n" );
2415 char *buf
= HeapAlloc( GetProcessHeap(), 0, len
+ 1 );
2417 ret
= WinHttpReadData( req
, buf
, len
, &bytes_read
);
2418 ok( len
== bytes_read
, "only got %u of %u available\n", bytes_read
, len
);
2420 HeapFree( GetProcessHeap(), 0, buf
);
2421 if (!bytes_read
) break;
2422 total_len
+= bytes_read
;
2426 ok(total_len
== BIG_BUFFER_LEN
, "got wrong length: 0x%x\n", total_len
);
2428 WinHttpCloseHandle(req
);
2429 WinHttpCloseHandle(con
);
2430 WinHttpCloseHandle(ses
);
2433 static void test_connection_info( int port
)
2435 static const WCHAR basicW
[] = {'/','b','a','s','i','c',0};
2436 HINTERNET ses
, con
, req
;
2437 WINHTTP_CONNECTION_INFO info
;
2441 ses
= WinHttpOpen( test_useragent
, 0, NULL
, NULL
, 0 );
2442 ok( ses
!= NULL
, "failed to open session %u\n", GetLastError() );
2444 con
= WinHttpConnect( ses
, localhostW
, port
, 0 );
2445 ok( con
!= NULL
, "failed to open a connection %u\n", GetLastError() );
2447 req
= WinHttpOpenRequest( con
, NULL
, basicW
, NULL
, NULL
, NULL
, 0 );
2448 ok( req
!= NULL
, "failed to open a request %u\n", GetLastError() );
2450 size
= sizeof(info
);
2451 SetLastError( 0xdeadbeef );
2452 ret
= WinHttpQueryOption( req
, WINHTTP_OPTION_CONNECTION_INFO
, &info
, &size
);
2453 error
= GetLastError();
2454 if (!ret
&& error
== ERROR_INVALID_PARAMETER
)
2456 win_skip( "WINHTTP_OPTION_CONNECTION_INFO not supported\n" );
2459 ok( !ret
, "unexpected success\n" );
2460 ok( error
== ERROR_WINHTTP_INCORRECT_HANDLE_STATE
, "got %u\n", error
);
2462 ret
= WinHttpSendRequest( req
, NULL
, 0, NULL
, 0, 0, 0 );
2463 ok( ret
, "failed to send request %u\n", GetLastError() );
2466 SetLastError( 0xdeadbeef );
2467 ret
= WinHttpQueryOption( req
, WINHTTP_OPTION_CONNECTION_INFO
, &info
, &size
);
2468 error
= GetLastError();
2469 ok( !ret
, "unexpected success\n" );
2470 ok( error
== ERROR_INSUFFICIENT_BUFFER
, "got %u\n", error
);
2472 size
= sizeof(info
);
2473 memset( &info
, 0, sizeof(info
) );
2474 ret
= WinHttpQueryOption( req
, WINHTTP_OPTION_CONNECTION_INFO
, &info
, &size
);
2475 ok( ret
, "failed to retrieve connection info %u\n", GetLastError() );
2476 ok( info
.cbSize
== sizeof(info
), "wrong size %u\n", info
.cbSize
);
2478 ret
= WinHttpReceiveResponse( req
, NULL
);
2479 ok( ret
, "failed to receive response %u\n", GetLastError() );
2481 size
= sizeof(info
);
2482 memset( &info
, 0, sizeof(info
) );
2483 ret
= WinHttpQueryOption( req
, WINHTTP_OPTION_CONNECTION_INFO
, &info
, &size
);
2484 ok( ret
, "failed to retrieve connection info %u\n", GetLastError() );
2485 ok( info
.cbSize
== sizeof(info
), "wrong size %u\n", info
.cbSize
);
2487 WinHttpCloseHandle( req
);
2488 WinHttpCloseHandle( con
);
2489 WinHttpCloseHandle( ses
);
2492 static void test_credentials(void)
2494 static WCHAR userW
[] = {'u','s','e','r',0};
2495 static WCHAR passW
[] = {'p','a','s','s',0};
2496 static WCHAR proxy_userW
[] = {'p','r','o','x','y','u','s','e','r',0};
2497 static WCHAR proxy_passW
[] = {'p','r','o','x','y','p','a','s','s',0};
2498 HINTERNET ses
, con
, req
;
2503 ses
= WinHttpOpen(test_useragent
, 0, proxy_userW
, proxy_passW
, 0);
2504 ok(ses
!= NULL
, "failed to open session %u\n", GetLastError());
2506 con
= WinHttpConnect(ses
, localhostW
, 0, 0);
2507 ok(con
!= NULL
, "failed to open a connection %u\n", GetLastError());
2509 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
2510 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
2512 size
= sizeof(buffer
)/sizeof(WCHAR
);
2513 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PROXY_USERNAME
, &buffer
, &size
);
2514 ok(ret
, "failed to query proxy username %u\n", GetLastError());
2515 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2516 ok(!size
, "expected 0, got %u\n", size
);
2518 size
= sizeof(buffer
)/sizeof(WCHAR
);
2519 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PROXY_PASSWORD
, &buffer
, &size
);
2520 ok(ret
, "failed to query proxy password %u\n", GetLastError());
2521 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2522 ok(!size
, "expected 0, got %u\n", size
);
2524 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_PROXY_USERNAME
, proxy_userW
, lstrlenW(proxy_userW
));
2525 ok(ret
, "failed to set username %u\n", GetLastError());
2527 size
= sizeof(buffer
)/sizeof(WCHAR
);
2528 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PROXY_USERNAME
, &buffer
, &size
);
2529 ok(ret
, "failed to query proxy username %u\n", GetLastError());
2530 ok(!winetest_strcmpW(buffer
, proxy_userW
), "unexpected result %s\n", wine_dbgstr_w(buffer
));
2531 ok(size
== lstrlenW(proxy_userW
) * sizeof(WCHAR
), "unexpected result %u\n", size
);
2533 size
= sizeof(buffer
)/sizeof(WCHAR
);
2534 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_USERNAME
, &buffer
, &size
);
2535 ok(ret
, "failed to query username %u\n", GetLastError());
2536 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2537 ok(!size
, "expected 0, got %u\n", size
);
2539 size
= sizeof(buffer
)/sizeof(WCHAR
);
2540 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PASSWORD
, &buffer
, &size
);
2541 ok(ret
, "failed to query password %u\n", GetLastError());
2542 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2543 ok(!size
, "expected 0, got %u\n", size
);
2545 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_PROXY_PASSWORD
, proxy_passW
, lstrlenW(proxy_passW
));
2546 ok(ret
, "failed to set proxy password %u\n", GetLastError());
2548 size
= sizeof(buffer
)/sizeof(WCHAR
);
2549 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PROXY_PASSWORD
, &buffer
, &size
);
2550 ok(ret
, "failed to query proxy password %u\n", GetLastError());
2551 ok(!winetest_strcmpW(buffer
, proxy_passW
), "unexpected result %s\n", wine_dbgstr_w(buffer
));
2552 ok(size
== lstrlenW(proxy_passW
) * sizeof(WCHAR
), "unexpected result %u\n", size
);
2554 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_USERNAME
, userW
, lstrlenW(userW
));
2555 ok(ret
, "failed to set username %u\n", GetLastError());
2557 size
= sizeof(buffer
)/sizeof(WCHAR
);
2558 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_USERNAME
, &buffer
, &size
);
2559 ok(ret
, "failed to query username %u\n", GetLastError());
2560 ok(!winetest_strcmpW(buffer
, userW
), "unexpected result %s\n", wine_dbgstr_w(buffer
));
2561 ok(size
== lstrlenW(userW
) * sizeof(WCHAR
), "unexpected result %u\n", size
);
2563 ret
= WinHttpSetOption(req
, WINHTTP_OPTION_PASSWORD
, passW
, lstrlenW(passW
));
2564 ok(ret
, "failed to set password %u\n", GetLastError());
2566 size
= sizeof(buffer
)/sizeof(WCHAR
);
2567 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PASSWORD
, &buffer
, &size
);
2568 ok(ret
, "failed to query password %u\n", GetLastError());
2569 ok(!winetest_strcmpW(buffer
, passW
), "unexpected result %s\n", wine_dbgstr_w(buffer
));
2570 ok(size
== lstrlenW(passW
) * sizeof(WCHAR
), "unexpected result %u\n", size
);
2572 WinHttpCloseHandle(req
);
2574 req
= WinHttpOpenRequest(con
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
2575 ok(req
!= NULL
, "failed to open a request %u\n", GetLastError());
2577 SetLastError(0xdeadbeef);
2578 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, userW
, NULL
, NULL
);
2579 error
= GetLastError();
2580 ok(!ret
, "expected failure\n");
2581 ok(error
== ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %u\n", error
);
2583 SetLastError(0xdeadbeef);
2584 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, NULL
, passW
, NULL
);
2585 error
= GetLastError();
2586 ok(!ret
, "expected failure\n");
2587 ok(error
== ERROR_INVALID_PARAMETER
, "expected ERROR_INVALID_PARAMETER, got %u\n", error
);
2589 ret
= WinHttpSetCredentials(req
, WINHTTP_AUTH_TARGET_SERVER
, WINHTTP_AUTH_SCHEME_BASIC
, userW
, passW
, NULL
);
2590 ok(ret
, "failed to set credentials %u\n", GetLastError());
2592 size
= sizeof(buffer
)/sizeof(WCHAR
);
2593 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_USERNAME
, &buffer
, &size
);
2594 ok(ret
, "failed to query username %u\n", GetLastError());
2596 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2597 ok(!size
, "expected 0, got %u\n", size
);
2600 size
= sizeof(buffer
)/sizeof(WCHAR
);
2601 ret
= WinHttpQueryOption(req
, WINHTTP_OPTION_PASSWORD
, &buffer
, &size
);
2602 ok(ret
, "failed to query password %u\n", GetLastError());
2604 ok(!buffer
[0], "unexpected result %s\n", wine_dbgstr_w(buffer
));
2605 ok(!size
, "expected 0, got %u\n", size
);
2608 WinHttpCloseHandle(req
);
2609 WinHttpCloseHandle(con
);
2610 WinHttpCloseHandle(ses
);
2613 static void test_IWinHttpRequest(void)
2615 static const WCHAR usernameW
[] = {'u','s','e','r','n','a','m','e',0};
2616 static const WCHAR passwordW
[] = {'p','a','s','s','w','o','r','d',0};
2617 static const WCHAR url1W
[] = {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0};
2618 static const WCHAR url2W
[] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0};
2619 static const WCHAR url3W
[] = {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.',
2620 'o','r','g','/','t','e','s','t','s','/','p','o','s','t','.','p','h','p',0};
2621 static const WCHAR method1W
[] = {'G','E','T',0};
2622 static const WCHAR method2W
[] = {'I','N','V','A','L','I','D',0};
2623 static const WCHAR method3W
[] = {'P','O','S','T',0};
2624 static const WCHAR proxy_serverW
[] = {'p','r','o','x','y','s','e','r','v','e','r',0};
2625 static const WCHAR bypas_listW
[] = {'b','y','p','a','s','s','l','i','s','t',0};
2626 static const WCHAR connectionW
[] = {'C','o','n','n','e','c','t','i','o','n',0};
2627 static const WCHAR dateW
[] = {'D','a','t','e',0};
2628 static const WCHAR test_dataW
[] = {'t','e','s','t','d','a','t','a',128,0};
2630 IWinHttpRequest
*req
;
2631 BSTR method
, url
, username
, password
, response
= NULL
, status_text
= NULL
, headers
= NULL
;
2632 BSTR date
, today
, connection
, value
= NULL
;
2633 VARIANT async
, empty
, timeout
, body
, body2
, proxy_server
, bypass_list
, data
;
2634 VARIANT_BOOL succeeded
;
2636 WCHAR todayW
[WINHTTP_TIME_FORMAT_BUFSIZE
];
2638 IStream
*stream
, *stream2
;
2643 GetSystemTime( &st
);
2644 WinHttpTimeFromSystemTime( &st
, todayW
);
2646 CoInitialize( NULL
);
2647 hr
= CoCreateInstance( &CLSID_WinHttpRequest
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWinHttpRequest
, (void **)&req
);
2648 ok( hr
== S_OK
, "got %08x\n", hr
);
2650 V_VT( &empty
) = VT_ERROR
;
2651 V_ERROR( &empty
) = 0xdeadbeef;
2653 V_VT( &async
) = VT_BOOL
;
2654 V_BOOL( &async
) = VARIANT_FALSE
;
2656 method
= SysAllocString( method3W
);
2657 url
= SysAllocString( url3W
);
2658 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
2659 ok( hr
== S_OK
, "got %08x\n", hr
);
2660 SysFreeString( method
);
2661 SysFreeString( url
);
2663 V_VT( &data
) = VT_BSTR
;
2664 V_BSTR( &data
) = SysAllocString( test_dataW
);
2665 hr
= IWinHttpRequest_Send( req
, data
);
2666 ok( hr
== S_OK
|| broken(hr
== HRESULT_FROM_WIN32(ERROR_WINHTTP_INVALID_SERVER_RESPONSE
)),
2668 SysFreeString( V_BSTR( &data
) );
2670 hr
= IWinHttpRequest_Open( req
, NULL
, NULL
, empty
);
2671 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2673 method
= SysAllocString( method1W
);
2674 hr
= IWinHttpRequest_Open( req
, method
, NULL
, empty
);
2675 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2677 hr
= IWinHttpRequest_Open( req
, method
, NULL
, async
);
2678 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2680 url
= SysAllocString( url1W
);
2681 hr
= IWinHttpRequest_Open( req
, NULL
, url
, empty
);
2682 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2684 hr
= IWinHttpRequest_Abort( req
);
2685 ok( hr
== S_OK
, "got %08x\n", hr
);
2687 hr
= IWinHttpRequest_Open( req
, method
, url
, empty
);
2688 ok( hr
== S_OK
, "got %08x\n", hr
);
2690 hr
= IWinHttpRequest_Abort( req
);
2691 ok( hr
== S_OK
, "got %08x\n", hr
);
2693 IWinHttpRequest_Release( req
);
2695 hr
= CoCreateInstance( &CLSID_WinHttpRequest
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWinHttpRequest
, (void **)&req
);
2696 ok( hr
== S_OK
, "got %08x\n", hr
);
2698 SysFreeString( url
);
2699 url
= SysAllocString( url2W
);
2700 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
2701 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_UNRECOGNIZED_SCHEME
), "got %08x\n", hr
);
2703 SysFreeString( method
);
2704 method
= SysAllocString( method2W
);
2705 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
2706 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_UNRECOGNIZED_SCHEME
), "got %08x\n", hr
);
2708 SysFreeString( method
);
2709 method
= SysAllocString( method1W
);
2710 SysFreeString( url
);
2711 url
= SysAllocString( url1W
);
2712 V_VT( &async
) = VT_ERROR
;
2713 V_ERROR( &async
) = DISP_E_PARAMNOTFOUND
;
2714 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
2715 ok( hr
== S_OK
, "got %08x\n", hr
);
2717 hr
= IWinHttpRequest_Abort( req
);
2718 ok( hr
== S_OK
, "got %08x\n", hr
);
2720 hr
= IWinHttpRequest_Send( req
, empty
);
2721 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN
), "got %08x\n", hr
);
2723 hr
= IWinHttpRequest_Abort( req
);
2724 ok( hr
== S_OK
, "got %08x\n", hr
);
2726 IWinHttpRequest_Release( req
);
2728 hr
= CoCreateInstance( &CLSID_WinHttpRequest
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWinHttpRequest
, (void **)&req
);
2729 ok( hr
== S_OK
, "got %08x\n", hr
);
2731 hr
= IWinHttpRequest_get_ResponseText( req
, NULL
);
2732 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2734 hr
= IWinHttpRequest_get_ResponseText( req
, &response
);
2735 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2737 hr
= IWinHttpRequest_get_Status( req
, NULL
);
2738 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2740 hr
= IWinHttpRequest_get_Status( req
, &status
);
2741 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2743 hr
= IWinHttpRequest_get_StatusText( req
, NULL
);
2744 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2746 hr
= IWinHttpRequest_get_StatusText( req
, &status_text
);
2747 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2749 hr
= IWinHttpRequest_get_ResponseBody( req
, NULL
);
2750 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2752 hr
= IWinHttpRequest_SetTimeouts( req
, 10000, 10000, 10000, 10000 );
2753 ok( hr
== S_OK
, "got %08x\n", hr
);
2755 hr
= IWinHttpRequest_SetCredentials( req
, NULL
, NULL
, 0xdeadbeef );
2756 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN
), "got %08x\n", hr
);
2758 VariantInit( &proxy_server
);
2759 V_VT( &proxy_server
) = VT_ERROR
;
2760 VariantInit( &bypass_list
);
2761 V_VT( &bypass_list
) = VT_ERROR
;
2762 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2763 ok( hr
== S_OK
, "got %08x\n", hr
);
2765 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_PROXY
, proxy_server
, bypass_list
);
2766 ok( hr
== S_OK
, "got %08x\n", hr
);
2768 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2769 ok( hr
== S_OK
, "got %08x\n", hr
);
2771 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, NULL
);
2772 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2774 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, &headers
);
2775 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2777 hr
= IWinHttpRequest_GetResponseHeader( req
, NULL
, NULL
);
2778 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2780 connection
= SysAllocString( connectionW
);
2781 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, NULL
);
2782 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2784 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, &value
);
2785 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2787 hr
= IWinHttpRequest_SetRequestHeader( req
, NULL
, NULL
);
2788 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2790 date
= SysAllocString( dateW
);
2791 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, NULL
);
2792 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN
), "got %08x\n", hr
);
2794 today
= SysAllocString( todayW
);
2795 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, today
);
2796 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN
), "got %08x\n", hr
);
2798 hr
= IWinHttpRequest_SetAutoLogonPolicy( req
, 0xdeadbeef );
2799 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2801 hr
= IWinHttpRequest_SetAutoLogonPolicy( req
, AutoLogonPolicy_OnlyIfBypassProxy
);
2802 ok( hr
== S_OK
, "got %08x\n", hr
);
2804 SysFreeString( method
);
2805 method
= SysAllocString( method1W
);
2806 SysFreeString( url
);
2807 url
= SysAllocString( url1W
);
2808 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
2809 ok( hr
== S_OK
, "got %08x\n", hr
);
2811 hr
= IWinHttpRequest_get_ResponseText( req
, NULL
);
2812 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2814 hr
= IWinHttpRequest_get_ResponseText( req
, &response
);
2815 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2817 hr
= IWinHttpRequest_get_Status( req
, &status
);
2818 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2820 hr
= IWinHttpRequest_get_StatusText( req
, &status_text
);
2821 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2823 hr
= IWinHttpRequest_get_ResponseBody( req
, NULL
);
2824 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2826 hr
= IWinHttpRequest_SetTimeouts( req
, 10000, 10000, 10000, 10000 );
2827 ok( hr
== S_OK
, "got %08x\n", hr
);
2829 hr
= IWinHttpRequest_SetCredentials( req
, NULL
, NULL
, 0xdeadbeef );
2830 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2832 username
= SysAllocString( usernameW
);
2833 hr
= IWinHttpRequest_SetCredentials( req
, username
, NULL
, 0xdeadbeef );
2834 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2836 password
= SysAllocString( passwordW
);
2837 hr
= IWinHttpRequest_SetCredentials( req
, NULL
, password
, 0xdeadbeef );
2838 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2840 hr
= IWinHttpRequest_SetCredentials( req
, username
, password
, 0xdeadbeef );
2841 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2843 hr
= IWinHttpRequest_SetCredentials( req
, NULL
, password
, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
);
2844 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2846 hr
= IWinHttpRequest_SetCredentials( req
, username
, password
, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
);
2847 ok( hr
== S_OK
, "got %08x\n", hr
);
2849 V_VT( &proxy_server
) = VT_BSTR
;
2850 V_BSTR( &proxy_server
) = SysAllocString( proxy_serverW
);
2851 V_VT( &bypass_list
) = VT_BSTR
;
2852 V_BSTR( &bypass_list
) = SysAllocString( bypas_listW
);
2853 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_PROXY
, proxy_server
, bypass_list
);
2854 ok( hr
== S_OK
, "got %08x\n", hr
);
2856 hr
= IWinHttpRequest_SetProxy( req
, 0xdeadbeef, proxy_server
, bypass_list
);
2857 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2859 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2860 ok( hr
== S_OK
, "got %08x\n", hr
);
2862 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, &headers
);
2863 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2865 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, &value
);
2866 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
), "got %08x\n", hr
);
2868 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, today
);
2869 ok( hr
== S_OK
, "got %08x\n", hr
);
2871 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, NULL
);
2872 ok( hr
== S_OK
, "got %08x\n", hr
);
2874 hr
= IWinHttpRequest_SetAutoLogonPolicy( req
, AutoLogonPolicy_OnlyIfBypassProxy
);
2875 ok( hr
== S_OK
, "got %08x\n", hr
);
2877 hr
= IWinHttpRequest_Send( req
, empty
);
2878 ok( hr
== S_OK
, "got %08x\n", hr
);
2880 hr
= IWinHttpRequest_Send( req
, empty
);
2881 ok( hr
== S_OK
, "got %08x\n", hr
);
2883 hr
= IWinHttpRequest_get_ResponseText( req
, NULL
);
2884 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2886 hr
= IWinHttpRequest_get_ResponseText( req
, &response
);
2887 ok( hr
== S_OK
, "got %08x\n", hr
);
2888 SysFreeString( response
);
2890 hr
= IWinHttpRequest_get_Status( req
, NULL
);
2891 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2894 hr
= IWinHttpRequest_get_Status( req
, &status
);
2895 ok( hr
== S_OK
, "got %08x\n", hr
);
2896 trace("Status=%d\n", status
);
2898 hr
= IWinHttpRequest_get_StatusText( req
, NULL
);
2899 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2901 hr
= IWinHttpRequest_get_StatusText( req
, &status_text
);
2902 ok( hr
== S_OK
, "got %08x\n", hr
);
2903 trace("StatusText=%s\n", wine_dbgstr_w(status_text
));
2904 SysFreeString( status_text
);
2906 hr
= IWinHttpRequest_get_ResponseBody( req
, NULL
);
2907 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2909 hr
= IWinHttpRequest_SetCredentials( req
, username
, password
, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
);
2910 ok( hr
== S_OK
, "got %08x\n", hr
);
2912 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_PROXY
, proxy_server
, bypass_list
);
2913 ok( hr
== S_OK
, "got %08x\n", hr
);
2915 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2916 ok( hr
== S_OK
, "got %08x\n", hr
);
2918 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, NULL
);
2919 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2921 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, &headers
);
2922 ok( hr
== S_OK
, "got %08x\n", hr
);
2923 SysFreeString( headers
);
2925 hr
= IWinHttpRequest_GetResponseHeader( req
, NULL
, NULL
);
2926 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2928 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, NULL
);
2929 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2931 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, &value
);
2932 ok( hr
== S_OK
, "got %08x\n", hr
);
2933 SysFreeString( value
);
2935 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, today
);
2936 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_AFTER_SEND
), "got %08x\n", hr
);
2938 hr
= IWinHttpRequest_SetAutoLogonPolicy( req
, AutoLogonPolicy_OnlyIfBypassProxy
);
2939 ok( hr
== S_OK
, "got %08x\n", hr
);
2941 VariantInit( &timeout
);
2942 V_VT( &timeout
) = VT_I4
;
2943 V_I4( &timeout
) = 10;
2944 hr
= IWinHttpRequest_WaitForResponse( req
, timeout
, &succeeded
);
2945 ok( hr
== S_OK
, "got %08x\n", hr
);
2947 hr
= IWinHttpRequest_get_Status( req
, &status
);
2948 ok( hr
== S_OK
, "got %08x\n", hr
);
2950 hr
= IWinHttpRequest_get_StatusText( req
, &status_text
);
2951 ok( hr
== S_OK
, "got %08x\n", hr
);
2952 SysFreeString( status_text
);
2954 hr
= IWinHttpRequest_SetCredentials( req
, username
, password
, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
);
2955 ok( hr
== S_OK
, "got %08x\n", hr
);
2957 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_PROXY
, proxy_server
, bypass_list
);
2958 ok( hr
== S_OK
, "got %08x\n", hr
);
2960 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
2961 ok( hr
== S_OK
, "got %08x\n", hr
);
2963 hr
= IWinHttpRequest_Send( req
, empty
);
2964 ok( hr
== S_OK
, "got %08x\n", hr
);
2966 hr
= IWinHttpRequest_get_ResponseText( req
, NULL
);
2967 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2969 hr
= IWinHttpRequest_get_ResponseText( req
, &response
);
2970 ok( hr
== S_OK
, "got %08x\n", hr
);
2971 SysFreeString( response
);
2973 hr
= IWinHttpRequest_get_ResponseBody( req
, NULL
);
2974 ok( hr
== E_INVALIDARG
, "got %08x\n", hr
);
2976 VariantInit( &body
);
2977 V_VT( &body
) = VT_ERROR
;
2978 hr
= IWinHttpRequest_get_ResponseBody( req
, &body
);
2979 ok( hr
== S_OK
, "got %08x\n", hr
);
2980 ok( V_VT( &body
) == (VT_ARRAY
|VT_UI1
), "got %08x\n", V_VT( &body
) );
2982 hr
= VariantClear( &body
);
2983 ok( hr
== S_OK
, "got %08x\n", hr
);
2985 VariantInit( &body
);
2986 V_VT( &body
) = VT_ERROR
;
2987 hr
= IWinHttpRequest_get_ResponseStream( req
, &body
);
2988 ok( hr
== S_OK
, "got %08x\n", hr
);
2989 ok( V_VT( &body
) == VT_UNKNOWN
, "got %08x\n", V_VT( &body
) );
2991 hr
= IUnknown_QueryInterface( V_UNKNOWN( &body
), &IID_IStream
, (void **)&stream
);
2992 ok( hr
== S_OK
, "got %08x\n", hr
);
2993 ok( V_UNKNOWN( &body
) == (IUnknown
*)stream
, "got different interface pointer\n" );
2997 hr
= IStream_Read( stream
, buf
, 128, &count
);
2998 ok( hr
== S_OK
, "got %08x\n", hr
);
2999 ok( count
!= 0xdeadbeef, "count not set\n" );
3000 ok( buf
[0], "no data\n" );
3002 VariantInit( &body2
);
3003 V_VT( &body2
) = VT_ERROR
;
3004 hr
= IWinHttpRequest_get_ResponseStream( req
, &body2
);
3005 ok( hr
== S_OK
, "got %08x\n", hr
);
3006 ok( V_VT( &body2
) == VT_UNKNOWN
, "got %08x\n", V_VT( &body2
) );
3007 ok( V_UNKNOWN( &body
) != V_UNKNOWN( &body2
), "got same interface pointer\n" );
3009 hr
= IUnknown_QueryInterface( V_UNKNOWN( &body2
), &IID_IStream
, (void **)&stream2
);
3010 ok( hr
== S_OK
, "got %08x\n", hr
);
3011 ok( V_UNKNOWN( &body2
) == (IUnknown
*)stream2
, "got different interface pointer\n" );
3012 IStream_Release( stream2
);
3014 hr
= VariantClear( &body
);
3015 ok( hr
== S_OK
, "got %08x\n", hr
);
3017 hr
= VariantClear( &body2
);
3018 ok( hr
== S_OK
, "got %08x\n", hr
);
3020 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_PROXY
, proxy_server
, bypass_list
);
3021 ok( hr
== S_OK
, "got %08x\n", hr
);
3023 hr
= IWinHttpRequest_SetProxy( req
, HTTPREQUEST_PROXYSETTING_DIRECT
, proxy_server
, bypass_list
);
3024 ok( hr
== S_OK
, "got %08x\n", hr
);
3026 hr
= IWinHttpRequest_GetAllResponseHeaders( req
, &headers
);
3027 ok( hr
== S_OK
, "got %08x\n", hr
);
3028 SysFreeString( headers
);
3030 hr
= IWinHttpRequest_GetResponseHeader( req
, connection
, &value
);
3031 ok( hr
== S_OK
, "got %08x\n", hr
);
3032 SysFreeString( value
);
3034 hr
= IWinHttpRequest_SetRequestHeader( req
, date
, today
);
3035 ok( hr
== HRESULT_FROM_WIN32( ERROR_WINHTTP_CANNOT_CALL_AFTER_SEND
), "got %08x\n", hr
);
3037 hr
= IWinHttpRequest_SetAutoLogonPolicy( req
, AutoLogonPolicy_OnlyIfBypassProxy
);
3038 ok( hr
== S_OK
, "got %08x\n", hr
);
3040 hr
= IWinHttpRequest_Send( req
, empty
);
3041 ok( hr
== S_OK
, "got %08x\n", hr
);
3043 hr
= IWinHttpRequest_Abort( req
);
3044 ok( hr
== S_OK
, "got %08x\n", hr
);
3046 hr
= IWinHttpRequest_Abort( req
);
3047 ok( hr
== S_OK
, "got %08x\n", hr
);
3049 IWinHttpRequest_Release( req
);
3052 IStream_Seek( stream
, pos
, STREAM_SEEK_SET
, NULL
);
3053 ok( hr
== S_OK
, "got %08x\n", hr
);
3057 hr
= IStream_Read( stream
, buf
, 128, &count
);
3058 ok( hr
== S_OK
, "got %08x\n", hr
);
3059 ok( count
!= 0xdeadbeef, "count not set\n" );
3060 ok( buf
[0], "no data\n" );
3061 IStream_Release( stream
);
3063 hr
= CoCreateInstance( &CLSID_WinHttpRequest
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWinHttpRequest
, (void **)&req
);
3064 ok( hr
== S_OK
, "got %08x\n", hr
);
3066 V_VT( &async
) = VT_I4
;
3068 hr
= IWinHttpRequest_Open( req
, method
, url
, async
);
3069 ok( hr
== S_OK
, "got %08x\n", hr
);
3071 hr
= IWinHttpRequest_Send( req
, empty
);
3072 ok( hr
== S_OK
, "got %08x\n", hr
);
3074 hr
= IWinHttpRequest_WaitForResponse( req
, timeout
, &succeeded
);
3075 ok( hr
== S_OK
, "got %08x\n", hr
);
3077 IWinHttpRequest_Release( req
);
3079 SysFreeString( method
);
3080 SysFreeString( url
);
3081 SysFreeString( username
);
3082 SysFreeString( password
);
3083 SysFreeString( connection
);
3084 SysFreeString( date
);
3085 SysFreeString( today
);
3086 VariantClear( &proxy_server
);
3087 VariantClear( &bypass_list
);
3091 static void test_WinHttpDetectAutoProxyConfigUrl(void)
3097 if (0) /* crashes on some win2k systems */
3099 SetLastError(0xdeadbeef);
3100 ret
= WinHttpDetectAutoProxyConfigUrl( 0, NULL
);
3101 error
= GetLastError();
3102 ok( !ret
, "expected failure\n" );
3103 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3106 SetLastError(0xdeadbeef);
3107 ret
= WinHttpDetectAutoProxyConfigUrl( 0, &url
);
3108 error
= GetLastError();
3109 ok( !ret
, "expected failure\n" );
3110 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3112 if (0) /* crashes on some win2k systems */
3114 SetLastError(0xdeadbeef);
3115 ret
= WinHttpDetectAutoProxyConfigUrl( WINHTTP_AUTO_DETECT_TYPE_DNS_A
, NULL
);
3116 error
= GetLastError();
3117 ok( !ret
, "expected failure\n" );
3118 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3120 url
= (WCHAR
*)0xdeadbeef;
3121 SetLastError(0xdeadbeef);
3122 ret
= WinHttpDetectAutoProxyConfigUrl( WINHTTP_AUTO_DETECT_TYPE_DNS_A
, &url
);
3123 error
= GetLastError();
3126 ok( error
== ERROR_WINHTTP_AUTODETECTION_FAILED
, "got %u\n", error
);
3127 ok( !url
|| broken(url
== (WCHAR
*)0xdeadbeef), "got %p\n", url
);
3131 trace("%s\n", wine_dbgstr_w(url
));
3135 url
= (WCHAR
*)0xdeadbeef;
3136 SetLastError(0xdeadbeef);
3137 ret
= WinHttpDetectAutoProxyConfigUrl( WINHTTP_AUTO_DETECT_TYPE_DHCP
, &url
);
3138 error
= GetLastError();
3141 ok( error
== ERROR_WINHTTP_AUTODETECTION_FAILED
, "got %u\n", error
);
3142 ok( !url
|| broken(url
== (WCHAR
*)0xdeadbeef), "got %p\n", url
);
3146 trace("%s\n", wine_dbgstr_w(url
));
3151 static void test_WinHttpGetIEProxyConfigForCurrentUser(void)
3155 WINHTTP_CURRENT_USER_IE_PROXY_CONFIG cfg
;
3157 memset( &cfg
, 0, sizeof(cfg
) );
3159 SetLastError(0xdeadbeef);
3160 ret
= WinHttpGetIEProxyConfigForCurrentUser( NULL
);
3161 error
= GetLastError();
3162 ok( !ret
, "expected failure\n" );
3163 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3165 ret
= WinHttpGetIEProxyConfigForCurrentUser( &cfg
);
3166 ok( ret
, "expected success\n" );
3167 trace("IEProxy.AutoDetect=%d\n", cfg
.fAutoDetect
);
3168 trace("IEProxy.AutoConfigUrl=%s\n", wine_dbgstr_w(cfg
.lpszAutoConfigUrl
));
3169 trace("IEProxy.Proxy=%s\n", wine_dbgstr_w(cfg
.lpszProxy
));
3170 trace("IEProxy.ProxyBypass=%s\n", wine_dbgstr_w(cfg
.lpszProxyBypass
));
3171 GlobalFree( cfg
.lpszAutoConfigUrl
);
3172 GlobalFree( cfg
.lpszProxy
);
3173 GlobalFree( cfg
.lpszProxyBypass
);
3176 static void test_WinHttpGetProxyForUrl(void)
3178 static const WCHAR urlW
[] = {'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0};
3179 static const WCHAR wpadW
[] = {'h','t','t','p',':','/','/','w','p','a','d','/','w','p','a','d','.','d','a','t',0};
3180 static const WCHAR emptyW
[] = {0};
3184 WINHTTP_AUTOPROXY_OPTIONS options
;
3185 WINHTTP_PROXY_INFO info
;
3187 memset( &options
, 0, sizeof(options
) );
3189 SetLastError(0xdeadbeef);
3190 ret
= WinHttpGetProxyForUrl( NULL
, NULL
, NULL
, NULL
);
3191 error
= GetLastError();
3192 ok( !ret
, "expected failure\n" );
3193 ok( error
== ERROR_INVALID_HANDLE
, "got %u\n", error
);
3195 session
= WinHttpOpen( test_useragent
, 0, NULL
, NULL
, 0 );
3196 ok( session
!= NULL
, "failed to open session %u\n", GetLastError() );
3198 SetLastError(0xdeadbeef);
3199 ret
= WinHttpGetProxyForUrl( session
, NULL
, NULL
, NULL
);
3200 error
= GetLastError();
3201 ok( !ret
, "expected failure\n" );
3202 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3204 SetLastError(0xdeadbeef);
3205 ret
= WinHttpGetProxyForUrl( session
, emptyW
, NULL
, NULL
);
3206 error
= GetLastError();
3207 ok( !ret
, "expected failure\n" );
3208 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3210 SetLastError(0xdeadbeef);
3211 ret
= WinHttpGetProxyForUrl( session
, urlW
, NULL
, NULL
);
3212 error
= GetLastError();
3213 ok( !ret
, "expected failure\n" );
3214 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3216 SetLastError(0xdeadbeef);
3217 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, &info
);
3218 error
= GetLastError();
3219 ok( !ret
, "expected failure\n" );
3220 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3222 options
.dwFlags
= WINHTTP_AUTOPROXY_AUTO_DETECT
;
3223 options
.dwAutoDetectFlags
= WINHTTP_AUTO_DETECT_TYPE_DNS_A
;
3225 SetLastError(0xdeadbeef);
3226 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, NULL
);
3227 error
= GetLastError();
3228 ok( !ret
, "expected failure\n" );
3229 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3231 options
.dwFlags
= WINHTTP_AUTOPROXY_AUTO_DETECT
;
3232 options
.dwAutoDetectFlags
= 0;
3234 SetLastError(0xdeadbeef);
3235 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, &info
);
3236 error
= GetLastError();
3237 ok( !ret
, "expected failure\n" );
3238 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3240 options
.dwFlags
= WINHTTP_AUTOPROXY_AUTO_DETECT
| WINHTTP_AUTOPROXY_CONFIG_URL
;
3241 options
.dwAutoDetectFlags
= WINHTTP_AUTO_DETECT_TYPE_DNS_A
;
3243 SetLastError(0xdeadbeef);
3244 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, &info
);
3245 error
= GetLastError();
3246 ok( !ret
, "expected failure\n" );
3247 ok( error
== ERROR_INVALID_PARAMETER
, "got %u\n", error
);
3249 options
.dwFlags
= WINHTTP_AUTOPROXY_AUTO_DETECT
;
3250 options
.dwAutoDetectFlags
= WINHTTP_AUTO_DETECT_TYPE_DNS_A
;
3252 memset( &info
, 0, sizeof(info
) );
3253 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, &info
);
3256 trace("Proxy.AccessType=%u\n", info
.dwAccessType
);
3257 trace("Proxy.Proxy=%s\n", wine_dbgstr_w(info
.lpszProxy
));
3258 trace("Proxy.ProxyBypass=%s\n", wine_dbgstr_w(info
.lpszProxyBypass
));
3259 GlobalFree( info
.lpszProxy
);
3260 GlobalFree( info
.lpszProxyBypass
);
3263 options
.dwFlags
= WINHTTP_AUTOPROXY_CONFIG_URL
;
3264 options
.dwAutoDetectFlags
= 0;
3265 options
.lpszAutoConfigUrl
= wpadW
;
3267 memset( &info
, 0, sizeof(info
) );
3268 ret
= WinHttpGetProxyForUrl( session
, urlW
, &options
, &info
);
3271 trace("Proxy.AccessType=%u\n", info
.dwAccessType
);
3272 trace("Proxy.Proxy=%s\n", wine_dbgstr_w(info
.lpszProxy
));
3273 trace("Proxy.ProxyBypass=%s\n", wine_dbgstr_w(info
.lpszProxyBypass
));
3274 GlobalFree( info
.lpszProxy
);
3275 GlobalFree( info
.lpszProxyBypass
);
3277 WinHttpCloseHandle( session
);
3280 static void test_chunked_read(void)
3282 static const WCHAR verb
[] = {'/','t','e','s','t','c','h','u','n','k','e','d',0};
3283 static const WCHAR chunked
[] = {'c','h','u','n','k','e','d',0};
3286 HINTERNET ses
, con
= NULL
, req
= NULL
;
3289 trace( "starting chunked read test\n" );
3291 ses
= WinHttpOpen( test_useragent
, 0, NULL
, NULL
, 0 );
3292 ok( ses
!= NULL
, "WinHttpOpen failed with error %u\n", GetLastError() );
3293 if (!ses
) goto done
;
3295 con
= WinHttpConnect( ses
, test_winehq
, 0, 0 );
3296 ok( con
!= NULL
, "WinHttpConnect failed with error %u\n", GetLastError() );
3297 if (!con
) goto done
;
3299 req
= WinHttpOpenRequest( con
, NULL
, verb
, NULL
, NULL
, NULL
, 0 );
3300 ok( req
!= NULL
, "WinHttpOpenRequest failed with error %u\n", GetLastError() );
3301 if (!req
) goto done
;
3303 ret
= WinHttpSendRequest( req
, NULL
, 0, NULL
, 0, 0, 0 );
3304 if (!ret
&& GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT
)
3306 skip("connection failed, skipping\n");
3309 ok( ret
, "WinHttpSendRequest failed with error %u\n", GetLastError() );
3311 ret
= WinHttpReceiveResponse( req
, NULL
);
3312 ok( ret
, "WinHttpReceiveResponse failed with error %u\n", GetLastError() );
3315 len
= sizeof(header
);
3316 ret
= WinHttpQueryHeaders( req
, WINHTTP_QUERY_TRANSFER_ENCODING
, NULL
, header
, &len
, 0 );
3317 ok( ret
, "failed to get TRANSFER_ENCODING header (error %u)\n", GetLastError() );
3318 ok( !lstrcmpW( header
, chunked
), "wrong transfer encoding %s\n", wine_dbgstr_w(header
) );
3319 trace( "transfer encoding: %s\n", wine_dbgstr_w(header
) );
3322 len
= sizeof(header
);
3323 SetLastError( 0xdeadbeef );
3324 ret
= WinHttpQueryHeaders( req
, WINHTTP_QUERY_CONTENT_LENGTH
, NULL
, &header
, &len
, 0 );
3325 ok( !ret
, "unexpected CONTENT_LENGTH header %s\n", wine_dbgstr_w(header
) );
3326 ok( GetLastError() == ERROR_WINHTTP_HEADER_NOT_FOUND
, "wrong error %u\n", GetLastError() );
3328 trace( "entering query loop\n" );
3332 ret
= WinHttpQueryDataAvailable( req
, &len
);
3333 ok( ret
, "WinHttpQueryDataAvailable failed with error %u\n", GetLastError() );
3334 if (ret
) ok( len
!= 0xdeadbeef, "WinHttpQueryDataAvailable return wrong length\n" );
3335 trace( "got %u available\n", len
);
3339 char *buf
= HeapAlloc( GetProcessHeap(), 0, len
+ 1 );
3341 ret
= WinHttpReadData( req
, buf
, len
, &bytes_read
);
3343 buf
[bytes_read
] = 0;
3344 trace( "WinHttpReadData -> %d %u\n", ret
, bytes_read
);
3345 ok( len
== bytes_read
, "only got %u of %u available\n", bytes_read
, len
);
3346 ok( buf
[bytes_read
- 1] == '\n', "received partial line '%s'\n", buf
);
3348 HeapFree( GetProcessHeap(), 0, buf
);
3349 if (!bytes_read
) break;
3356 if (req
) WinHttpCloseHandle( req
);
3357 if (con
) WinHttpCloseHandle( con
);
3358 if (ses
) WinHttpCloseHandle( ses
);
3361 START_TEST (winhttp
)
3363 static const WCHAR basicW
[] = {'/','b','a','s','i','c',0};
3364 static const WCHAR quitW
[] = {'/','q','u','i','t',0};
3365 struct server_info si
;
3371 test_WinHttpTimeFromSystemTime();
3372 test_WinHttpTimeToSystemTime();
3373 test_WinHttpAddHeaders();
3374 test_secure_connection();
3375 test_request_parameter_defaults();
3377 test_set_default_proxy_config();
3378 test_empty_headers_param();
3380 test_resolve_timeout();
3382 test_IWinHttpRequest();
3383 test_WinHttpDetectAutoProxyConfigUrl();
3384 test_WinHttpGetIEProxyConfigForCurrentUser();
3385 test_WinHttpGetProxyForUrl();
3386 test_chunked_read();
3388 si
.event
= CreateEventW(NULL
, 0, 0, NULL
);
3391 thread
= CreateThread(NULL
, 0, server_thread
, (LPVOID
)&si
, 0, NULL
);
3392 ok(thread
!= NULL
, "failed to create thread %u\n", GetLastError());
3394 ret
= WaitForSingleObject(si
.event
, 10000);
3395 ok(ret
== WAIT_OBJECT_0
, "failed to start winhttp test server %u\n", GetLastError());
3396 if (ret
!= WAIT_OBJECT_0
)
3399 test_connection_info(si
.port
);
3400 test_basic_request(si
.port
, NULL
, basicW
);
3401 test_no_headers(si
.port
);
3402 test_no_content(si
.port
);
3403 test_head_request(si
.port
);
3404 test_not_modified(si
.port
);
3405 test_basic_authentication(si
.port
);
3406 test_bad_header(si
.port
);
3407 test_multiple_reads(si
.port
);
3409 /* send the basic request again to shutdown the server thread */
3410 test_basic_request(si
.port
, NULL
, quitW
);
3412 WaitForSingleObject(thread
, 3000);