2008-07-18 02:37:23 +02:00
/*
* WinHTTP - tests
*
* Copyright 2008 Google ( Zac Brown )
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 , USA
*/
2008-08-20 11:37:17 +02:00
2008-07-18 02:37:23 +02:00
# include <stdarg.h>
# include <stdlib.h>
# include <windef.h>
# include <winbase.h>
# include <winhttp.h>
2008-09-08 22:01:39 +02:00
# include <wincrypt.h>
2009-07-14 21:36:41 +02:00
# include <winreg.h>
2008-07-18 02:37:23 +02:00
# include "wine/test.h"
static const WCHAR test_useragent [ ] =
{ ' W ' , ' i ' , ' n ' , ' e ' , ' ' , ' R ' , ' e ' , ' g ' , ' r ' , ' e ' , ' s ' , ' s ' , ' i ' , ' o ' , ' n ' , ' ' , ' T ' , ' e ' , ' s ' , ' t ' , 0 } ;
static const WCHAR test_server [ ] = { ' w ' , ' i ' , ' n ' , ' e ' , ' h ' , ' q ' , ' . ' , ' o ' , ' r ' , ' g ' , 0 } ;
2008-09-16 11:51:58 +02:00
static void test_QueryOption ( void )
{
BOOL ret ;
HINTERNET session , request , connection ;
DWORD feature , size ;
SetLastError ( 0xdeadbeef ) ;
session = WinHttpOpen ( test_useragent , 0 , 0 , 0 , 0 ) ;
ok ( session ! = NULL , " WinHttpOpen failed to open session, error %u \n " , GetLastError ( ) ) ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryOption ( session , WINHTTP_OPTION_REDIRECT_POLICY , NULL , NULL ) ;
ok ( ! ret , " should fail to set redirect policy %u \n " , GetLastError ( ) ) ;
ok ( GetLastError ( ) = = ERROR_INVALID_PARAMETER ,
" expected ERROR_INVALID_PARAMETER, got %u \n " , GetLastError ( ) ) ;
size = 0xdeadbeef ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryOption ( session , WINHTTP_OPTION_REDIRECT_POLICY , NULL , & size ) ;
ok ( ! ret , " should fail to query option \n " ) ;
ok ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER ,
" expected ERROR_INSUFFICIENT_BUFFER, got %u \n " , GetLastError ( ) ) ;
ok ( size = = 4 , " expected 4, got %u \n " , size ) ;
feature = 0xdeadbeef ;
size = sizeof ( feature ) - 1 ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryOption ( session , WINHTTP_OPTION_REDIRECT_POLICY , & feature , & size ) ;
ok ( ! ret , " should fail to query option \n " ) ;
ok ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER ,
" expected ERROR_INSUFFICIENT_BUFFER, got %u \n " , GetLastError ( ) ) ;
ok ( size = = 4 , " expected 4, got %u \n " , size ) ;
feature = 0xdeadbeef ;
size = sizeof ( feature ) + 1 ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryOption ( session , WINHTTP_OPTION_REDIRECT_POLICY , & feature , & size ) ;
ok ( ret , " failed to query option %u \n " , GetLastError ( ) ) ;
ok ( size = = sizeof ( feature ) , " WinHttpQueryOption should set the size: %u \n " , size ) ;
ok ( feature = = WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP ,
" expected WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, got %#x \n " , feature ) ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetOption ( session , WINHTTP_OPTION_REDIRECT_POLICY , NULL , sizeof ( feature ) ) ;
ok ( ! ret , " should fail to set redirect policy %u \n " , GetLastError ( ) ) ;
ok ( GetLastError ( ) = = ERROR_INVALID_PARAMETER ,
" expected ERROR_INVALID_PARAMETER, got %u \n " , GetLastError ( ) ) ;
feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetOption ( session , WINHTTP_OPTION_REDIRECT_POLICY , & feature , sizeof ( feature ) - 1 ) ;
ok ( ! ret , " should fail to set redirect policy %u \n " , GetLastError ( ) ) ;
ok ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER ,
" expected ERROR_INSUFFICIENT_BUFFER, got %u \n " , GetLastError ( ) ) ;
feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetOption ( session , WINHTTP_OPTION_REDIRECT_POLICY , & feature , sizeof ( feature ) + 1 ) ;
ok ( ! ret , " should fail to set redirect policy %u \n " , GetLastError ( ) ) ;
ok ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER ,
" expected ERROR_INSUFFICIENT_BUFFER, got %u \n " , GetLastError ( ) ) ;
feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetOption ( session , WINHTTP_OPTION_REDIRECT_POLICY , & feature , sizeof ( feature ) ) ;
ok ( ret , " failed to set redirect policy %u \n " , GetLastError ( ) ) ;
feature = 0xdeadbeef ;
size = sizeof ( feature ) ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryOption ( session , WINHTTP_OPTION_REDIRECT_POLICY , & feature , & size ) ;
ok ( ret , " failed to query option %u \n " , GetLastError ( ) ) ;
ok ( feature = = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS ,
" expected WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS, got %#x \n " , feature ) ;
feature = WINHTTP_DISABLE_COOKIES ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetOption ( session , WINHTTP_OPTION_DISABLE_FEATURE , & feature , sizeof ( feature ) ) ;
ok ( ! ret , " should fail to set disable feature for a session \n " ) ;
ok ( GetLastError ( ) = = ERROR_WINHTTP_INCORRECT_HANDLE_TYPE ,
" expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u \n " , GetLastError ( ) ) ;
SetLastError ( 0xdeadbeef ) ;
connection = WinHttpConnect ( session , test_server , INTERNET_DEFAULT_HTTP_PORT , 0 ) ;
ok ( connection ! = NULL , " WinHttpConnect failed to open a connection, error: %u \n " , GetLastError ( ) ) ;
feature = WINHTTP_DISABLE_COOKIES ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetOption ( connection , WINHTTP_OPTION_DISABLE_FEATURE , & feature , sizeof ( feature ) ) ;
ok ( ! ret , " should fail to set disable feature for a connection \n " ) ;
ok ( GetLastError ( ) = = ERROR_WINHTTP_INCORRECT_HANDLE_TYPE ,
" expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u \n " , GetLastError ( ) ) ;
SetLastError ( 0xdeadbeef ) ;
request = WinHttpOpenRequest ( connection , NULL , NULL , NULL , WINHTTP_NO_REFERER ,
WINHTTP_DEFAULT_ACCEPT_TYPES , 0 ) ;
if ( request = = NULL & & GetLastError ( ) = = ERROR_WINHTTP_NAME_NOT_RESOLVED )
{
skip ( " Network unreachable, skipping the test \n " ) ;
goto done ;
}
feature = 0xdeadbeef ;
size = sizeof ( feature ) ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryOption ( request , WINHTTP_OPTION_DISABLE_FEATURE , & feature , & size ) ;
ok ( ! ret , " should fail to query disable feature for a request \n " ) ;
ok ( GetLastError ( ) = = ERROR_INVALID_PARAMETER ,
" expected ERROR_INVALID_PARAMETER, got %u \n " , GetLastError ( ) ) ;
feature = 0 ;
size = sizeof ( feature ) ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetOption ( request , WINHTTP_OPTION_DISABLE_FEATURE , & feature , sizeof ( feature ) ) ;
ok ( ret , " failed to set feature %u \n " , GetLastError ( ) ) ;
feature = 0xffffffff ;
size = sizeof ( feature ) ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetOption ( request , WINHTTP_OPTION_DISABLE_FEATURE , & feature , sizeof ( feature ) ) ;
ok ( ret , " failed to set feature %u \n " , GetLastError ( ) ) ;
feature = WINHTTP_DISABLE_COOKIES ;
size = sizeof ( feature ) ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetOption ( request , WINHTTP_OPTION_DISABLE_FEATURE , & feature , sizeof ( feature ) ) ;
ok ( ret , " failed to set feature %u \n " , GetLastError ( ) ) ;
size = 0 ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryOption ( request , WINHTTP_OPTION_DISABLE_FEATURE , NULL , & size ) ;
ok ( ! ret , " should fail to query disable feature for a request \n " ) ;
ok ( GetLastError ( ) = = ERROR_INVALID_PARAMETER ,
" expected ERROR_INVALID_PARAMETER, got %u \n " , GetLastError ( ) ) ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpCloseHandle ( request ) ;
ok ( ret , " WinHttpCloseHandle failed on closing request: %u \n " , GetLastError ( ) ) ;
done :
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpCloseHandle ( connection ) ;
ok ( ret , " WinHttpCloseHandle failed on closing connection: %u \n " , GetLastError ( ) ) ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpCloseHandle ( session ) ;
ok ( ret , " WinHttpCloseHandle failed on closing session: %u \n " , GetLastError ( ) ) ;
}
2008-07-18 02:37:23 +02:00
static void test_OpenRequest ( void )
{
BOOL ret ;
HINTERNET session , request , connection ;
session = WinHttpOpen ( test_useragent , WINHTTP_ACCESS_TYPE_DEFAULT_PROXY ,
WINHTTP_NO_PROXY_NAME , WINHTTP_NO_PROXY_BYPASS , 0 ) ;
2008-08-15 14:42:15 +02:00
ok ( session ! = NULL , " WinHttpOpen failed to open session. \n " ) ;
2008-07-18 02:37:23 +02:00
/* Test with a bad server name */
SetLastError ( 0xdeadbeef ) ;
connection = WinHttpConnect ( session , NULL , INTERNET_DEFAULT_HTTP_PORT , 0 ) ;
ok ( connection = = NULL , " WinHttpConnect succeeded in opening connection to NULL server argument. \n " ) ;
2008-08-15 14:42:28 +02:00
ok ( GetLastError ( ) = = ERROR_INVALID_PARAMETER , " Expected ERROR_INVALID_PARAMETER, got %u. \n " , GetLastError ( ) ) ;
2008-07-18 02:37:23 +02:00
/* Test with a valid server name */
connection = WinHttpConnect ( session , test_server , INTERNET_DEFAULT_HTTP_PORT , 0 ) ;
2008-08-15 14:42:28 +02:00
ok ( connection ! = NULL , " WinHttpConnect failed to open a connection, error: %u. \n " , GetLastError ( ) ) ;
2008-07-18 02:37:23 +02:00
request = WinHttpOpenRequest ( connection , NULL , NULL , NULL , WINHTTP_NO_REFERER ,
WINHTTP_DEFAULT_ACCEPT_TYPES , 0 ) ;
if ( request = = NULL & & GetLastError ( ) = = ERROR_WINHTTP_NAME_NOT_RESOLVED )
{
skip ( " Network unreachable, skipping. \n " ) ;
goto done ;
}
2008-08-15 14:42:41 +02:00
ok ( request ! = NULL , " WinHttpOpenrequest failed to open a request, error: %u. \n " , GetLastError ( ) ) ;
2008-07-18 02:37:23 +02:00
ret = WinHttpSendRequest ( request , WINHTTP_NO_ADDITIONAL_HEADERS , 0 , NULL , 0 , 0 , 0 ) ;
2008-08-26 11:03:40 +02:00
ok ( ret = = TRUE , " WinHttpSendRequest failed: %u \n " , GetLastError ( ) ) ;
2008-07-18 02:37:23 +02:00
ret = WinHttpCloseHandle ( request ) ;
2008-08-15 14:42:41 +02:00
ok ( ret = = TRUE , " WinHttpCloseHandle failed on closing request, got %d. \n " , ret ) ;
2008-07-18 02:37:23 +02:00
done :
ret = WinHttpCloseHandle ( connection ) ;
2008-08-15 14:42:28 +02:00
ok ( ret = = TRUE , " WinHttpCloseHandle failed on closing connection, got %d. \n " , ret ) ;
2008-07-18 02:37:23 +02:00
ret = WinHttpCloseHandle ( session ) ;
2008-08-15 14:42:15 +02:00
ok ( ret = = TRUE , " WinHttpCloseHandle failed on closing session, got %d. \n " , ret ) ;
2008-07-18 02:37:23 +02:00
}
2009-10-29 11:12:22 +01:00
static void test_empty_headers_param ( void )
{
static const WCHAR winehq [ ] = { ' w ' , ' i ' , ' n ' , ' e ' , ' h ' , ' q ' , ' . ' , ' o ' , ' r ' , ' g ' , 0 } ;
static const WCHAR empty [ ] = { 0 } ;
HANDLE ses , con , req ;
BOOL ret ;
ses = WinHttpOpen ( test_useragent , 0 , NULL , NULL , 0 ) ;
ok ( ses ! = NULL , " failed to open session %u \n " , GetLastError ( ) ) ;
con = WinHttpConnect ( ses , winehq , 80 , 0 ) ;
ok ( con ! = NULL , " failed to open a connection %u \n " , GetLastError ( ) ) ;
req = WinHttpOpenRequest ( con , NULL , NULL , NULL , NULL , NULL , 0 ) ;
ok ( req ! = NULL , " failed to open a request %u \n " , GetLastError ( ) ) ;
ret = WinHttpSendRequest ( req , empty , 0 , NULL , 0 , 0 , 0 ) ;
ok ( ret , " failed to send request %u \n " , GetLastError ( ) ) ;
WinHttpCloseHandle ( req ) ;
WinHttpCloseHandle ( con ) ;
WinHttpCloseHandle ( ses ) ;
}
2008-07-30 22:20:40 +02:00
static void test_SendRequest ( void )
{
HINTERNET session , request , connection ;
DWORD header_len , optional_len , total_len ;
DWORD bytes_rw ;
BOOL ret ;
CHAR buffer [ 256 ] ;
int i ;
static const WCHAR test_site [ ] = { ' c ' , ' r ' , ' o ' , ' s ' , ' s ' , ' o ' , ' v ' , ' e ' , ' r ' , ' . ' ,
' c ' , ' o ' , ' d ' , ' e ' , ' w ' , ' e ' , ' a ' , ' v ' , ' e ' , ' r ' , ' s ' , ' . ' , ' c ' , ' o ' , ' m ' , 0 } ;
static const WCHAR content_type [ ] =
{ ' C ' , ' o ' , ' n ' , ' t ' , ' e ' , ' n ' , ' t ' , ' - ' , ' T ' , ' y ' , ' p ' , ' e ' , ' : ' , ' ' , ' a ' , ' p ' , ' p ' , ' l ' , ' i ' , ' c ' , ' a ' , ' t ' , ' i ' , ' o ' , ' n ' ,
' / ' , ' x ' , ' - ' , ' w ' , ' w ' , ' w ' , ' - ' , ' f ' , ' o ' , ' r ' , ' m ' , ' - ' , ' u ' , ' r ' , ' l ' , ' e ' , ' n ' , ' c ' , ' o ' , ' d ' , ' e ' , ' d ' , 0 } ;
static const WCHAR test_file [ ] = { ' / ' , ' p ' , ' o ' , ' s ' , ' t ' , ' t ' , ' e ' , ' s ' , ' t ' , ' . ' , ' p ' , ' h ' , ' p ' , 0 } ;
static const WCHAR test_verb [ ] = { ' P ' , ' O ' , ' S ' , ' T ' , 0 } ;
static CHAR post_data [ ] = " mode=Test " ;
static CHAR test_post [ ] = " mode => Test \\ 0 \n " ;
header_len = - 1L ;
total_len = optional_len = sizeof ( post_data ) ;
memset ( buffer , 0xff , sizeof ( buffer ) ) ;
session = WinHttpOpen ( test_useragent , WINHTTP_ACCESS_TYPE_DEFAULT_PROXY ,
WINHTTP_NO_PROXY_NAME , WINHTTP_NO_PROXY_BYPASS , 0 ) ;
2008-08-15 14:42:15 +02:00
ok ( session ! = NULL , " WinHttpOpen failed to open session. \n " ) ;
2008-07-30 22:20:40 +02:00
connection = WinHttpConnect ( session , test_site , INTERNET_DEFAULT_HTTP_PORT , 0 ) ;
2008-08-15 14:42:28 +02:00
ok ( connection ! = NULL , " WinHttpConnect failed to open a connection, error: %u. \n " , GetLastError ( ) ) ;
2008-07-30 22:20:40 +02:00
request = WinHttpOpenRequest ( connection , test_verb , test_file , NULL , WINHTTP_NO_REFERER ,
WINHTTP_DEFAULT_ACCEPT_TYPES , WINHTTP_FLAG_BYPASS_PROXY_CACHE ) ;
if ( request = = NULL & & GetLastError ( ) = = ERROR_WINHTTP_NAME_NOT_RESOLVED )
{
skip ( " Network unreachable, skipping. \n " ) ;
goto done ;
}
2008-08-15 14:42:41 +02:00
ok ( request ! = NULL , " WinHttpOpenrequest failed to open a request, error: %u. \n " , GetLastError ( ) ) ;
2008-07-30 22:20:40 +02:00
ret = WinHttpSendRequest ( request , content_type , header_len , post_data , optional_len , total_len , 0 ) ;
2008-08-26 11:03:40 +02:00
ok ( ret = = TRUE , " WinHttpSendRequest failed: %u \n " , GetLastError ( ) ) ;
2008-07-30 22:20:40 +02:00
for ( i = 3 ; post_data [ i ] ; i + + )
{
bytes_rw = - 1 ;
ret = WinHttpWriteData ( request , & post_data [ i ] , 1 , & bytes_rw ) ;
2009-09-10 13:48:45 +02:00
if ( ret )
ok ( bytes_rw = = 1 , " WinHttpWriteData failed, wrote %u bytes instead of 1 byte. \n " , bytes_rw ) ;
else /* Since we already passed all optional data in WinHttpSendRequest Win7 fails our WinHttpWriteData call */
{
ok ( GetLastError ( ) = = ERROR_INVALID_PARAMETER , " Expected ERROR_INVALID_PARAMETER got %u. \n " , GetLastError ( ) ) ;
ok ( bytes_rw = = - 1 , " Expected bytes_rw to remain unchanged. \n " ) ;
}
2008-07-30 22:20:40 +02:00
}
ret = WinHttpReceiveResponse ( request , NULL ) ;
2008-08-26 11:04:04 +02:00
ok ( ret = = TRUE , " WinHttpReceiveResponse failed: %u. \n " , GetLastError ( ) ) ;
2008-07-30 22:20:40 +02:00
bytes_rw = - 1 ;
ret = WinHttpReadData ( request , buffer , sizeof ( buffer ) - 1 , & bytes_rw ) ;
2008-08-26 11:04:43 +02:00
ok ( ret = = TRUE , " WinHttpReadData failed: %u. \n " , GetLastError ( ) ) ;
2008-07-30 22:20:40 +02:00
2008-08-26 11:04:43 +02:00
ok ( bytes_rw = = strlen ( test_post ) , " Read %u bytes instead of %d. \n " , bytes_rw , lstrlen ( test_post ) ) ;
ok ( strncmp ( buffer , test_post , bytes_rw ) = = 0 , " Data read did not match, got '%s'. \n " , buffer ) ;
2008-07-30 22:20:40 +02:00
ret = WinHttpCloseHandle ( request ) ;
2008-08-15 14:42:41 +02:00
ok ( ret = = TRUE , " WinHttpCloseHandle failed on closing request, got %d. \n " , ret ) ;
2008-07-30 22:20:40 +02:00
done :
ret = WinHttpCloseHandle ( connection ) ;
2008-08-15 14:42:28 +02:00
ok ( ret = = TRUE , " WinHttpCloseHandle failed on closing connection, got %d. \n " , ret ) ;
2008-07-30 22:20:40 +02:00
ret = WinHttpCloseHandle ( session ) ;
2008-08-15 14:42:15 +02:00
ok ( ret = = TRUE , " WinHttpCloseHandle failed on closing session, got %d. \n " , ret ) ;
2008-07-30 22:20:40 +02:00
}
2008-08-14 23:54:18 +02:00
static void test_WinHttpTimeFromSystemTime ( void )
{
BOOL ret ;
static const SYSTEMTIME time = { 2008 , 7 , 1 , 28 , 10 , 5 , 52 , 0 } ;
static const WCHAR expected_string [ ] =
{ ' M ' , ' o ' , ' n ' , ' , ' , ' ' , ' 2 ' , ' 8 ' , ' ' , ' J ' , ' u ' , ' l ' , ' ' , ' 2 ' , ' 0 ' , ' 0 ' , ' 8 ' , ' ' ,
' 1 ' , ' 0 ' , ' : ' , ' 0 ' , ' 5 ' , ' : ' , ' 5 ' , ' 2 ' , ' ' , ' G ' , ' M ' , ' T ' , 0 } ;
WCHAR time_string [ WINHTTP_TIME_FORMAT_BUFSIZE + 1 ] ;
ret = WinHttpTimeFromSystemTime ( & time , time_string ) ;
2008-08-15 14:44:16 +02:00
ok ( ret = = TRUE , " WinHttpTimeFromSystemTime failed: %u \n " , GetLastError ( ) ) ;
ok ( memcmp ( time_string , expected_string , sizeof ( expected_string ) ) = = 0 ,
2008-08-14 23:54:18 +02:00
" Time string returned did not match expected time string. \n " ) ;
}
2008-08-14 23:56:07 +02:00
static void test_WinHttpTimeToSystemTime ( void )
{
BOOL ret ;
SYSTEMTIME time ;
static const SYSTEMTIME expected_time = { 2008 , 7 , 1 , 28 , 10 , 5 , 52 , 0 } ;
static const WCHAR time_string1 [ ] =
{ ' M ' , ' o ' , ' n ' , ' , ' , ' ' , ' 2 ' , ' 8 ' , ' ' , ' J ' , ' u ' , ' l ' , ' ' , ' 2 ' , ' 0 ' , ' 0 ' , ' 8 ' , ' ' ,
+ ' 1 ' , ' 0 ' , ' : ' , ' 0 ' , ' 5 ' , ' : ' , ' 5 ' , ' 2 ' , ' ' , ' G ' , ' M ' , ' T ' , ' \n ' , 0 } ;
static const WCHAR time_string2 [ ] =
{ ' ' , ' m ' , ' o ' , ' n ' , ' ' , ' 2 ' , ' 8 ' , ' ' , ' j ' , ' u ' , ' l ' , ' ' , ' 2 ' , ' 0 ' , ' 0 ' , ' 8 ' , ' ' ,
' 1 ' , ' 0 ' , ' ' , ' 0 ' , ' 5 ' , ' ' , ' 5 ' , ' 2 ' , ' \n ' , 0 } ;
ret = WinHttpTimeToSystemTime ( time_string1 , & time ) ;
2008-08-15 14:44:16 +02:00
ok ( ret = = TRUE , " WinHttpTimeToSystemTime failed: %u \n " , GetLastError ( ) ) ;
ok ( memcmp ( & time , & expected_time , sizeof ( SYSTEMTIME ) ) = = 0 ,
2008-08-14 23:56:07 +02:00
" Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure. \n " ) ;
ret = WinHttpTimeToSystemTime ( time_string2 , & time ) ;
2008-08-15 14:44:16 +02:00
ok ( ret = = TRUE , " WinHttpTimeToSystemTime failed: %u \n " , GetLastError ( ) ) ;
ok ( memcmp ( & time , & expected_time , sizeof ( SYSTEMTIME ) ) = = 0 ,
2008-08-14 23:56:07 +02:00
" Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure. \n " ) ;
}
2008-08-14 23:50:18 +02:00
static void test_WinHttpAddHeaders ( void )
{
HINTERNET session , request , connection ;
2009-09-10 13:48:45 +02:00
BOOL ret , reverse ;
2008-08-14 23:50:18 +02:00
WCHAR buffer [ MAX_PATH ] ;
WCHAR check_buffer [ MAX_PATH ] ;
DWORD index , len , oldlen ;
static const WCHAR test_site [ ] = { ' c ' , ' r ' , ' o ' , ' s ' , ' s ' , ' o ' , ' v ' , ' e ' , ' r ' , ' . ' ,
' c ' , ' o ' , ' d ' , ' e ' , ' w ' , ' e ' , ' a ' , ' v ' , ' e ' , ' r ' , ' s ' , ' . ' , ' c ' , ' o ' , ' m ' , 0 } ;
static const WCHAR test_file [ ] = { ' / ' , ' p ' , ' o ' , ' s ' , ' t ' , ' t ' , ' e ' , ' s ' , ' t ' , ' . ' , ' p ' , ' h ' , ' p ' , 0 } ;
static const WCHAR test_verb [ ] = { ' P ' , ' O ' , ' S ' , ' T ' , 0 } ;
static const WCHAR test_header_begin [ ] =
{ ' P ' , ' O ' , ' S ' , ' T ' , ' ' , ' / ' , ' p ' , ' o ' , ' s ' , ' t ' , ' t ' , ' e ' , ' s ' , ' t ' , ' . ' , ' p ' , ' h ' , ' p ' , ' ' , ' H ' , ' T ' , ' T ' , ' P ' , ' / ' , ' 1 ' } ;
2009-07-14 22:04:20 +02:00
static const WCHAR full_path_test_header_begin [ ] =
{ ' P ' , ' O ' , ' S ' , ' T ' , ' ' , ' h ' , ' t ' , ' t ' , ' p ' , ' : ' , ' / ' , ' / ' , ' c ' , ' r ' , ' o ' , ' s ' , ' s ' , ' o ' , ' v ' , ' e ' , ' r ' , ' . ' , ' c ' , ' o ' , ' d ' , ' e ' , ' w ' , ' e ' , ' a ' , ' v ' , ' e ' , ' r ' , ' s ' , ' . ' , ' c ' , ' o ' , ' m ' , ' : ' , ' 8 ' , ' 0 ' , ' / ' , ' p ' , ' o ' , ' s ' , ' t ' , ' t ' , ' e ' , ' s ' , ' t ' , ' . ' , ' p ' , ' h ' , ' p ' , ' ' , ' H ' , ' T ' , ' T ' , ' P ' , ' / ' , ' 1 ' } ;
2008-08-14 23:50:18 +02:00
static const WCHAR test_header_end [ ] = { ' \r ' , ' \n ' , ' \r ' , ' \n ' , 0 } ;
static const WCHAR test_header_name [ ] = { ' W ' , ' a ' , ' r ' , ' n ' , ' i ' , ' n ' , ' g ' , 0 } ;
static const WCHAR test_flag_coalesce [ ] = { ' t ' , ' e ' , ' s ' , ' t ' , ' 2 ' , ' , ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 4 ' , 0 } ;
2009-09-10 13:48:45 +02:00
static const WCHAR test_flag_coalesce_reverse [ ] = { ' t ' , ' e ' , ' s ' , ' t ' , ' 3 ' , ' , ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 4 ' , 0 } ;
2008-08-14 23:50:18 +02:00
static const WCHAR test_flag_coalesce_comma [ ] =
{ ' t ' , ' e ' , ' s ' , ' t ' , ' 2 ' , ' , ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 4 ' , ' , ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 5 ' , 0 } ;
2009-09-10 13:48:45 +02:00
static const WCHAR test_flag_coalesce_comma_reverse [ ] =
{ ' t ' , ' e ' , ' s ' , ' t ' , ' 3 ' , ' , ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 4 ' , ' , ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 5 ' , 0 } ;
2008-08-14 23:50:18 +02:00
static const WCHAR test_flag_coalesce_semicolon [ ] =
{ ' t ' , ' e ' , ' s ' , ' t ' , ' 2 ' , ' , ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 4 ' , ' , ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 5 ' , ' ; ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 6 ' , 0 } ;
2009-09-10 13:48:45 +02:00
static const WCHAR test_flag_coalesce_semicolon_reverse [ ] =
{ ' t ' , ' e ' , ' s ' , ' t ' , ' 3 ' , ' , ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 4 ' , ' , ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 5 ' , ' ; ' , ' ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 6 ' , 0 } ;
2008-08-14 23:50:18 +02:00
2008-08-20 11:37:53 +02:00
static const WCHAR field [ ] = { ' f ' , ' i ' , ' e ' , ' l ' , ' d ' , 0 } ;
static const WCHAR value [ ] = { ' v ' , ' a ' , ' l ' , ' u ' , ' e ' , ' ' , 0 } ;
2009-09-10 13:48:45 +02:00
static const WCHAR value_nospace [ ] = { ' v ' , ' a ' , ' l ' , ' u ' , ' e ' , 0 } ;
2008-08-20 11:37:53 +02:00
2008-08-14 23:50:18 +02:00
static const WCHAR test_headers [ ] [ 14 ] =
{
{ ' W ' , ' a ' , ' r ' , ' n ' , ' i ' , ' n ' , ' g ' , ' : ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 1 ' , 0 } ,
{ ' W ' , ' a ' , ' r ' , ' n ' , ' i ' , ' n ' , ' g ' , ' : ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 2 ' , 0 } ,
{ ' W ' , ' a ' , ' r ' , ' n ' , ' i ' , ' n ' , ' g ' , ' : ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 3 ' , 0 } ,
{ ' W ' , ' a ' , ' r ' , ' n ' , ' i ' , ' n ' , ' g ' , ' : ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 4 ' , 0 } ,
{ ' W ' , ' a ' , ' r ' , ' n ' , ' i ' , ' n ' , ' g ' , ' : ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 5 ' , 0 } ,
{ ' W ' , ' a ' , ' r ' , ' n ' , ' i ' , ' n ' , ' g ' , ' : ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 6 ' , 0 } ,
2008-08-20 11:37:53 +02:00
{ ' W ' , ' a ' , ' r ' , ' n ' , ' i ' , ' n ' , ' g ' , ' : ' , ' t ' , ' e ' , ' s ' , ' t ' , ' 7 ' , 0 } ,
{ 0 } ,
{ ' : ' , 0 } ,
{ ' a ' , ' : ' , 0 } ,
{ ' : ' , ' b ' , 0 } ,
{ ' c ' , ' d ' , 0 } ,
{ ' ' , ' e ' , ' ' , ' : ' , ' f ' , 0 } ,
{ ' f ' , ' i ' , ' e ' , ' l ' , ' d ' , ' : ' , ' ' , ' v ' , ' a ' , ' l ' , ' u ' , ' e ' , ' ' , 0 }
2008-08-14 23:50:18 +02:00
} ;
static const WCHAR test_indices [ ] [ 6 ] =
{
{ ' t ' , ' e ' , ' s ' , ' t ' , ' 1 ' , 0 } ,
{ ' t ' , ' e ' , ' s ' , ' t ' , ' 2 ' , 0 } ,
{ ' t ' , ' e ' , ' s ' , ' t ' , ' 3 ' , 0 } ,
{ ' t ' , ' e ' , ' s ' , ' t ' , ' 4 ' , 0 }
} ;
session = WinHttpOpen ( test_useragent , WINHTTP_ACCESS_TYPE_DEFAULT_PROXY ,
WINHTTP_NO_PROXY_NAME , WINHTTP_NO_PROXY_BYPASS , 0 ) ;
2008-08-15 14:42:15 +02:00
ok ( session ! = NULL , " WinHttpOpen failed to open session. \n " ) ;
2008-08-14 23:50:18 +02:00
connection = WinHttpConnect ( session , test_site , INTERNET_DEFAULT_HTTP_PORT , 0 ) ;
2008-08-15 14:42:28 +02:00
ok ( connection ! = NULL , " WinHttpConnect failed to open a connection, error: %u. \n " , GetLastError ( ) ) ;
2008-08-14 23:50:18 +02:00
request = WinHttpOpenRequest ( connection , test_verb , test_file , NULL , WINHTTP_NO_REFERER ,
WINHTTP_DEFAULT_ACCEPT_TYPES , 0 ) ;
if ( request = = NULL & & GetLastError ( ) = = ERROR_WINHTTP_NAME_NOT_RESOLVED )
{
skip ( " Network unreachable, skipping. \n " ) ;
goto done ;
}
2008-08-15 14:42:41 +02:00
ok ( request ! = NULL , " WinHttpOpenRequest failed to open a request, error: %u. \n " , GetLastError ( ) ) ;
2008-08-14 23:50:18 +02:00
index = 0 ;
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-09-01 17:01:59 +02:00
ok ( ret = = FALSE , " WinHttpQueryHeaders unexpectedly succeeded, found 'Warning' header. \n " ) ;
2008-08-14 23:50:18 +02:00
ret = WinHttpAddRequestHeaders ( request , test_headers [ 0 ] , - 1L , WINHTTP_ADDREQ_FLAG_ADD ) ;
2008-08-20 11:35:39 +02:00
ok ( ret = = TRUE , " WinHttpAddRequestHeader failed to add new header, got %d with error %u. \n " , ret , GetLastError ( ) ) ;
2008-08-14 23:50:18 +02:00
index = 0 ;
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 1 , " WinHttpQueryHeaders failed: header index not incremented \n " ) ;
ok ( memcmp ( buffer , test_indices [ 0 ] , sizeof ( test_indices [ 0 ] ) ) = = 0 , " WinHttpQueryHeaders failed: incorrect string returned \n " ) ;
ok ( len = = 5 * sizeof ( WCHAR ) , " WinHttpQueryHeaders failed: invalid length returned, expected 5, got %d \n " , len ) ;
2008-08-14 23:50:18 +02:00
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
ok ( ret = = FALSE , " WinHttpQueryHeaders unexpectedly succeeded, second index should not exist. \n " ) ;
2008-09-01 17:01:17 +02:00
/* Try to fetch the header info with a buffer that's big enough to fit the
* string but not the NULL terminator .
*/
2008-08-14 23:50:18 +02:00
index = 0 ;
len = 5 * sizeof ( WCHAR ) ;
2008-09-16 11:51:58 +02:00
memset ( check_buffer , 0xab , sizeof ( check_buffer ) ) ;
2008-08-14 23:50:18 +02:00
memcpy ( buffer , check_buffer , sizeof ( buffer ) ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-09-01 17:01:17 +02:00
ok ( ret = = FALSE , " WinHttpQueryHeaders unexpectedly succeeded with a buffer that's too small. \n " ) ;
2008-08-14 23:50:18 +02:00
ok ( memcmp ( buffer , check_buffer , sizeof ( buffer ) ) = = 0 ,
" WinHttpQueryHeaders failed, modified the buffer when it should not have. \n " ) ;
2008-08-20 11:36:23 +02:00
ok ( len = = 6 * sizeof ( WCHAR ) , " WinHttpQueryHeaders returned invalid length, expected 12, got %d \n " , len ) ;
2008-08-14 23:50:18 +02:00
/* Try with a NULL buffer */
index = 0 ;
len = sizeof ( buffer ) ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_RAW_HEADERS_CRLF | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , NULL , & len , & index ) ;
ok ( ret = = FALSE , " WinHttpQueryHeaders unexpectedly succeeded. \n " ) ;
2008-09-05 14:11:46 +02:00
ok ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER , " Expected ERROR_INSUFFICIENT_BUFFER, got %u \n " , GetLastError ( ) ) ;
2008-08-20 11:37:17 +02:00
ok ( len > 40 , " WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d \n " , len ) ;
2008-08-14 23:50:18 +02:00
ok ( index = = 0 , " WinHttpQueryHeaders incorrectly incremented header index. \n " ) ;
2008-09-01 17:01:17 +02:00
/* Try with a NULL buffer and a length that's too small */
2008-08-14 23:50:18 +02:00
index = 0 ;
len = 10 ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_RAW_HEADERS_CRLF | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , NULL , & len , & index ) ;
ok ( ret = = FALSE , " WinHttpQueryHeaders unexpectedly succeeded. \n " ) ;
2008-08-20 11:36:23 +02:00
ok ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER ,
" WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICENT_BUFFER, go %u \n " , GetLastError ( ) ) ;
2008-08-20 11:37:17 +02:00
ok ( len > 40 , " WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d \n " , len ) ;
2008-08-14 23:50:18 +02:00
ok ( index = = 0 , " WinHttpQueryHeaders incorrectly incremented header index. \n " ) ;
index = 0 ;
len = 0 ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_RAW_HEADERS_CRLF | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , NULL , & len , & index ) ;
ok ( ret = = FALSE , " WinHttpQueryHeaders unexpectedly succeeded. \n " ) ;
2008-08-20 11:36:23 +02:00
ok ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER ,
" WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u \n " , GetLastError ( ) ) ;
2008-08-20 11:37:17 +02:00
ok ( len > 40 , " WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d \n " , len ) ;
2008-08-14 23:50:18 +02:00
ok ( index = = 0 , " WinHttpQueryHeaders failed: index was incremented. \n " ) ;
/* valid query */
oldlen = len ;
index = 0 ;
len = sizeof ( buffer ) ;
memset ( buffer , 0xff , sizeof ( buffer ) ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_RAW_HEADERS_CRLF | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: got %d \n " , ret ) ;
ok ( len + sizeof ( WCHAR ) < = oldlen , " WinHttpQueryHeaders resulting length longer than advertized. \n " ) ;
ok ( ( len < sizeof ( buffer ) - sizeof ( WCHAR ) ) & & buffer [ len / sizeof ( WCHAR ) ] = = 0 , " WinHttpQueryHeaders did not append NULL terminator \n " ) ;
ok ( len = = lstrlenW ( buffer ) * sizeof ( WCHAR ) , " WinHttpQueryHeaders returned incorrect length. \n " ) ;
2009-07-14 22:04:20 +02:00
ok ( memcmp ( buffer , test_header_begin , sizeof ( test_header_begin ) ) = = 0 | |
memcmp ( buffer , full_path_test_header_begin , sizeof ( full_path_test_header_begin ) ) = = 0 ,
2008-08-20 11:37:17 +02:00
" WinHttpQueryHeaders returned invalid beginning of header string. \n " ) ;
ok ( memcmp ( buffer + lstrlenW ( buffer ) - 4 , test_header_end , sizeof ( test_header_end ) ) = = 0 ,
" WinHttpQueryHeaders returned invalid end of header string. \n " ) ;
2008-08-14 23:50:18 +02:00
ok ( index = = 0 , " WinHttpQueryHeaders incremented header index. \n " ) ;
2008-09-05 14:11:46 +02:00
index = 0 ;
len = 0 ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_RAW_HEADERS | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , NULL , & len , & index ) ;
ok ( ret = = FALSE , " WinHttpQueryHeaders unexpectedly succeeded. \n " ) ;
ok ( GetLastError ( ) = = ERROR_INSUFFICIENT_BUFFER ,
" WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u \n " , GetLastError ( ) ) ;
ok ( len > 40 , " WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d \n " , len ) ;
ok ( index = = 0 , " WinHttpQueryHeaders failed: index was incremented. \n " ) ;
oldlen = len ;
index = 0 ;
len = sizeof ( buffer ) ;
memset ( buffer , 0xff , sizeof ( buffer ) ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_RAW_HEADERS | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
ok ( ret = = TRUE , " WinHttpQueryHeaders failed %u \n " , GetLastError ( ) ) ;
ok ( len + sizeof ( WCHAR ) < = oldlen , " resulting length longer than advertized \n " ) ;
ok ( ( len < sizeof ( buffer ) - sizeof ( WCHAR ) ) & & ! buffer [ len / sizeof ( WCHAR ) ] & & ! buffer [ len / sizeof ( WCHAR ) - 1 ] ,
" no double NULL terminator \n " ) ;
2009-07-14 22:04:20 +02:00
ok ( memcmp ( buffer , test_header_begin , sizeof ( test_header_begin ) ) = = 0 | |
memcmp ( buffer , full_path_test_header_begin , sizeof ( full_path_test_header_begin ) ) = = 0 ,
" invalid beginning of header string. \n " ) ;
2008-09-05 14:11:46 +02:00
ok ( index = = 0 , " header index was incremented \n " ) ;
2008-08-14 23:50:18 +02:00
/* tests for more indices */
ret = WinHttpAddRequestHeaders ( request , test_headers [ 1 ] , - 1L , WINHTTP_ADDREQ_FLAG_ADD ) ;
2008-08-20 11:35:39 +02:00
ok ( ret = = TRUE , " WinHttpAddRequestHeaders failed to add duplicate header: %d \n " , ret ) ;
2008-08-14 23:50:18 +02:00
index = 0 ;
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 1 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
ok ( memcmp ( buffer , test_indices [ 0 ] , sizeof ( test_indices [ 0 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 2 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
ok ( memcmp ( buffer , test_indices [ 1 ] , sizeof ( test_indices [ 1 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-14 23:50:18 +02:00
ret = WinHttpAddRequestHeaders ( request , test_headers [ 2 ] , - 1L , WINHTTP_ADDREQ_FLAG_REPLACE ) ;
2008-08-20 11:35:39 +02:00
ok ( ret = = TRUE , " WinHttpAddRequestHeaders failed to add duplicate header. \n " ) ;
2008-08-14 23:50:18 +02:00
index = 0 ;
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 1 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
reverse = ( memcmp ( buffer , test_indices [ 1 ] , sizeof ( test_indices [ 1 ] ) ) ! = 0 ) ; /* Win7 returns values in reverse order of adding */
ok ( memcmp ( buffer , test_indices [ reverse ? 2 : 1 ] , sizeof ( test_indices [ reverse ? 2 : 1 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-20 11:36:23 +02:00
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 2 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , test_indices [ reverse ? 1 : 2 ] , sizeof ( test_indices [ reverse ? 1 : 2 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-14 23:50:18 +02:00
/* add if new flag */
ret = WinHttpAddRequestHeaders ( request , test_headers [ 3 ] , - 1L , WINHTTP_ADDREQ_FLAG_ADD_IF_NEW ) ;
ok ( ret = = FALSE , " WinHttpAddRequestHeaders incorrectly replaced existing header. \n " ) ;
index = 0 ;
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 1 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , test_indices [ reverse ? 2 : 1 ] , sizeof ( test_indices [ reverse ? 2 : 1 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-20 11:36:23 +02:00
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 2 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , test_indices [ reverse ? 1 : 2 ] , sizeof ( test_indices [ reverse ? 1 : 2 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-20 11:36:23 +02:00
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
ok ( ret = = FALSE , " WinHttpQueryHeaders succeeded unexpectedly, found third header. \n " ) ;
/* coalesce flag */
ret = WinHttpAddRequestHeaders ( request , test_headers [ 3 ] , - 1L , WINHTTP_ADDREQ_FLAG_COALESCE ) ;
2008-08-20 11:35:39 +02:00
ok ( ret = = TRUE , " WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE. \n " ) ;
2008-08-14 23:50:18 +02:00
index = 0 ;
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 1 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , reverse ? test_flag_coalesce_reverse : test_flag_coalesce , sizeof ( reverse ? test_flag_coalesce_reverse : test_flag_coalesce ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-20 11:36:23 +02:00
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 2 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , test_indices [ reverse ? 1 : 2 ] , sizeof ( test_indices [ reverse ? 1 : 2 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-20 11:36:23 +02:00
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
ok ( ret = = FALSE , " WinHttpQueryHeaders succeeded unexpectedly, found third header. \n " ) ;
/* coalesce with comma flag */
ret = WinHttpAddRequestHeaders ( request , test_headers [ 4 ] , - 1L , WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA ) ;
2008-08-20 11:35:39 +02:00
ok ( ret = = TRUE , " WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA. \n " ) ;
2008-08-14 23:50:18 +02:00
index = 0 ;
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 1 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , reverse ? test_flag_coalesce_comma_reverse : test_flag_coalesce_comma , sizeof ( reverse ? test_flag_coalesce_comma_reverse : test_flag_coalesce_comma ) ) = = 0 ,
2008-08-20 11:36:23 +02:00
" WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 2 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , test_indices [ reverse ? 1 : 2 ] , sizeof ( test_indices [ reverse ? 1 : 2 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-20 11:36:23 +02:00
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
ok ( ret = = FALSE , " WinHttpQueryHeaders succeeded unexpectedly, found third header. \n " ) ;
/* coalesce with semicolon flag */
ret = WinHttpAddRequestHeaders ( request , test_headers [ 5 ] , - 1L , WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON ) ;
2008-08-20 11:35:39 +02:00
ok ( ret = = TRUE , " WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON. \n " ) ;
2008-08-14 23:50:18 +02:00
index = 0 ;
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 1 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , reverse ? test_flag_coalesce_semicolon_reverse : test_flag_coalesce_semicolon , sizeof ( reverse ? test_flag_coalesce_semicolon_reverse : test_flag_coalesce_semicolon ) ) = = 0 ,
2008-08-14 23:50:18 +02:00
" WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-20 11:36:23 +02:00
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 2 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , test_indices [ reverse ? 1 : 2 ] , sizeof ( test_indices [ reverse ? 1 : 2 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-20 11:36:23 +02:00
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
ok ( ret = = FALSE , " WinHttpQueryHeaders succeeded unexpectedly, found third header. \n " ) ;
/* add and replace flags */
ret = WinHttpAddRequestHeaders ( request , test_headers [ 3 ] , - 1L , WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE ) ;
2008-08-20 11:35:39 +02:00
ok ( ret = = TRUE , " WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE. \n " ) ;
2008-08-14 23:50:18 +02:00
index = 0 ;
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 1 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , test_indices [ reverse ? 3 : 2 ] , sizeof ( test_indices [ reverse ? 3 : 2 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-20 11:36:23 +02:00
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
2008-08-20 11:36:23 +02:00
ok ( ret = = TRUE , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
ok ( index = = 2 , " WinHttpQueryHeaders failed to increment index. \n " ) ;
2009-09-10 13:48:45 +02:00
ok ( memcmp ( buffer , test_indices [ reverse ? 1 : 3 ] , sizeof ( test_indices [ reverse ? 1 : 3 ] ) ) = = 0 , " WinHttpQueryHeaders returned incorrect string. \n " ) ;
2008-08-20 11:36:23 +02:00
2008-08-14 23:50:18 +02:00
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
test_header_name , buffer , & len , & index ) ;
ok ( ret = = FALSE , " WinHttpQueryHeaders succeeded unexpectedly, found third header. \n " ) ;
2009-01-03 20:15:00 +01:00
ret = WinHttpAddRequestHeaders ( request , test_headers [ 8 ] , ~ 0u , WINHTTP_ADDREQ_FLAG_ADD ) ;
2008-08-20 11:37:53 +02:00
ok ( ! ret , " WinHttpAddRequestHeaders failed \n " ) ;
2009-01-03 20:15:00 +01:00
ret = WinHttpAddRequestHeaders ( request , test_headers [ 9 ] , ~ 0u , WINHTTP_ADDREQ_FLAG_ADD ) ;
2008-08-20 11:37:53 +02:00
ok ( ret , " WinHttpAddRequestHeaders failed \n " ) ;
2009-01-03 20:15:00 +01:00
ret = WinHttpAddRequestHeaders ( request , test_headers [ 10 ] , ~ 0u , WINHTTP_ADDREQ_FLAG_ADD ) ;
2008-08-20 11:37:53 +02:00
ok ( ! ret , " WinHttpAddRequestHeaders failed \n " ) ;
2009-01-03 20:15:00 +01:00
ret = WinHttpAddRequestHeaders ( request , test_headers [ 11 ] , ~ 0u , WINHTTP_ADDREQ_FLAG_ADD ) ;
2008-08-20 11:37:53 +02:00
ok ( ! ret , " WinHttpAddRequestHeaders failed \n " ) ;
2009-01-03 20:15:00 +01:00
ret = WinHttpAddRequestHeaders ( request , test_headers [ 12 ] , ~ 0u , WINHTTP_ADDREQ_FLAG_ADD ) ;
2008-08-20 11:37:53 +02:00
ok ( ! ret , " WinHttpAddRequestHeaders failed \n " ) ;
2009-01-03 20:15:00 +01:00
ret = WinHttpAddRequestHeaders ( request , test_headers [ 13 ] , ~ 0u , WINHTTP_ADDREQ_FLAG_ADD ) ;
2008-08-20 11:37:53 +02:00
ok ( ret , " WinHttpAddRequestHeaders failed \n " ) ;
index = 0 ;
buffer [ 0 ] = 0 ;
len = sizeof ( buffer ) ;
ret = WinHttpQueryHeaders ( request , WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS ,
field , buffer , & len , & index ) ;
ok ( ret , " WinHttpQueryHeaders failed: %u \n " , GetLastError ( ) ) ;
2009-09-10 13:48:45 +02:00
ok ( ! memcmp ( buffer , value , sizeof ( value ) ) | | ! memcmp ( buffer , value_nospace , sizeof ( value_nospace ) ) , " unexpected result \n " ) ;
2008-08-20 11:37:53 +02:00
2008-08-14 23:50:18 +02:00
ret = WinHttpCloseHandle ( request ) ;
2008-08-15 14:42:41 +02:00
ok ( ret = = TRUE , " WinHttpCloseHandle failed on closing request, got %d. \n " , ret ) ;
2008-08-14 23:50:18 +02:00
done :
ret = WinHttpCloseHandle ( connection ) ;
2008-08-15 14:42:28 +02:00
ok ( ret = = TRUE , " WinHttpCloseHandle failed on closing connection, got %d. \n " , ret ) ;
2008-08-14 23:50:18 +02:00
ret = WinHttpCloseHandle ( session ) ;
2008-08-15 14:42:15 +02:00
ok ( ret = = TRUE , " WinHttpCloseHandle failed on closing session, got %d. \n " , ret ) ;
2008-08-14 23:50:18 +02:00
}
2008-08-28 13:50:03 +02:00
static void test_secure_connection ( void )
{
static const WCHAR google [ ] = { ' w ' , ' w ' , ' w ' , ' . ' , ' g ' , ' o ' , ' o ' , ' g ' , ' l ' , ' e ' , ' . ' , ' c ' , ' o ' , ' m ' , 0 } ;
HANDLE ses , con , req ;
2008-09-08 22:01:39 +02:00
DWORD size , status , policy , bitness ;
2008-08-28 13:50:03 +02:00
BOOL ret ;
2008-09-08 22:01:39 +02:00
CERT_CONTEXT * cert ;
2008-08-28 13:50:03 +02:00
ses = WinHttpOpen ( test_useragent , 0 , NULL , NULL , 0 ) ;
ok ( ses ! = NULL , " failed to open session %u \n " , GetLastError ( ) ) ;
2008-09-03 16:58:06 +02:00
policy = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS ;
ret = WinHttpSetOption ( ses , WINHTTP_OPTION_REDIRECT_POLICY , & policy , sizeof ( policy ) ) ;
ok ( ret , " failed to set redirect policy %u \n " , GetLastError ( ) ) ;
2008-08-28 13:50:03 +02:00
con = WinHttpConnect ( ses , google , 443 , 0 ) ;
ok ( con ! = NULL , " failed to open a connection %u \n " , GetLastError ( ) ) ;
/* try without setting WINHTTP_FLAG_SECURE */
req = WinHttpOpenRequest ( con , NULL , NULL , NULL , NULL , NULL , 0 ) ;
ok ( req ! = NULL , " failed to open a request %u \n " , GetLastError ( ) ) ;
ret = WinHttpSendRequest ( req , NULL , 0 , NULL , 0 , 0 , 0 ) ;
ok ( ret , " failed to send request %u \n " , GetLastError ( ) ) ;
ret = WinHttpReceiveResponse ( req , NULL ) ;
ok ( ! ret , " succeeded unexpectedly \n " ) ;
size = 0 ;
ret = WinHttpQueryHeaders ( req , WINHTTP_QUERY_RAW_HEADERS_CRLF , NULL , NULL , & size , NULL ) ;
ok ( ! ret , " succeeded unexpectedly \n " ) ;
WinHttpCloseHandle ( req ) ;
req = WinHttpOpenRequest ( con , NULL , NULL , NULL , NULL , NULL , WINHTTP_FLAG_SECURE ) ;
ok ( req ! = NULL , " failed to open a request %u \n " , GetLastError ( ) ) ;
ret = WinHttpSendRequest ( req , NULL , 0 , NULL , 0 , 0 , 0 ) ;
ok ( ret , " failed to send request %u \n " , GetLastError ( ) ) ;
2009-12-11 23:10:27 +01:00
if ( ! ret )
{
skip ( " secure connection failed, skipping remaining secure tests \n " ) ;
goto cleanup ;
}
2008-08-28 13:50:03 +02:00
2008-09-08 22:01:39 +02:00
size = sizeof ( cert ) ;
ret = WinHttpQueryOption ( req , WINHTTP_OPTION_SERVER_CERT_CONTEXT , & cert , & size ) ;
ok ( ret , " failed to retrieve certificate context %u \n " , GetLastError ( ) ) ;
2009-12-08 22:43:49 +01:00
if ( ret )
CertFreeCertificateContext ( cert ) ;
2008-09-08 22:01:39 +02:00
size = sizeof ( bitness ) ;
ret = WinHttpQueryOption ( req , WINHTTP_OPTION_SECURITY_KEY_BITNESS , & bitness , & size ) ;
ok ( ret , " failed to retrieve key bitness %u \n " , GetLastError ( ) ) ;
2008-08-28 13:50:03 +02:00
ret = WinHttpReceiveResponse ( req , NULL ) ;
ok ( ret , " failed to receive response %u \n " , GetLastError ( ) ) ;
2008-09-03 12:31:09 +02:00
size = sizeof ( status ) ;
ret = WinHttpQueryHeaders ( req , WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER , NULL , & status , & size , NULL ) ;
ok ( ret , " failed unexpectedly %u \n " , GetLastError ( ) ) ;
2008-09-03 16:58:06 +02:00
ok ( status = = 200 , " request failed unexpectedly %u \n " , status ) ;
2008-09-03 12:31:09 +02:00
2008-08-28 13:50:03 +02:00
size = 0 ;
ret = WinHttpQueryHeaders ( req , WINHTTP_QUERY_RAW_HEADERS_CRLF , NULL , NULL , & size , NULL ) ;
ok ( ! ret , " succeeded unexpectedly \n " ) ;
2009-12-11 23:10:27 +01:00
cleanup :
2008-08-28 13:50:03 +02:00
WinHttpCloseHandle ( req ) ;
WinHttpCloseHandle ( con ) ;
WinHttpCloseHandle ( ses ) ;
}
2008-08-28 13:51:41 +02:00
static void test_request_parameter_defaults ( void )
{
static const WCHAR empty [ ] = { 0 } ;
static const WCHAR codeweavers [ ] = { ' c ' , ' o ' , ' d ' , ' e ' , ' w ' , ' e ' , ' a ' , ' v ' , ' e ' , ' r ' , ' s ' , ' . ' , ' c ' , ' o ' , ' m ' , 0 } ;
HANDLE ses , con , req ;
2009-10-29 11:12:45 +01:00
DWORD size , status , error ;
WCHAR * version ;
2008-08-28 13:51:41 +02:00
BOOL ret ;
ses = WinHttpOpen ( test_useragent , 0 , NULL , NULL , 0 ) ;
ok ( ses ! = NULL , " failed to open session %u \n " , GetLastError ( ) ) ;
con = WinHttpConnect ( ses , codeweavers , 0 , 0 ) ;
ok ( con ! = NULL , " failed to open a connection %u \n " , GetLastError ( ) ) ;
req = WinHttpOpenRequest ( con , NULL , NULL , NULL , NULL , NULL , 0 ) ;
ok ( req ! = NULL , " failed to open a request %u \n " , GetLastError ( ) ) ;
ret = WinHttpSendRequest ( req , NULL , 0 , NULL , 0 , 0 , 0 ) ;
ok ( ret , " failed to send request %u \n " , GetLastError ( ) ) ;
ret = WinHttpReceiveResponse ( req , NULL ) ;
ok ( ret , " failed to receive response %u \n " , GetLastError ( ) ) ;
2008-09-03 12:31:09 +02:00
size = sizeof ( status ) ;
ret = WinHttpQueryHeaders ( req , WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER , NULL , & status , & size , NULL ) ;
ok ( ret , " failed unexpectedly %u \n " , GetLastError ( ) ) ;
ok ( status = = 200 , " request failed unexpectedly %u \n " , status ) ;
2008-08-28 13:51:41 +02:00
WinHttpCloseHandle ( req ) ;
req = WinHttpOpenRequest ( con , empty , empty , empty , NULL , NULL , 0 ) ;
ok ( req ! = NULL , " failed to open a request %u \n " , GetLastError ( ) ) ;
ret = WinHttpSendRequest ( req , NULL , 0 , NULL , 0 , 0 , 0 ) ;
ok ( ret , " failed to send request %u \n " , GetLastError ( ) ) ;
ret = WinHttpReceiveResponse ( req , NULL ) ;
ok ( ret , " failed to receive response %u \n " , GetLastError ( ) ) ;
2009-10-29 11:12:45 +01:00
size = 0 ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpQueryHeaders ( req , WINHTTP_QUERY_VERSION , NULL , NULL , & size , NULL ) ;
error = GetLastError ( ) ;
ok ( ! ret , " succeeded unexpectedly \n " ) ;
ok ( error = = ERROR_INSUFFICIENT_BUFFER , " expected ERROR_INSUFFICIENT_BUFFER, got %u \n " , error ) ;
version = HeapAlloc ( GetProcessHeap ( ) , 0 , size ) ;
ret = WinHttpQueryHeaders ( req , WINHTTP_QUERY_VERSION , NULL , version , & size , NULL ) ;
ok ( ret , " failed unexpectedly %u \n " , GetLastError ( ) ) ;
ok ( lstrlenW ( version ) = = size / sizeof ( WCHAR ) , " unexpected size %u \n " , size ) ;
HeapFree ( GetProcessHeap ( ) , 0 , version ) ;
2008-09-03 12:31:09 +02:00
size = sizeof ( status ) ;
ret = WinHttpQueryHeaders ( req , WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER , NULL , & status , & size , NULL ) ;
ok ( ret , " failed unexpectedly %u \n " , GetLastError ( ) ) ;
ok ( status = = 200 , " request failed unexpectedly %u \n " , status ) ;
2008-08-28 13:51:41 +02:00
WinHttpCloseHandle ( req ) ;
WinHttpCloseHandle ( con ) ;
WinHttpCloseHandle ( ses ) ;
}
2009-07-14 21:36:41 +02:00
static const WCHAR Connections [ ] = {
' S ' , ' o ' , ' f ' , ' t ' , ' w ' , ' a ' , ' r ' , ' e ' , ' \\ ' ,
' M ' , ' i ' , ' c ' , ' r ' , ' o ' , ' s ' , ' o ' , ' f ' , ' t ' , ' \\ ' ,
' W ' , ' i ' , ' n ' , ' d ' , ' o ' , ' w ' , ' s ' , ' \\ ' ,
' C ' , ' u ' , ' r ' , ' r ' , ' e ' , ' n ' , ' t ' , ' V ' , ' e ' , ' r ' , ' s ' , ' i ' , ' o ' , ' n ' , ' \\ ' ,
' I ' , ' n ' , ' t ' , ' e ' , ' r ' , ' n ' , ' e ' , ' t ' , ' ' , ' S ' , ' e ' , ' t ' , ' t ' , ' i ' , ' n ' , ' g ' , ' s ' , ' \\ ' ,
' C ' , ' o ' , ' n ' , ' n ' , ' e ' , ' c ' , ' t ' , ' i ' , ' o ' , ' n ' , ' s ' , 0 } ;
static const WCHAR WinHttpSettings [ ] = {
' W ' , ' i ' , ' n ' , ' H ' , ' t ' , ' t ' , ' p ' , ' S ' , ' e ' , ' t ' , ' t ' , ' i ' , ' n ' , ' g ' , ' s ' , 0 } ;
static DWORD get_default_proxy_reg_value ( BYTE * buf , DWORD len , DWORD * type )
{
LONG l ;
HKEY key ;
DWORD ret = 0 ;
l = RegOpenKeyExW ( HKEY_LOCAL_MACHINE , Connections , 0 , KEY_READ , & key ) ;
if ( ! l )
{
DWORD size = 0 ;
l = RegQueryValueExW ( key , WinHttpSettings , NULL , type , NULL , & size ) ;
if ( ! l )
{
if ( size < = len )
l = RegQueryValueExW ( key , WinHttpSettings , NULL , type , buf ,
& size ) ;
if ( ! l )
ret = size ;
}
RegCloseKey ( key ) ;
}
return ret ;
}
static void set_default_proxy_reg_value ( BYTE * buf , DWORD len , DWORD type )
{
LONG l ;
HKEY key ;
l = RegCreateKeyExW ( HKEY_LOCAL_MACHINE , Connections , 0 , NULL , 0 ,
KEY_WRITE , NULL , & key , NULL ) ;
if ( ! l )
{
2009-07-21 21:23:04 +02:00
if ( len )
RegSetValueExW ( key , WinHttpSettings , 0 , type , buf , len ) ;
else
RegDeleteValueW ( key , WinHttpSettings ) ;
2009-07-14 21:36:41 +02:00
RegCloseKey ( key ) ;
}
}
static void test_set_default_proxy_config ( void )
{
static const WCHAR wideString [ ] = { 0x226f , 0x575b , 0 } ;
static const WCHAR normalString [ ] = { ' f ' , ' o ' , ' o ' , 0 } ;
DWORD type , len ;
BYTE * saved_proxy_settings = NULL ;
WINHTTP_PROXY_INFO info ;
BOOL ret ;
/* FIXME: it would be simpler to read the current settings using
* WinHttpGetDefaultProxyConfiguration and save them using
* WinHttpSetDefaultProxyConfiguration , but they appear to have a bug .
*
* If a proxy is configured in the registry , e . g . via ' proxcfg - p " foo " ' ,
* the access type reported by WinHttpGetDefaultProxyConfiguration is 1 ,
* WINHTTP_ACCESS_TYPE_NO_PROXY , whereas it should be
* WINHTTP_ACCESS_TYPE_NAMED_PROXY .
* If WinHttpSetDefaultProxyConfiguration is called with dwAccessType = 1 ,
* the lpszProxy and lpszProxyBypass values are ignored .
* Thus , if a proxy is set with proxycfg , then calling
* WinHttpGetDefaultProxyConfiguration followed by
* WinHttpSetDefaultProxyConfiguration results in the proxy settings
* getting deleted from the registry .
*
* Instead I read the current registry value and restore it directly .
*/
len = get_default_proxy_reg_value ( NULL , 0 , & type ) ;
if ( len )
{
saved_proxy_settings = HeapAlloc ( GetProcessHeap ( ) , 0 , len ) ;
len = get_default_proxy_reg_value ( saved_proxy_settings , len , & type ) ;
}
2009-07-16 15:47:38 +02:00
if ( 0 )
{
/* Crashes on Vista and higher */
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetDefaultProxyConfiguration ( NULL ) ;
ok ( ! ret & & GetLastError ( ) = = ERROR_INVALID_PARAMETER ,
" expected ERROR_INVALID_PARAMETER, got %d \n " , GetLastError ( ) ) ;
}
2009-07-14 21:36:41 +02:00
/* test with invalid access type */
info . dwAccessType = 0xdeadbeef ;
info . lpszProxy = info . lpszProxyBypass = NULL ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetDefaultProxyConfiguration ( & info ) ;
ok ( ! ret & & GetLastError ( ) = = ERROR_INVALID_PARAMETER ,
" expected ERROR_INVALID_PARAMETER, got %d \n " , GetLastError ( ) ) ;
/* at a minimum, the proxy server must be set */
info . dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY ;
info . lpszProxy = info . lpszProxyBypass = NULL ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetDefaultProxyConfiguration ( & info ) ;
ok ( ! ret & & GetLastError ( ) = = ERROR_INVALID_PARAMETER ,
" expected ERROR_INVALID_PARAMETER, got %d \n " , GetLastError ( ) ) ;
info . lpszProxyBypass = normalString ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetDefaultProxyConfiguration ( & info ) ;
ok ( ! ret & & GetLastError ( ) = = ERROR_INVALID_PARAMETER ,
" expected ERROR_INVALID_PARAMETER, got %d \n " , GetLastError ( ) ) ;
/* the proxy server can't have wide characters */
info . lpszProxy = wideString ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetDefaultProxyConfiguration ( & info ) ;
2009-07-22 12:06:41 +02:00
ok ( ( ! ret & & GetLastError ( ) = = ERROR_INVALID_PARAMETER ) | |
broken ( ret ) , /* Earlier winhttp versions on W2K/XP */
2009-07-14 21:36:41 +02:00
" expected ERROR_INVALID_PARAMETER, got %d \n " , GetLastError ( ) ) ;
info . lpszProxy = normalString ;
SetLastError ( 0xdeadbeef ) ;
ret = WinHttpSetDefaultProxyConfiguration ( & info ) ;
2009-12-08 18:47:08 +01:00
if ( ret )
{
ok ( ret , " always true \n " ) ;
set_default_proxy_reg_value ( saved_proxy_settings , len , type ) ;
}
else if ( GetLastError ( ) = = ERROR_ACCESS_DENIED )
skip ( " couldn't set default proxy configuration: access denied \n " ) ;
else
ok ( ret , " WinHttpSetDefaultProxyConfiguration failed: %d \n " ,
GetLastError ( ) ) ;
2009-07-14 21:36:41 +02:00
}
2008-07-18 02:37:23 +02:00
START_TEST ( winhttp )
{
test_OpenRequest ( ) ;
2008-07-30 22:20:40 +02:00
test_SendRequest ( ) ;
2008-08-14 23:54:18 +02:00
test_WinHttpTimeFromSystemTime ( ) ;
2008-08-14 23:56:07 +02:00
test_WinHttpTimeToSystemTime ( ) ;
2008-08-14 23:50:18 +02:00
test_WinHttpAddHeaders ( ) ;
2008-08-28 13:50:03 +02:00
test_secure_connection ( ) ;
2008-08-28 13:51:41 +02:00
test_request_parameter_defaults ( ) ;
2008-09-16 11:51:58 +02:00
test_QueryOption ( ) ;
2009-07-14 21:36:41 +02:00
test_set_default_proxy_config ( ) ;
2009-10-29 11:12:22 +01:00
test_empty_headers_param ( ) ;
2008-07-18 02:37:23 +02:00
}