push cc8bc80451cc24f4d7cf75168b569f0ebfe19547
[wine/hacks.git] / dlls / winhttp / tests / winhttp.c
blob74e1c9a12ec541ce67579669ed534ab458a348e7
1 /*
2 * WinHTTP - tests
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 #include <stdarg.h>
22 #include <stdlib.h>
23 #include <windef.h>
24 #include <winbase.h>
25 #include <winhttp.h>
26 #include <wincrypt.h>
28 #include "wine/test.h"
30 static const WCHAR test_useragent[] =
31 {'W','i','n','e',' ','R','e','g','r','e','s','s','i','o','n',' ','T','e','s','t',0};
32 static const WCHAR test_server[] = {'w','i','n','e','h','q','.','o','r','g',0};
34 static void test_QueryOption(void)
36 BOOL ret;
37 HINTERNET session, request, connection;
38 DWORD feature, size;
40 SetLastError(0xdeadbeef);
41 session = WinHttpOpen(test_useragent, 0, 0, 0, 0);
42 ok(session != NULL, "WinHttpOpen failed to open session, error %u\n", GetLastError());
44 SetLastError(0xdeadbeef);
45 ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, NULL, NULL);
46 ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
47 ok(GetLastError() == ERROR_INVALID_PARAMETER,
48 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
50 size = 0xdeadbeef;
51 SetLastError(0xdeadbeef);
52 ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, NULL, &size);
53 ok(!ret, "should fail to query option\n");
54 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
55 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
56 ok(size == 4, "expected 4, got %u\n", size);
58 feature = 0xdeadbeef;
59 size = sizeof(feature) - 1;
60 SetLastError(0xdeadbeef);
61 ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size);
62 ok(!ret, "should fail to query option\n");
63 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
64 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
65 ok(size == 4, "expected 4, got %u\n", size);
67 feature = 0xdeadbeef;
68 size = sizeof(feature) + 1;
69 SetLastError(0xdeadbeef);
70 ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size);
71 ok(ret, "failed to query option %u\n", GetLastError());
72 ok(size == sizeof(feature), "WinHttpQueryOption should set the size: %u\n", size);
73 ok(feature == WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP,
74 "expected WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, got %#x\n", feature);
76 SetLastError(0xdeadbeef);
77 ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, NULL, sizeof(feature));
78 ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
79 ok(GetLastError() == ERROR_INVALID_PARAMETER,
80 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
82 feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS;
83 SetLastError(0xdeadbeef);
84 ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, sizeof(feature) - 1);
85 ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
86 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
87 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
89 feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS;
90 SetLastError(0xdeadbeef);
91 ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, sizeof(feature) + 1);
92 ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
93 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
94 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
96 feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS;
97 SetLastError(0xdeadbeef);
98 ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, sizeof(feature));
99 ok(ret, "failed to set redirect policy %u\n", GetLastError());
101 feature = 0xdeadbeef;
102 size = sizeof(feature);
103 SetLastError(0xdeadbeef);
104 ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size);
105 ok(ret, "failed to query option %u\n", GetLastError());
106 ok(feature == WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS,
107 "expected WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS, got %#x\n", feature);
109 feature = WINHTTP_DISABLE_COOKIES;
110 SetLastError(0xdeadbeef);
111 ret = WinHttpSetOption(session, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature));
112 ok(!ret, "should fail to set disable feature for a session\n");
113 ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE,
114 "expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError());
116 SetLastError(0xdeadbeef);
117 connection = WinHttpConnect(session, test_server, INTERNET_DEFAULT_HTTP_PORT, 0);
118 ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u\n", GetLastError());
120 feature = WINHTTP_DISABLE_COOKIES;
121 SetLastError(0xdeadbeef);
122 ret = WinHttpSetOption(connection, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature));
123 ok(!ret, "should fail to set disable feature for a connection\n");
124 ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE,
125 "expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError());
127 SetLastError(0xdeadbeef);
128 request = WinHttpOpenRequest(connection, NULL, NULL, NULL, WINHTTP_NO_REFERER,
129 WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
130 if (request == NULL && GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED)
132 skip("Network unreachable, skipping the test\n");
133 goto done;
136 feature = 0xdeadbeef;
137 size = sizeof(feature);
138 SetLastError(0xdeadbeef);
139 ret = WinHttpQueryOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, &size);
140 ok(!ret, "should fail to query disable feature for a request\n");
141 ok(GetLastError() == ERROR_INVALID_PARAMETER,
142 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
144 feature = 0;
145 size = sizeof(feature);
146 SetLastError(0xdeadbeef);
147 ret = WinHttpSetOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature));
148 ok(ret, "failed to set feature %u\n", GetLastError());
150 feature = 0xffffffff;
151 size = sizeof(feature);
152 SetLastError(0xdeadbeef);
153 ret = WinHttpSetOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature));
154 ok(ret, "failed to set feature %u\n", GetLastError());
156 feature = WINHTTP_DISABLE_COOKIES;
157 size = sizeof(feature);
158 SetLastError(0xdeadbeef);
159 ret = WinHttpSetOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature));
160 ok(ret, "failed to set feature %u\n", GetLastError());
162 size = 0;
163 SetLastError(0xdeadbeef);
164 ret = WinHttpQueryOption(request, WINHTTP_OPTION_DISABLE_FEATURE, NULL, &size);
165 ok(!ret, "should fail to query disable feature for a request\n");
166 ok(GetLastError() == ERROR_INVALID_PARAMETER,
167 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
169 SetLastError(0xdeadbeef);
170 ret = WinHttpCloseHandle(request);
171 ok(ret, "WinHttpCloseHandle failed on closing request: %u\n", GetLastError());
173 done:
174 SetLastError(0xdeadbeef);
175 ret = WinHttpCloseHandle(connection);
176 ok(ret, "WinHttpCloseHandle failed on closing connection: %u\n", GetLastError());
177 SetLastError(0xdeadbeef);
178 ret = WinHttpCloseHandle(session);
179 ok(ret, "WinHttpCloseHandle failed on closing session: %u\n", GetLastError());
182 static void test_OpenRequest (void)
184 BOOL ret;
185 HINTERNET session, request, connection;
187 session = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
188 WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
189 ok(session != NULL, "WinHttpOpen failed to open session.\n");
191 /* Test with a bad server name */
192 SetLastError(0xdeadbeef);
193 connection = WinHttpConnect(session, NULL, INTERNET_DEFAULT_HTTP_PORT, 0);
194 ok (connection == NULL, "WinHttpConnect succeeded in opening connection to NULL server argument.\n");
195 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError());
197 /* Test with a valid server name */
198 connection = WinHttpConnect (session, test_server, INTERNET_DEFAULT_HTTP_PORT, 0);
199 ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
201 request = WinHttpOpenRequest(connection, NULL, NULL, NULL, WINHTTP_NO_REFERER,
202 WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
203 if (request == NULL && GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED)
205 skip("Network unreachable, skipping.\n");
206 goto done;
208 ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
210 ret = WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, NULL, 0, 0, 0);
211 ok(ret == TRUE, "WinHttpSendRequest failed: %u\n", GetLastError());
212 ret = WinHttpCloseHandle(request);
213 ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
215 done:
216 ret = WinHttpCloseHandle(connection);
217 ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
218 ret = WinHttpCloseHandle(session);
219 ok(ret == TRUE, "WinHttpCloseHandle failed on closing session, got %d.\n", ret);
223 static void test_SendRequest (void)
225 HINTERNET session, request, connection;
226 DWORD header_len, optional_len, total_len;
227 DWORD bytes_rw;
228 BOOL ret;
229 CHAR buffer[256];
230 int i;
232 static const WCHAR test_site[] = {'c','r','o','s','s','o','v','e','r','.',
233 'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
234 static const WCHAR content_type[] =
235 {'C','o','n','t','e','n','t','-','T','y','p','e',':',' ','a','p','p','l','i','c','a','t','i','o','n',
236 '/','x','-','w','w','w','-','f','o','r','m','-','u','r','l','e','n','c','o','d','e','d',0};
237 static const WCHAR test_file[] = {'/','p','o','s','t','t','e','s','t','.','p','h','p',0};
238 static const WCHAR test_verb[] = {'P','O','S','T',0};
239 static CHAR post_data[] = "mode=Test";
240 static CHAR test_post[] = "mode => Test\\0\n";
242 header_len = -1L;
243 total_len = optional_len = sizeof(post_data);
244 memset(buffer, 0xff, sizeof(buffer));
246 session = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
247 WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
248 ok(session != NULL, "WinHttpOpen failed to open session.\n");
250 connection = WinHttpConnect (session, test_site, INTERNET_DEFAULT_HTTP_PORT, 0);
251 ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
253 request = WinHttpOpenRequest(connection, test_verb, test_file, NULL, WINHTTP_NO_REFERER,
254 WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_BYPASS_PROXY_CACHE);
255 if (request == NULL && GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED)
257 skip("Network unreachable, skipping.\n");
258 goto done;
260 ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
262 ret = WinHttpSendRequest(request, content_type, header_len, post_data, optional_len, total_len, 0);
263 ok(ret == TRUE, "WinHttpSendRequest failed: %u\n", GetLastError());
265 for (i = 3; post_data[i]; i++)
267 bytes_rw = -1;
268 ret = WinHttpWriteData(request, &post_data[i], 1, &bytes_rw);
269 ok(ret == TRUE, "WinHttpWriteData failed: %u.\n", GetLastError());
270 ok(bytes_rw == 1, "WinHttpWriteData failed, wrote %u bytes instead of 1 byte.\n", bytes_rw);
273 ret = WinHttpReceiveResponse(request, NULL);
274 ok(ret == TRUE, "WinHttpReceiveResponse failed: %u.\n", GetLastError());
276 bytes_rw = -1;
277 ret = WinHttpReadData(request, buffer, sizeof(buffer) - 1, &bytes_rw);
278 ok(ret == TRUE, "WinHttpReadData failed: %u.\n", GetLastError());
280 ok(bytes_rw == strlen(test_post), "Read %u bytes instead of %d.\n", bytes_rw, lstrlen(test_post));
281 ok(strncmp(buffer, test_post, bytes_rw) == 0, "Data read did not match, got '%s'.\n", buffer);
283 ret = WinHttpCloseHandle(request);
284 ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
285 done:
286 ret = WinHttpCloseHandle(connection);
287 ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
288 ret = WinHttpCloseHandle(session);
289 ok(ret == TRUE, "WinHttpCloseHandle failed on closing session, got %d.\n", ret);
292 static void test_WinHttpTimeFromSystemTime(void)
294 BOOL ret;
295 static const SYSTEMTIME time = {2008, 7, 1, 28, 10, 5, 52, 0};
296 static const WCHAR expected_string[] =
297 {'M','o','n',',',' ','2','8',' ','J','u','l',' ','2','0','0','8',' ',
298 '1','0',':','0','5',':','5','2',' ','G','M','T',0};
299 WCHAR time_string[WINHTTP_TIME_FORMAT_BUFSIZE+1];
301 ret = WinHttpTimeFromSystemTime(&time, time_string);
302 ok(ret == TRUE, "WinHttpTimeFromSystemTime failed: %u\n", GetLastError());
303 ok(memcmp(time_string, expected_string, sizeof(expected_string)) == 0,
304 "Time string returned did not match expected time string.\n");
307 static void test_WinHttpTimeToSystemTime(void)
309 BOOL ret;
310 SYSTEMTIME time;
311 static const SYSTEMTIME expected_time = {2008, 7, 1, 28, 10, 5, 52, 0};
312 static const WCHAR time_string1[] =
313 {'M','o','n',',',' ','2','8',' ','J','u','l',' ','2','0','0','8',' ',
314 + '1','0',':','0','5',':','5','2',' ','G','M','T','\n',0};
315 static const WCHAR time_string2[] =
316 {' ','m','o','n',' ','2','8',' ','j','u','l',' ','2','0','0','8',' ',
317 '1','0',' ','0','5',' ','5','2','\n',0};
319 ret = WinHttpTimeToSystemTime(time_string1, &time);
320 ok(ret == TRUE, "WinHttpTimeToSystemTime failed: %u\n", GetLastError());
321 ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0,
322 "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n");
324 ret = WinHttpTimeToSystemTime(time_string2, &time);
325 ok(ret == TRUE, "WinHttpTimeToSystemTime failed: %u\n", GetLastError());
326 ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0,
327 "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n");
330 static void test_WinHttpAddHeaders(void)
332 HINTERNET session, request, connection;
333 BOOL ret;
334 WCHAR buffer[MAX_PATH];
335 WCHAR check_buffer[MAX_PATH];
336 DWORD index, len, oldlen;
338 static const WCHAR test_site[] = {'c','r','o','s','s','o','v','e','r','.',
339 'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
340 static const WCHAR test_file[] = {'/','p','o','s','t','t','e','s','t','.','p','h','p',0};
341 static const WCHAR test_verb[] = {'P','O','S','T',0};
343 static const WCHAR test_header_begin[] =
344 {'P','O','S','T',' ','/','p','o','s','t','t','e','s','t','.','p','h','p',' ','H','T','T','P','/','1'};
345 static const WCHAR test_header_end[] = {'\r','\n','\r','\n',0};
346 static const WCHAR test_header_name[] = {'W','a','r','n','i','n','g',0};
348 static const WCHAR test_flag_coalesce[] = {'t','e','s','t','2',',',' ','t','e','s','t','4',0};
349 static const WCHAR test_flag_coalesce_comma[] =
350 {'t','e','s','t','2',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',0};
351 static const WCHAR test_flag_coalesce_semicolon[] =
352 {'t','e','s','t','2',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',';',' ','t','e','s','t','6',0};
354 static const WCHAR field[] = {'f','i','e','l','d',0};
355 static const WCHAR value[] = {'v','a','l','u','e',' ',0};
357 static const WCHAR test_headers[][14] =
359 {'W','a','r','n','i','n','g',':','t','e','s','t','1',0},
360 {'W','a','r','n','i','n','g',':','t','e','s','t','2',0},
361 {'W','a','r','n','i','n','g',':','t','e','s','t','3',0},
362 {'W','a','r','n','i','n','g',':','t','e','s','t','4',0},
363 {'W','a','r','n','i','n','g',':','t','e','s','t','5',0},
364 {'W','a','r','n','i','n','g',':','t','e','s','t','6',0},
365 {'W','a','r','n','i','n','g',':','t','e','s','t','7',0},
366 {0},
367 {':',0},
368 {'a',':',0},
369 {':','b',0},
370 {'c','d',0},
371 {' ','e',' ',':','f',0},
372 {'f','i','e','l','d',':',' ','v','a','l','u','e',' ',0}
374 static const WCHAR test_indices[][6] =
376 {'t','e','s','t','1',0},
377 {'t','e','s','t','2',0},
378 {'t','e','s','t','3',0},
379 {'t','e','s','t','4',0}
382 session = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
383 WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
384 ok(session != NULL, "WinHttpOpen failed to open session.\n");
386 connection = WinHttpConnect (session, test_site, INTERNET_DEFAULT_HTTP_PORT, 0);
387 ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
389 request = WinHttpOpenRequest(connection, test_verb, test_file, NULL, WINHTTP_NO_REFERER,
390 WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
391 if (request == NULL && GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED)
393 skip("Network unreachable, skipping.\n");
394 goto done;
396 ok(request != NULL, "WinHttpOpenRequest failed to open a request, error: %u.\n", GetLastError());
398 index = 0;
399 len = sizeof(buffer);
400 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
401 test_header_name, buffer, &len, &index);
402 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded, found 'Warning' header.\n");
403 ret = WinHttpAddRequestHeaders(request, test_headers[0], -1L, WINHTTP_ADDREQ_FLAG_ADD);
404 ok(ret == TRUE, "WinHttpAddRequestHeader failed to add new header, got %d with error %u.\n", ret, GetLastError());
406 index = 0;
407 len = sizeof(buffer);
408 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
409 test_header_name, buffer, &len, &index);
410 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
411 ok(index == 1, "WinHttpQueryHeaders failed: header index not incremented\n");
412 ok(memcmp(buffer, test_indices[0], sizeof(test_indices[0])) == 0, "WinHttpQueryHeaders failed: incorrect string returned\n");
413 ok(len == 5*sizeof(WCHAR), "WinHttpQueryHeaders failed: invalid length returned, expected 5, got %d\n", len);
415 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
416 test_header_name, buffer, &len, &index);
417 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded, second index should not exist.\n");
419 /* Try to fetch the header info with a buffer that's big enough to fit the
420 * string but not the NULL terminator.
422 index = 0;
423 len = 5*sizeof(WCHAR);
424 memset(check_buffer, 0xab, sizeof(check_buffer));
425 memcpy(buffer, check_buffer, sizeof(buffer));
426 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
427 test_header_name, buffer, &len, &index);
428 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded with a buffer that's too small.\n");
429 ok(memcmp(buffer, check_buffer, sizeof(buffer)) == 0,
430 "WinHttpQueryHeaders failed, modified the buffer when it should not have.\n");
431 ok(len == 6*sizeof(WCHAR), "WinHttpQueryHeaders returned invalid length, expected 12, got %d\n", len);
433 /* Try with a NULL buffer */
434 index = 0;
435 len = sizeof(buffer);
436 SetLastError(0xdeadbeef);
437 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS_CRLF | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
438 test_header_name, NULL, &len, &index);
439 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n");
440 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
441 ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len);
442 ok(index == 0, "WinHttpQueryHeaders incorrectly incremented header index.\n");
444 /* Try with a NULL buffer and a length that's too small */
445 index = 0;
446 len = 10;
447 SetLastError(0xdeadbeef);
448 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS_CRLF | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
449 test_header_name, NULL, &len, &index);
450 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n");
451 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
452 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICENT_BUFFER, go %u\n", GetLastError());
453 ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len);
454 ok(index == 0, "WinHttpQueryHeaders incorrectly incremented header index.\n");
456 index = 0;
457 len = 0;
458 SetLastError(0xdeadbeef);
459 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS_CRLF | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
460 test_header_name, NULL, &len, &index);
461 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n");
462 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
463 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
464 ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len);
465 ok(index == 0, "WinHttpQueryHeaders failed: index was incremented.\n");
467 /* valid query */
468 oldlen = len;
469 index = 0;
470 len = sizeof(buffer);
471 memset(buffer, 0xff, sizeof(buffer));
472 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS_CRLF | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
473 test_header_name, buffer, &len, &index);
474 ok(ret == TRUE, "WinHttpQueryHeaders failed: got %d\n", ret);
475 ok(len + sizeof(WCHAR) <= oldlen, "WinHttpQueryHeaders resulting length longer than advertized.\n");
476 ok((len < sizeof(buffer) - sizeof(WCHAR)) && buffer[len / sizeof(WCHAR)] == 0, "WinHttpQueryHeaders did not append NULL terminator\n");
477 ok(len == lstrlenW(buffer) * sizeof(WCHAR), "WinHttpQueryHeaders returned incorrect length.\n");
478 ok(memcmp(buffer, test_header_begin, sizeof(test_header_begin)) == 0,
479 "WinHttpQueryHeaders returned invalid beginning of header string.\n");
480 ok(memcmp(buffer + lstrlenW(buffer) - 4, test_header_end, sizeof(test_header_end)) == 0,
481 "WinHttpQueryHeaders returned invalid end of header string.\n");
482 ok(index == 0, "WinHttpQueryHeaders incremented header index.\n");
484 index = 0;
485 len = 0;
486 SetLastError(0xdeadbeef);
487 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
488 test_header_name, NULL, &len, &index);
489 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n");
490 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
491 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
492 ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len);
493 ok(index == 0, "WinHttpQueryHeaders failed: index was incremented.\n");
495 oldlen = len;
496 index = 0;
497 len = sizeof(buffer);
498 memset(buffer, 0xff, sizeof(buffer));
499 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
500 test_header_name, buffer, &len, &index);
501 ok(ret == TRUE, "WinHttpQueryHeaders failed %u\n", GetLastError());
502 ok(len + sizeof(WCHAR) <= oldlen, "resulting length longer than advertized\n");
503 ok((len < sizeof(buffer) - sizeof(WCHAR)) && !buffer[len / sizeof(WCHAR)] && !buffer[len / sizeof(WCHAR) - 1],
504 "no double NULL terminator\n");
505 ok(!memcmp(buffer, test_header_begin, sizeof(test_header_begin)), "invalid beginning of header string\n");
506 ok(index == 0, "header index was incremented\n");
508 /* tests for more indices */
509 ret = WinHttpAddRequestHeaders(request, test_headers[1], -1L, WINHTTP_ADDREQ_FLAG_ADD);
510 ok(ret == TRUE, "WinHttpAddRequestHeaders failed to add duplicate header: %d\n", ret);
512 index = 0;
513 len = sizeof(buffer);
514 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
515 test_header_name, buffer, &len, &index);
516 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
517 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
518 ok(memcmp(buffer, test_indices[0], sizeof(test_indices[0])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
520 len = sizeof(buffer);
521 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
522 test_header_name, buffer, &len, &index);
523 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
524 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
525 ok(memcmp(buffer, test_indices[1], sizeof(test_indices[1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
527 ret = WinHttpAddRequestHeaders(request, test_headers[2], -1L, WINHTTP_ADDREQ_FLAG_REPLACE);
528 ok(ret == TRUE, "WinHttpAddRequestHeaders failed to add duplicate header.\n");
530 index = 0;
531 len = sizeof(buffer);
532 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
533 test_header_name, buffer, &len, &index);
534 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
535 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
536 ok(memcmp(buffer, test_indices[1], sizeof(test_indices[1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
538 len = sizeof(buffer);
539 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
540 test_header_name, buffer, &len, &index);
541 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
542 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
543 ok(memcmp(buffer, test_indices[2], sizeof(test_indices[2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
545 /* add if new flag */
546 ret = WinHttpAddRequestHeaders(request, test_headers[3], -1L, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW);
547 ok(ret == FALSE, "WinHttpAddRequestHeaders incorrectly replaced existing header.\n");
549 index = 0;
550 len = sizeof(buffer);
551 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
552 test_header_name, buffer, &len, &index);
553 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
554 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
555 ok(memcmp(buffer, test_indices[1], sizeof(test_indices[1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
557 len = sizeof(buffer);
558 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
559 test_header_name, buffer, &len, &index);
560 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
561 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
562 ok(memcmp(buffer, test_indices[2], sizeof(test_indices[2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
564 len = sizeof(buffer);
565 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
566 test_header_name, buffer, &len, &index);
567 ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
569 /* coalesce flag */
570 ret = WinHttpAddRequestHeaders(request, test_headers[3], -1L, WINHTTP_ADDREQ_FLAG_COALESCE);
571 ok(ret == TRUE, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE.\n");
573 index = 0;
574 len = sizeof(buffer);
575 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
576 test_header_name, buffer, &len, &index);
577 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
578 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
579 ok(memcmp(buffer, test_flag_coalesce, sizeof(test_flag_coalesce)) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
581 len = sizeof(buffer);
582 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
583 test_header_name, buffer, &len, &index);
584 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
585 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
586 ok(memcmp(buffer, test_indices[2], sizeof(test_indices[2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
588 len = sizeof(buffer);
589 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
590 test_header_name, buffer, &len, &index);
591 ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
593 /* coalesce with comma flag */
594 ret = WinHttpAddRequestHeaders(request, test_headers[4], -1L, WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA);
595 ok(ret == TRUE, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA.\n");
597 index = 0;
598 len = sizeof(buffer);
599 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
600 test_header_name, buffer, &len, &index);
601 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
602 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
603 ok(memcmp(buffer, test_flag_coalesce_comma, sizeof(test_flag_coalesce_comma)) == 0,
604 "WinHttpQueryHeaders returned incorrect string.\n");
606 len = sizeof(buffer);
607 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
608 test_header_name, buffer, &len, &index);
609 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
610 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
611 ok(memcmp(buffer, test_indices[2], sizeof(test_indices[2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
613 len = sizeof(buffer);
614 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
615 test_header_name, buffer, &len, &index);
616 ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
619 /* coalesce with semicolon flag */
620 ret = WinHttpAddRequestHeaders(request, test_headers[5], -1L, WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON);
621 ok(ret == TRUE, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON.\n");
623 index = 0;
624 len = sizeof(buffer);
625 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
626 test_header_name, buffer, &len, &index);
627 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
628 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
629 ok(memcmp(buffer, test_flag_coalesce_semicolon, sizeof(test_flag_coalesce_semicolon)) == 0,
630 "WinHttpQueryHeaders returned incorrect string.\n");
632 len = sizeof(buffer);
633 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
634 test_header_name, buffer, &len, &index);
635 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
636 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
637 ok(memcmp(buffer, test_indices[2], sizeof(test_indices[2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
639 len = sizeof(buffer);
640 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
641 test_header_name, buffer, &len, &index);
642 ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
644 /* add and replace flags */
645 ret = WinHttpAddRequestHeaders(request, test_headers[3], -1L, WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE);
646 ok(ret == TRUE, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE.\n");
648 index = 0;
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 == 1, "WinHttpQueryHeaders failed to increment index.\n");
654 ok(memcmp(buffer, test_indices[2], sizeof(test_indices[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 == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
660 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
661 ok(memcmp(buffer, test_indices[3], sizeof(test_indices[2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
663 len = sizeof(buffer);
664 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
665 test_header_name, buffer, &len, &index);
666 ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
668 ret = WinHttpAddRequestHeaders(request, test_headers[8], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
669 ok(!ret, "WinHttpAddRequestHeaders failed\n");
671 ret = WinHttpAddRequestHeaders(request, test_headers[9], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
672 ok(ret, "WinHttpAddRequestHeaders failed\n");
674 ret = WinHttpAddRequestHeaders(request, test_headers[10], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
675 ok(!ret, "WinHttpAddRequestHeaders failed\n");
677 ret = WinHttpAddRequestHeaders(request, test_headers[11], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
678 ok(!ret, "WinHttpAddRequestHeaders failed\n");
680 ret = WinHttpAddRequestHeaders(request, test_headers[12], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
681 ok(!ret, "WinHttpAddRequestHeaders failed\n");
683 ret = WinHttpAddRequestHeaders(request, test_headers[13], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
684 ok(ret, "WinHttpAddRequestHeaders failed\n");
686 index = 0;
687 buffer[0] = 0;
688 len = sizeof(buffer);
689 ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
690 field, buffer, &len, &index);
691 ok(ret, "WinHttpQueryHeaders failed: %u\n", GetLastError());
692 ok(!memcmp(buffer, value, sizeof(value)), "unexpected result\n");
694 ret = WinHttpCloseHandle(request);
695 ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
696 done:
697 ret = WinHttpCloseHandle(connection);
698 ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
699 ret = WinHttpCloseHandle(session);
700 ok(ret == TRUE, "WinHttpCloseHandle failed on closing session, got %d.\n", ret);
704 static void test_secure_connection(void)
706 static const WCHAR google[] = {'w','w','w','.','g','o','o','g','l','e','.','c','o','m',0};
708 HANDLE ses, con, req;
709 DWORD size, status, policy, bitness;
710 BOOL ret;
711 CERT_CONTEXT *cert;
713 ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
714 ok(ses != NULL, "failed to open session %u\n", GetLastError());
716 policy = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS;
717 ret = WinHttpSetOption(ses, WINHTTP_OPTION_REDIRECT_POLICY, &policy, sizeof(policy));
718 ok(ret, "failed to set redirect policy %u\n", GetLastError());
720 con = WinHttpConnect(ses, google, 443, 0);
721 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
723 /* try without setting WINHTTP_FLAG_SECURE */
724 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
725 ok(req != NULL, "failed to open a request %u\n", GetLastError());
727 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
728 ok(ret, "failed to send request %u\n", GetLastError());
730 ret = WinHttpReceiveResponse(req, NULL);
731 ok(!ret, "succeeded unexpectedly\n");
733 size = 0;
734 ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_RAW_HEADERS_CRLF, NULL, NULL, &size, NULL);
735 ok(!ret, "succeeded unexpectedly\n");
737 WinHttpCloseHandle(req);
739 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, WINHTTP_FLAG_SECURE);
740 ok(req != NULL, "failed to open a request %u\n", GetLastError());
742 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
743 ok(ret, "failed to send request %u\n", GetLastError());
745 size = sizeof(cert);
746 ret = WinHttpQueryOption(req, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &cert, &size );
747 ok(ret, "failed to retrieve certificate context %u\n", GetLastError());
749 size = sizeof(bitness);
750 ret = WinHttpQueryOption(req, WINHTTP_OPTION_SECURITY_KEY_BITNESS, &bitness, &size );
751 ok(ret, "failed to retrieve key bitness %u\n", GetLastError());
753 ret = WinHttpReceiveResponse(req, NULL);
754 ok(ret, "failed to receive response %u\n", GetLastError());
756 size = sizeof(status);
757 ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL);
758 ok(ret, "failed unexpectedly %u\n", GetLastError());
759 ok(status == 200, "request failed unexpectedly %u\n", status);
761 size = 0;
762 ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_RAW_HEADERS_CRLF, NULL, NULL, &size, NULL);
763 ok(!ret, "succeeded unexpectedly\n");
765 WinHttpCloseHandle(req);
766 WinHttpCloseHandle(con);
767 WinHttpCloseHandle(ses);
770 static void test_request_parameter_defaults(void)
772 static const WCHAR empty[] = {0};
773 static const WCHAR codeweavers[] = {'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0};
775 HANDLE ses, con, req;
776 DWORD size, status;
777 BOOL ret;
779 ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
780 ok(ses != NULL, "failed to open session %u\n", GetLastError());
782 con = WinHttpConnect(ses, codeweavers, 0, 0);
783 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
785 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
786 ok(req != NULL, "failed to open a request %u\n", GetLastError());
788 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
789 ok(ret, "failed to send request %u\n", GetLastError());
791 ret = WinHttpReceiveResponse(req, NULL);
792 ok(ret, "failed to receive response %u\n", GetLastError());
794 size = sizeof(status);
795 ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL);
796 ok(ret, "failed unexpectedly %u\n", GetLastError());
797 ok(status == 200, "request failed unexpectedly %u\n", status);
799 WinHttpCloseHandle(req);
801 req = WinHttpOpenRequest(con, empty, empty, empty, NULL, NULL, 0);
802 ok(req != NULL, "failed to open a request %u\n", GetLastError());
804 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
805 ok(ret, "failed to send request %u\n", GetLastError());
807 ret = WinHttpReceiveResponse(req, NULL);
808 ok(ret, "failed to receive response %u\n", GetLastError());
810 size = sizeof(status);
811 ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL);
812 ok(ret, "failed unexpectedly %u\n", GetLastError());
813 ok(status == 200, "request failed unexpectedly %u\n", status);
815 WinHttpCloseHandle(req);
816 WinHttpCloseHandle(con);
817 WinHttpCloseHandle(ses);
820 START_TEST (winhttp)
822 test_OpenRequest();
823 test_SendRequest();
824 test_WinHttpTimeFromSystemTime();
825 test_WinHttpTimeToSystemTime();
826 test_WinHttpAddHeaders();
827 test_secure_connection();
828 test_request_parameter_defaults();
829 test_QueryOption();