wnaspi32: Make winaspi.dll into a stand-alone 16-bit module.
[wine] / dlls / winhttp / tests / winhttp.c
1 /*
2  * WinHTTP - tests
3  *
4  * Copyright 2008 Google (Zac Brown)
5  *
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.
10  *
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.
15  *
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
19  */
20
21 #include <stdarg.h>
22 #include <stdlib.h>
23 #include <windef.h>
24 #include <winbase.h>
25 #include <winhttp.h>
26 #include <wincrypt.h>
27
28 #include "wine/test.h"
29
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};
33
34 static void test_QueryOption(void)
35 {
36     BOOL ret;
37     HINTERNET session, request, connection;
38     DWORD feature, size;
39
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());
43
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());
49
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);
57
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);
66
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);
75
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());
81
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());
88
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());
95
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());
100
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);
108
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());
115
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());
119
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());
126
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)
131     {
132         skip("Network unreachable, skipping the test\n");
133         goto done;
134     }
135
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());
143
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());
149
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());
155
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());
161
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());
168
169     SetLastError(0xdeadbeef);
170     ret = WinHttpCloseHandle(request);
171     ok(ret, "WinHttpCloseHandle failed on closing request: %u\n", GetLastError());
172
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());
180 }
181
182 static void test_OpenRequest (void)
183 {
184     BOOL ret;
185     HINTERNET session, request, connection;
186
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");
190
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());
196
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());
200
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)
204     {
205         skip("Network unreachable, skipping.\n");
206         goto done;
207     }
208     ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
209
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);
214
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);
220
221 }
222
223 static void test_SendRequest (void)
224 {
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;
231
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";
241
242     header_len = -1L;
243     total_len = optional_len = sizeof(post_data);
244     memset(buffer, 0xff, sizeof(buffer));
245
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");
249
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());
252
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)
256     {
257         skip("Network unreachable, skipping.\n");
258         goto done;
259     }
260     ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
261
262     ret = WinHttpSendRequest(request, content_type, header_len, post_data, optional_len, total_len, 0);
263     ok(ret == TRUE, "WinHttpSendRequest failed: %u\n", GetLastError());
264
265     for (i = 3; post_data[i]; i++)
266     {
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);
271     }
272
273     ret = WinHttpReceiveResponse(request, NULL);
274     ok(ret == TRUE, "WinHttpReceiveResponse failed: %u.\n", GetLastError());
275
276     bytes_rw = -1;
277     ret = WinHttpReadData(request, buffer, sizeof(buffer) - 1, &bytes_rw);
278     ok(ret == TRUE, "WinHttpReadData failed: %u.\n", GetLastError());
279
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);
282
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);
290 }
291
292 static void test_WinHttpTimeFromSystemTime(void)
293 {
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];
300
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");
305 }
306
307 static void test_WinHttpTimeToSystemTime(void)
308 {
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};
318
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");
323
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");
328 }
329
330 static void test_WinHttpAddHeaders(void)
331 {
332     HINTERNET session, request, connection;
333     BOOL ret;
334     WCHAR buffer[MAX_PATH];
335     WCHAR check_buffer[MAX_PATH];
336     DWORD index, len, oldlen;
337
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};
342
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};
347
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};
353
354     static const WCHAR field[] = {'f','i','e','l','d',0};
355     static const WCHAR value[] = {'v','a','l','u','e',' ',0};
356
357     static const WCHAR test_headers[][14] =
358         {
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}
373         };
374     static const WCHAR test_indices[][6] =
375         {
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}
380         };
381
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");
385
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());
388
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)
392     {
393         skip("Network unreachable, skipping.\n");
394         goto done;
395     }
396     ok(request != NULL, "WinHttpOpenRequest failed to open a request, error: %u.\n", GetLastError());
397
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());
405
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);
414
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");
418
419     /* Try to fetch the header info with a buffer that's big enough to fit the
420      * string but not the NULL terminator.
421      */
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);
432
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");
443
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");
455
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");
466
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");
483
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");
494
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");
507
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);
511
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");
519
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");
526
527     ret = WinHttpAddRequestHeaders(request, test_headers[2], -1L, WINHTTP_ADDREQ_FLAG_REPLACE);
528     ok(ret == TRUE, "WinHttpAddRequestHeaders failed to add duplicate header.\n");
529
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");
537
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");
544
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");
548
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");
556
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");
563
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");
568
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");
572
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");
580
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");
587
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");
592
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");
596
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");
605
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");
612
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");
617
618
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");
622
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");
631
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");
638
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");
643
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");
647
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");
655
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");
662
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");
667
668     ret = WinHttpAddRequestHeaders(request, test_headers[8], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
669     ok(!ret, "WinHttpAddRequestHeaders failed\n");
670
671     ret = WinHttpAddRequestHeaders(request, test_headers[9], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
672     ok(ret, "WinHttpAddRequestHeaders failed\n");
673
674     ret = WinHttpAddRequestHeaders(request, test_headers[10], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
675     ok(!ret, "WinHttpAddRequestHeaders failed\n");
676
677     ret = WinHttpAddRequestHeaders(request, test_headers[11], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
678     ok(!ret, "WinHttpAddRequestHeaders failed\n");
679
680     ret = WinHttpAddRequestHeaders(request, test_headers[12], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
681     ok(!ret, "WinHttpAddRequestHeaders failed\n");
682
683     ret = WinHttpAddRequestHeaders(request, test_headers[13], ~0u, WINHTTP_ADDREQ_FLAG_ADD);
684     ok(ret, "WinHttpAddRequestHeaders failed\n");
685
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");
693
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);
701
702 }
703
704 static void test_secure_connection(void)
705 {
706     static const WCHAR google[] = {'w','w','w','.','g','o','o','g','l','e','.','c','o','m',0};
707
708     HANDLE ses, con, req;
709     DWORD size, status, policy, bitness;
710     BOOL ret;
711     CERT_CONTEXT *cert;
712
713     ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
714     ok(ses != NULL, "failed to open session %u\n", GetLastError());
715
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());
719
720     con = WinHttpConnect(ses, google, 443, 0);
721     ok(con != NULL, "failed to open a connection %u\n", GetLastError());
722
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());
726
727     ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
728     ok(ret, "failed to send request %u\n", GetLastError());
729
730     ret = WinHttpReceiveResponse(req, NULL);
731     ok(!ret, "succeeded unexpectedly\n");
732
733     size = 0;
734     ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_RAW_HEADERS_CRLF, NULL, NULL, &size, NULL);
735     ok(!ret, "succeeded unexpectedly\n");
736
737     WinHttpCloseHandle(req);
738
739     req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, WINHTTP_FLAG_SECURE);
740     ok(req != NULL, "failed to open a request %u\n", GetLastError());
741
742     ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
743     ok(ret, "failed to send request %u\n", GetLastError());
744
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());
748
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());
752
753     ret = WinHttpReceiveResponse(req, NULL);
754     ok(ret, "failed to receive response %u\n", GetLastError());
755
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);
760
761     size = 0;
762     ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_RAW_HEADERS_CRLF, NULL, NULL, &size, NULL);
763     ok(!ret, "succeeded unexpectedly\n");
764
765     WinHttpCloseHandle(req);
766     WinHttpCloseHandle(con);
767     WinHttpCloseHandle(ses);
768 }
769
770 static void test_request_parameter_defaults(void)
771 {
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};
774
775     HANDLE ses, con, req;
776     DWORD size, status;
777     BOOL ret;
778
779     ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
780     ok(ses != NULL, "failed to open session %u\n", GetLastError());
781
782     con = WinHttpConnect(ses, codeweavers, 0, 0);
783     ok(con != NULL, "failed to open a connection %u\n", GetLastError());
784
785     req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
786     ok(req != NULL, "failed to open a request %u\n", GetLastError());
787
788     ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
789     ok(ret, "failed to send request %u\n", GetLastError());
790
791     ret = WinHttpReceiveResponse(req, NULL);
792     ok(ret, "failed to receive response %u\n", GetLastError());
793
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);
798
799     WinHttpCloseHandle(req);
800
801     req = WinHttpOpenRequest(con, empty, empty, empty, NULL, NULL, 0);
802     ok(req != NULL, "failed to open a request %u\n", GetLastError());
803
804     ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
805     ok(ret, "failed to send request %u\n", GetLastError());
806
807     ret = WinHttpReceiveResponse(req, NULL);
808     ok(ret, "failed to receive response %u\n", GetLastError());
809
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);
814
815     WinHttpCloseHandle(req);
816     WinHttpCloseHandle(con);
817     WinHttpCloseHandle(ses);
818 }
819
820 START_TEST (winhttp)
821 {
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();
830 }