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
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)
37 HINTERNET session
, request
, connection
;
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());
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
);
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
);
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");
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());
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());
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());
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)
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");
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
);
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
;
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";
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");
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
++)
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());
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
);
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)
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)
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
;
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},
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");
396 ok(request
!= NULL
, "WinHttpOpenRequest failed to open a request, error: %u.\n", GetLastError());
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());
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.
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 */
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 */
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");
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");
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");
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");
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
);
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");
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");
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");
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");
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");
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");
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");
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");
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
);
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
;
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");
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());
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
);
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
;
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
);
824 test_WinHttpTimeFromSystemTime();
825 test_WinHttpTimeToSystemTime();
826 test_WinHttpAddHeaders();
827 test_secure_connection();
828 test_request_parameter_defaults();