ReactOS 0.4.15-dev-7924-g5949c20
winhttp.c File Reference
#include <stdarg.h>
#include <windef.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <winhttp.h>
#include <wincrypt.h>
#include <winreg.h>
#include <stdio.h>
#include <initguid.h>
#include <httprequest.h>
#include <httprequestid.h>
#include "wine/test.h"
#include "wine/heap.h"
Include dependency graph for winhttp.c:

Go to the source code of this file.

Classes

struct  server_info
 

Macros

#define COBJMACROS
 
#define X(x)   if (flags & x) trace("%s\n", #x);
 
#define BIG_BUFFER_LEN   0x2250
 

Functions

 DEFINE_GUID (GUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
 
static WCHARa2w (const char *str)
 
static int strcmp_wa (const WCHAR *str1, const char *stra)
 
static BOOL proxy_active (void)
 
static void test_WinHttpQueryOption (void)
 
static void test_WinHttpOpenRequest (void)
 
static void test_empty_headers_param (void)
 
static void test_WinHttpSendRequest (void)
 
static void test_WinHttpTimeFromSystemTime (void)
 
static void test_WinHttpTimeToSystemTime (void)
 
static void test_WinHttpAddHeaders (void)
 
static void CALLBACK cert_error (HINTERNET handle, DWORD_PTR ctx, DWORD status, LPVOID buf, DWORD len)
 
static void test_secure_connection (void)
 
static void test_request_parameter_defaults (void)
 
static DWORD get_default_proxy_reg_value (BYTE *buf, DWORD len, DWORD *type)
 
static void set_proxy (REGSAM access, BYTE *buf, DWORD len, DWORD type)
 
static void set_default_proxy_reg_value (BYTE *buf, DWORD len, DWORD type)
 
static void test_set_default_proxy_config (void)
 
static void test_timeouts (void)
 
static void test_resolve_timeout (void)
 
static DWORD CALLBACK server_thread (LPVOID param)
 
static void test_basic_request (int port, const WCHAR *verb, const WCHAR *path)
 
static void test_basic_authentication (int port)
 
static void test_multi_authentication (int port)
 
static void test_large_data_authentication (int port)
 
static void test_no_headers (int port)
 
static void test_no_content (int port)
 
static void test_head_request (int port)
 
static void test_not_modified (int port)
 
static void test_bad_header (int port)
 
static void test_multiple_reads (int port)
 
static void test_cookies (int port)
 
static void do_request (HINTERNET con, const WCHAR *obj, DWORD flags)
 
static void test_request_path_escapes (int port)
 
static void test_connection_info (int port)
 
static void test_passport_auth (int port)
 
static void test_credentials (void)
 
static void test_IWinHttpRequest (int port)
 
static void request_get_property (IWinHttpRequest *request, int property, VARIANT *ret)
 
static void test_IWinHttpRequest_Invoke (void)
 
static void test_WinHttpDetectAutoProxyConfigUrl (void)
 
static void test_WinHttpGetIEProxyConfigForCurrentUser (void)
 
static void test_WinHttpGetProxyForUrl (void)
 
static void test_chunked_read (void)
 
 START_TEST (winhttp)
 

Variables

static const WCHAR test_useragent []
 
static const WCHAR test_winehq [] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0}
 
static const WCHAR test_winehq_https [] = {'h','t','t','p','s',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',':','4','4','3',0}
 
static const WCHAR localhostW [] = {'l','o','c','a','l','h','o','s','t',0}
 
static const WCHAR Connections []
 
static const WCHAR WinHttpSettings []
 
static const char page1 []
 
static const char okmsg []
 
static const char notokmsg []
 
static const char cookiemsg []
 
static const char cookiemsg2 []
 
static const char nocontentmsg []
 
static const char notmodified []
 
static const char noauthmsg []
 
static const char okauthmsg []
 
static const char headmsg []
 
static const char multiauth []
 
static const char largeauth []
 
static const char passportauth []
 
static const char unauthorized [] = "Unauthorized"
 
static const char hello_world [] = "Hello World"
 
static const char auth_unseen [] = "Auth Unseen"
 

Macro Definition Documentation

◆ BIG_BUFFER_LEN

#define BIG_BUFFER_LEN   0x2250

Definition at line 2269 of file winhttp.c.

◆ COBJMACROS

#define COBJMACROS

Definition at line 22 of file winhttp.c.

◆ X

#define X (   x)    if (flags & x) trace("%s\n", #x);

Function Documentation

◆ a2w()

static WCHAR * a2w ( const char str)
static

Definition at line 46 of file winhttp.c.

47{
48 int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
49 WCHAR *ret = heap_alloc(len * sizeof(WCHAR));
51 return ret;
52}
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
#define NULL
Definition: types.h:112
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
GLenum GLsizei len
Definition: glext.h:6722
const WCHAR * str
int ret
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by strcmp_wa().

◆ cert_error()

static void CALLBACK cert_error ( HINTERNET  handle,
DWORD_PTR  ctx,
DWORD  status,
LPVOID  buf,
DWORD  len 
)
static

Definition at line 1028 of file winhttp.c.

1029{
1030 DWORD flags = *(DWORD *)buf;
1031
1032 if (!flags)
1033 {
1034 trace("WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR\n");
1035 return;
1036 }
1037#define X(x) if (flags & x) trace("%s\n", #x);
1045#undef X
1046}
#define trace
Definition: atltest.h:70
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
#define X(x)
#define WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED
Definition: winhttp.h:434
#define WINHTTP_CALLBACK_STATUS_FLAG_CERT_WRONG_USAGE
Definition: winhttp.h:440
#define WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID
Definition: winhttp.h:438
#define WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED
Definition: winhttp.h:436
#define WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA
Definition: winhttp.h:437
#define WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT
Definition: winhttp.h:435
#define WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID
Definition: winhttp.h:439

Referenced by test_secure_connection().

◆ DEFINE_GUID()

DEFINE_GUID ( GUID_NULL  ,
,
,
,
,
,
,
,
,
,
,
 
)

◆ do_request()

static void do_request ( HINTERNET  con,
const WCHAR obj,
DWORD  flags 
)
static

Definition at line 3427 of file winhttp.c.

3428{
3429 HINTERNET req;
3430 DWORD status, size;
3431 BOOL ret;
3432
3433 req = WinHttpOpenRequest( con, NULL, obj, NULL, NULL, NULL, flags );
3434 ok( req != NULL, "failed to open a request %u\n", GetLastError() );
3435
3436 ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
3437 ok( ret, "failed to send request %u\n", GetLastError() );
3438
3440 ok( ret, "failed to receive response %u\n", GetLastError() );
3441
3442 status = 0xdeadbeef;
3443 size = sizeof(status);
3445 ok( ret, "failed to query status code %u\n", GetLastError() );
3447 "request %s with flags %08x failed %u\n", wine_dbgstr_w(obj), flags, status );
3448 WinHttpCloseHandle( req );
3449}
#define broken(x)
Definition: _sntprintf.h:21
#define ok(value,...)
Definition: atltest.h:57
BOOL WINAPI WinHttpCloseHandle(HINTERNET handle)
Definition: session.c:1195
HINTERNET WINAPI WinHttpOpenRequest(HINTERNET hconnect, LPCWSTR verb, LPCWSTR object, LPCWSTR version, LPCWSTR referrer, LPCWSTR *types, DWORD flags)
Definition: session.c:1117
unsigned int BOOL
Definition: ntddk_ex.h:94
GLsizeiptr size
Definition: glext.h:5919
#define wine_dbgstr_w
Definition: kernel32.h:34
BOOL WINAPI WinHttpQueryHeaders(HINTERNET hrequest, DWORD level, LPCWSTR name, LPVOID buffer, LPDWORD buflen, LPDWORD index)
Definition: request.c:856
BOOL WINAPI WinHttpSendRequest(HINTERNET hrequest, LPCWSTR headers, DWORD headers_len, LPVOID optional, DWORD optional_len, DWORD total_len, DWORD_PTR context)
Definition: request.c:2350
BOOL WINAPI WinHttpReceiveResponse(HINTERNET hrequest, LPVOID reserved)
Definition: request.c:2924
Definition: ps.c:97
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define HTTP_STATUS_OK
Definition: winhttp.h:240
#define HTTP_STATUS_BAD_REQUEST
Definition: winhttp.h:255
#define WINHTTP_QUERY_STATUS_CODE
Definition: winhttp.h:317
#define WINHTTP_QUERY_FLAG_NUMBER
Definition: winhttp.h:377

Referenced by test_request_path_escapes().

◆ get_default_proxy_reg_value()

static DWORD get_default_proxy_reg_value ( BYTE buf,
DWORD  len,
DWORD type 
)
static

Definition at line 1309 of file winhttp.c.

1310{
1311 LONG l;
1312 HKEY key;
1313 DWORD ret = 0;
1314
1316 if (!l)
1317 {
1318 DWORD size = 0;
1319
1321 if (!l)
1322 {
1323 if (size <= len)
1325 &size );
1326 if (!l)
1327 ret = size;
1328 }
1329 RegCloseKey( key );
1330 }
1331 return ret;
1332}
#define RegCloseKey(hKey)
Definition: registry.h:49
r l[0]
Definition: byte_order.h:168
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define KEY_READ
Definition: nt_native.h:1023
long LONG
Definition: pedump.c:60
Definition: copy.c:22
static const WCHAR WinHttpSettings[]
Definition: winhttp.c:1306
static const WCHAR Connections[]
Definition: winhttp.c:1299
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12

Referenced by test_set_default_proxy_config().

◆ proxy_active()

static BOOL proxy_active ( void  )
static

Definition at line 62 of file winhttp.c.

63{
64 WINHTTP_PROXY_INFO proxy_info;
65 BOOL active = FALSE;
66
67 SetLastError(0xdeadbeef);
69 {
70 ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
71 "got %u\n", GetLastError());
72 active = (proxy_info.lpszProxy != NULL);
73 if (active)
74 GlobalFree(proxy_info.lpszProxy);
75 if (proxy_info.lpszProxyBypass != NULL)
76 GlobalFree(proxy_info.lpszProxyBypass);
77 }
78 else
79 active = FALSE;
80
81 return active;
82}
#define ERROR_SUCCESS
Definition: deptool.c:10
#define FALSE
Definition: types.h:117
#define SetLastError(x)
Definition: compat.h:752
BOOL WINAPI WinHttpGetDefaultProxyConfiguration(WINHTTP_PROXY_INFO *info)
Definition: session.c:1537
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
LPWSTR lpszProxyBypass
Definition: winhttp.h:506
LPWSTR lpszProxy
Definition: winhttp.h:505

Referenced by test_resolve_timeout().

◆ request_get_property()

static void request_get_property ( IWinHttpRequest *  request,
int  property,
VARIANT ret 
)
static

Definition at line 4327 of file winhttp.c.

4328{
4330 VARIANT arg;
4331 HRESULT hr;
4332
4333 memset(&params, 0, sizeof(params));
4334 params.cNamedArgs = 0;
4335 params.rgdispidNamedArgs = NULL;
4336 params.cArgs = 1;
4337 params.rgvarg = &arg;
4338 VariantInit(&arg);
4339 V_VT(&arg) = VT_I4;
4340 V_I4(&arg) = property;
4342 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0,
4344 ok(hr == S_OK, "error %#x\n", hr);
4345}
@ VT_I4
Definition: compat.h:2298
GLenum const GLfloat * params
Definition: glext.h:5645
#define DISPID_HTTPREQUEST_OPTION
Definition: httprequestid.h:28
#define S_OK
Definition: intsafe.h:52
struct stdole::DISPPARAMS DISPPARAMS
#define V_VT(A)
Definition: oleauto.h:211
#define V_I4(A)
Definition: oleauto.h:247
#define DISPATCH_PROPERTYGET
Definition: oleauto.h:1007
#define IID_NULL
Definition: guiddef.h:98
#define memset(x, y, z)
Definition: compat.h:39
HRESULT hr
Definition: shlfolder.c:183
Definition: tftpd.h:86
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
void * arg
Definition: msvc.h:10

Referenced by test_IWinHttpRequest_Invoke().

◆ server_thread()

static DWORD CALLBACK server_thread ( LPVOID  param)
static

Definition at line 2271 of file winhttp.c.

2272{
2273 struct server_info *si = param;
2274 int r, c = -1, i, on;
2275 SOCKET s;
2276 struct sockaddr_in sa;
2277 char buffer[0x100];
2278 WSADATA wsaData;
2279 int last_request = 0;
2280
2281 WSAStartup(MAKEWORD(1,1), &wsaData);
2282
2283 s = socket(AF_INET, SOCK_STREAM, 0);
2284 if (s == INVALID_SOCKET)
2285 return 1;
2286
2287 on = 1;
2288 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof on);
2289
2290 memset(&sa, 0, sizeof sa);
2291 sa.sin_family = AF_INET;
2292 sa.sin_port = htons(si->port);
2293 sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
2294
2295 r = bind(s, (struct sockaddr *)&sa, sizeof(sa));
2296 if (r < 0)
2297 return 1;
2298
2299 listen(s, 0);
2300 SetEvent(si->event);
2301 do
2302 {
2303 if (c == -1) c = accept(s, NULL, NULL);
2304
2305 memset(buffer, 0, sizeof buffer);
2306 for(i = 0; i < sizeof buffer - 1; i++)
2307 {
2308 r = recv(c, &buffer[i], 1, 0);
2309 if (r != 1)
2310 break;
2311 if (i < 4) continue;
2312 if (buffer[i - 2] == '\n' && buffer[i] == '\n' &&
2313 buffer[i - 3] == '\r' && buffer[i - 1] == '\r')
2314 break;
2315 }
2316 if (strstr(buffer, "GET /basic"))
2317 {
2318 send(c, okmsg, sizeof okmsg - 1, 0);
2319 send(c, page1, sizeof page1 - 1, 0);
2320 }
2321 if (strstr(buffer, "/auth_with_creds"))
2322 {
2323 send(c, okauthmsg, sizeof okauthmsg - 1, 0);
2324 if (strstr(buffer, "Authorization: Basic dXNlcjpwd2Q="))
2325 send(c, hello_world, sizeof hello_world - 1, 0);
2326 else
2327 send(c, auth_unseen, sizeof auth_unseen - 1, 0);
2328 continue;
2329 }
2330 if (strstr(buffer, "/auth"))
2331 {
2332 if (strstr(buffer, "Authorization: Basic dXNlcjpwd2Q="))
2333 {
2334 send(c, okauthmsg, sizeof okauthmsg - 1, 0);
2335 send(c, hello_world, sizeof hello_world - 1, 0);
2336 }
2337 else
2338 {
2339 send(c, noauthmsg, sizeof noauthmsg - 1, 0);
2340 send(c, unauthorized, sizeof unauthorized - 1, 0);
2341 }
2342 continue;
2343 }
2344 if (strstr(buffer, "/big"))
2345 {
2346 char msg[BIG_BUFFER_LEN];
2347 memset(msg, 'm', sizeof(msg));
2348 send(c, okmsg, sizeof(okmsg) - 1, 0);
2349 send(c, msg, sizeof(msg), 0);
2350 }
2351 if (strstr(buffer, "/no_headers"))
2352 {
2353 send(c, page1, sizeof page1 - 1, 0);
2354 }
2355 if (strstr(buffer, "GET /no_content"))
2356 {
2357 send(c, nocontentmsg, sizeof nocontentmsg - 1, 0);
2358 continue;
2359 }
2360 if (strstr(buffer, "GET /not_modified"))
2361 {
2362 if (strstr(buffer, "If-Modified-Since:")) send(c, notmodified, sizeof notmodified - 1, 0);
2363 else send(c, notokmsg, sizeof(notokmsg) - 1, 0);
2364 continue;
2365 }
2366 if (strstr(buffer, "HEAD /head"))
2367 {
2368 send(c, headmsg, sizeof headmsg - 1, 0);
2369 continue;
2370 }
2371 if (strstr(buffer, "GET /multiauth"))
2372 {
2373 send(c, multiauth, sizeof multiauth - 1, 0);
2374 }
2375 if (strstr(buffer, "GET /largeauth"))
2376 {
2377 if (strstr(buffer, "Authorization: NTLM"))
2378 send(c, okmsg, sizeof(okmsg) - 1, 0);
2379 else
2380 {
2381 send(c, largeauth, sizeof largeauth - 1, 0);
2382#ifdef __REACTOS__
2383 memset(buffer, 'A', sizeof(buffer));
2384 for (i = 0; i < (10240 / sizeof(buffer)); i++) send(c, buffer, sizeof(buffer), 0);
2385#else
2386 for (i = 0; i < 10240; i++) send(c, "A", 1, 0);
2387#endif
2388 continue;
2389 }
2390 }
2391 if (strstr(buffer, "GET /cookie5"))
2392 {
2393 if (strstr(buffer, "Cookie: name2=value\r\n"))
2394 send(c, okmsg, sizeof(okmsg) - 1, 0);
2395 else
2396 send(c, notokmsg, sizeof(notokmsg) - 1, 0);
2397 }
2398 if (strstr(buffer, "GET /cookie4"))
2399 {
2400 send(c, cookiemsg2, sizeof(cookiemsg2) - 1, 0);
2401 }
2402 if (strstr(buffer, "GET /cookie3"))
2403 {
2404 if (strstr(buffer, "Cookie: name=value2; NAME=value; name=value\r\n") ||
2405 broken(strstr(buffer, "Cookie: name=value2; name=value; NAME=value\r\n") != NULL))
2406 send(c, okmsg, sizeof(okmsg) - 1, 0);
2407 else
2408 send(c, notokmsg, sizeof(notokmsg) - 1, 0);
2409 }
2410 if (strstr(buffer, "GET /cookie2"))
2411 {
2412 if (strstr(buffer, "Cookie: NAME=value; name=value\r\n") ||
2413 broken(strstr(buffer, "Cookie: name=value; NAME=value\r\n") != NULL))
2414 send(c, okmsg, sizeof(okmsg) - 1, 0);
2415 else
2416 send(c, notokmsg, sizeof(notokmsg) - 1, 0);
2417 }
2418 else if (strstr(buffer, "GET /cookie"))
2419 {
2420 if (!strstr(buffer, "Cookie: name=value\r\n")) send(c, cookiemsg, sizeof(cookiemsg) - 1, 0);
2421 else send(c, notokmsg, sizeof(notokmsg) - 1, 0);
2422 }
2423 else if (strstr(buffer, "GET /escape"))
2424 {
2425 static const char res[] = "%0D%0A%1F%7F%3C%20%one?%1F%7F%20!%22%23$%&'()*+,-./:;%3C=%3E?@%5B%5C%5D"
2426 "%5E_%60%7B%7C%7D~%0D%0A ";
2427 static const char res2[] = "%0D%0A%1F%7F%3C%20%25two?%1F%7F%20!%22%23$%25&'()*+,-./:;%3C=%3E?@%5B%5C%5D"
2428 "%5E_%60%7B%7C%7D~%0D%0A ";
2429 static const char res3[] = "\x1f\x7f<%20%three?\x1f\x7f%20!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ";
2430 static const char res4[] = "%0D%0A%1F%7F%3C%20%four?\x1f\x7f%20!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ";
2431 static const char res5[] = "&text=one%C2%80%7F~";
2432 static const char res6[] = "&text=two%C2%80\x7f~";
2433 static const char res7[] = "&text=%E5%90%9B%E3%81%AE%E5%90%8D%E3%81%AF";
2434
2435 if (strstr(buffer + 11, res) || strstr(buffer + 11, res2) || strstr(buffer + 11, res3) ||
2436 strstr(buffer + 11, res4) || strstr(buffer + 11, res5) || strstr(buffer + 11, res6) ||
2437 strstr(buffer + 11, res7))
2438 {
2439 send(c, okmsg, sizeof(okmsg) - 1, 0);
2440 }
2441 else send(c, notokmsg, sizeof(notokmsg) - 1, 0);
2442 }
2443 else if (strstr(buffer, "GET /passport"))
2444 {
2445 send(c, passportauth, sizeof(passportauth) - 1, 0);
2446 }
2447 if (strstr(buffer, "GET /quit"))
2448 {
2449 send(c, okmsg, sizeof okmsg - 1, 0);
2450 send(c, page1, sizeof page1 - 1, 0);
2451 last_request = 1;
2452 }
2453 shutdown(c, 2);
2454 closesocket(c);
2455 c = -1;
2456
2457 } while (!last_request);
2458
2459 closesocket(s);
2460 return 0;
2461}
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
#define msg(x)
Definition: auth_time.c:54
INT WSAAPI recv(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags)
Definition: recv.c:23
INT WSAAPI send(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags)
Definition: send.c:23
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
#define SOCK_STREAM
Definition: tcpip.h:118
#define AF_INET
Definition: tcpip.h:117
GLdouble s
Definition: gl.h:2039
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint res
Definition: glext.h:9613
GLuint buffer
Definition: glext.h:5915
const GLubyte * c
Definition: glext.h:8905
GLfloat param
Definition: glext.h:5796
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define inet_addr(cp)
Definition: inet.h:98
#define htons(x)
Definition: module.h:215
#define closesocket
Definition: ncftp.h:477
INT WSAAPI setsockopt(IN SOCKET s, IN INT level, IN INT optname, IN CONST CHAR FAR *optval, IN INT optlen)
Definition: sockctrl.c:421
INT WSAAPI listen(IN SOCKET s, IN INT backlog)
Definition: sockctrl.c:123
INT WSAAPI shutdown(IN SOCKET s, IN INT how)
Definition: sockctrl.c:506
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: socklife.c:36
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
Definition: socklife.c:23
SOCKET WSAAPI socket(IN INT af, IN INT type, IN INT protocol)
Definition: socklife.c:143
HANDLE event
Definition: notification.c:637
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
#define MAKEWORD(a, b)
Definition: typedefs.h:248
static const char auth_unseen[]
Definition: winhttp.c:2261
static const char okmsg[]
Definition: winhttp.c:2182
static const char noauthmsg[]
Definition: winhttp.c:2211
static const char hello_world[]
Definition: winhttp.c:2260
static const char notokmsg[]
Definition: winhttp.c:2187
static const char page1[]
Definition: winhttp.c:2176
static const char cookiemsg2[]
Definition: winhttp.c:2197
static const char headmsg[]
Definition: winhttp.c:2228
static const char unauthorized[]
Definition: winhttp.c:2259
static const char nocontentmsg[]
Definition: winhttp.c:2202
static const char passportauth[]
Definition: winhttp.c:2252
static const char largeauth[]
Definition: winhttp.c:2243
static const char cookiemsg[]
Definition: winhttp.c:2191
#define BIG_BUFFER_LEN
Definition: winhttp.c:2269
static const char okauthmsg[]
Definition: winhttp.c:2220
static const char notmodified[]
Definition: winhttp.c:2207
static const char multiauth[]
Definition: winhttp.c:2233
#define INVALID_SOCKET
Definition: winsock.h:332
UINT_PTR SOCKET
Definition: winsock.h:47
#define SO_REUSEADDR
Definition: winsock.h:180
#define SOL_SOCKET
Definition: winsock.h:398

Referenced by START_TEST().

◆ set_default_proxy_reg_value()

static void set_default_proxy_reg_value ( BYTE buf,
DWORD  len,
DWORD  type 
)
static

Definition at line 1345 of file winhttp.c.

1346{
1347 BOOL wow64;
1349 if (sizeof(void *) > sizeof(int) || wow64)
1350 {
1353 }
1354 else
1356}
#define GetCurrentProcess()
Definition: compat.h:759
#define IsWow64Process
Definition: compat.h:760
#define KEY_WRITE
Definition: nt_native.h:1031
static BOOL wow64
Definition: psapi_main.c:44
static void set_proxy(REGSAM access, BYTE *buf, DWORD len, DWORD type)
Definition: winhttp.c:1334
#define KEY_WOW64_32KEY
Definition: cmtypes.h:45
#define KEY_WOW64_64KEY
Definition: cmtypes.h:46

Referenced by test_set_default_proxy_config().

◆ set_proxy()

static void set_proxy ( REGSAM  access,
BYTE buf,
DWORD  len,
DWORD  type 
)
static

Definition at line 1334 of file winhttp.c.

1335{
1336 HKEY hkey;
1338 {
1339 if (len) RegSetValueExW( hkey, WinHttpSettings, 0, type, buf, len );
1340 else RegDeleteValueW( hkey, WinHttpSettings );
1341 RegCloseKey( hkey );
1342 }
1343}
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2330
GLuint GLint GLboolean GLint GLenum access
Definition: glext.h:7866

Referenced by set_default_proxy_reg_value().

◆ START_TEST()

START_TEST ( winhttp  )

Definition at line 4840 of file winhttp.c.

4841{
4842 static const WCHAR basicW[] = {'/','b','a','s','i','c',0};
4843 static const WCHAR quitW[] = {'/','q','u','i','t',0};
4844 struct server_info si;
4845 HANDLE thread;
4846 DWORD ret;
4847
4858 test_timeouts();
4866
4867 si.event = CreateEventW(NULL, 0, 0, NULL);
4868 si.port = 7532;
4869
4870 thread = CreateThread(NULL, 0, server_thread, &si, 0, NULL);
4871 ok(thread != NULL, "failed to create thread %u\n", GetLastError());
4872
4873 ret = WaitForSingleObject(si.event, 10000);
4874 ok(ret == WAIT_OBJECT_0, "failed to start winhttp test server %u\n", GetLastError());
4875 if (ret != WAIT_OBJECT_0)
4876 {
4878 return;
4879 }
4880
4881 test_IWinHttpRequest(si.port);
4882 test_connection_info(si.port);
4883 test_basic_request(si.port, NULL, basicW);
4884 test_no_headers(si.port);
4885 test_no_content(si.port);
4886 test_head_request(si.port);
4887 test_not_modified(si.port);
4891 test_bad_header(si.port);
4892#ifdef __REACTOS__
4894 {
4895 skip("Skipping tests due to hang. See ROSTESTS-350\n");
4896 }
4897 else
4898 {
4899 test_multiple_reads(si.port);
4900 test_cookies(si.port);
4902 test_passport_auth(si.port);
4903
4904 /* send the basic request again to shutdown the server thread */
4905 test_basic_request(si.port, NULL, quitW);
4906 }
4907#else
4908 test_multiple_reads(si.port);
4909 test_cookies(si.port);
4911 test_passport_auth(si.port);
4912
4913 /* send the basic request again to shutdown the server thread */
4914 test_basic_request(si.port, NULL, quitW);
4915#endif
4916
4919}
#define skip(...)
Definition: atltest.h:64
static HANDLE thread
Definition: service.c:33
#define CloseHandle
Definition: compat.h:739
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
static const WCHAR basicW[]
int winetest_interactive
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651
#define WAIT_OBJECT_0
Definition: winbase.h:406
static void test_WinHttpSendRequest(void)
Definition: winhttp.c:365
static void test_WinHttpDetectAutoProxyConfigUrl(void)
Definition: winhttp.c:4562
static void test_bad_header(int port)
Definition: winhttp.c:3174
static void test_IWinHttpRequest(int port)
Definition: winhttp.c:3746
static DWORD CALLBACK server_thread(LPVOID param)
Definition: winhttp.c:2271
static void test_multiple_reads(int port)
Definition: winhttp.c:3212
static void test_no_content(int port)
Definition: winhttp.c:2974
static void test_no_headers(int port)
Definition: winhttp.c:2938
static void test_credentials(void)
Definition: winhttp.c:3625
static void test_cookies(int port)
Definition: winhttp.c:3266
static void test_set_default_proxy_config(void)
Definition: winhttp.c:1358
static void test_WinHttpOpenRequest(void)
Definition: winhttp.c:270
static void test_resolve_timeout(void)
Definition: winhttp.c:2104
static void test_secure_connection(void)
Definition: winhttp.c:1048
static void test_WinHttpGetIEProxyConfigForCurrentUser(void)
Definition: winhttp.c:4619
static void test_WinHttpAddHeaders(void)
Definition: winhttp.c:556
static void test_basic_authentication(int port)
Definition: winhttp.c:2555
static void test_basic_request(int port, const WCHAR *verb, const WCHAR *path)
Definition: winhttp.c:2463
static void test_request_parameter_defaults(void)
Definition: winhttp.c:1222
static void test_multi_authentication(int port)
Definition: winhttp.c:2832
static void test_IWinHttpRequest_Invoke(void)
Definition: winhttp.c:4347
static void test_empty_headers_param(void)
Definition: winhttp.c:334
static void test_WinHttpTimeToSystemTime(void)
Definition: winhttp.c:514
static void test_head_request(int port)
Definition: winhttp.c:3058
static void test_not_modified(int port)
Definition: winhttp.c:3117
static void test_WinHttpQueryOption(void)
Definition: winhttp.c:84
static void test_connection_info(int port)
Definition: winhttp.c:3495
static void test_request_path_escapes(int port)
Definition: winhttp.c:3451
static void test_WinHttpGetProxyForUrl(void)
Definition: winhttp.c:4648
static void test_passport_auth(int port)
Definition: winhttp.c:3554
static void test_chunked_read(void)
Definition: winhttp.c:4755
static void test_WinHttpTimeFromSystemTime(void)
Definition: winhttp.c:483
static void test_large_data_authentication(int port)
Definition: winhttp.c:2887
static void test_timeouts(void)
Definition: winhttp.c:1446

◆ strcmp_wa()

static int strcmp_wa ( const WCHAR str1,
const char stra 
)
static

Definition at line 54 of file winhttp.c.

55{
56 WCHAR *str2 = a2w(stra);
57 int r = lstrcmpW(str1, str2);
58 heap_free(str2);
59 return r;
60}
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
static WCHAR * a2w(const char *str)
Definition: winhttp.c:46

Referenced by test_multi_authentication().

◆ test_bad_header()

static void test_bad_header ( int  port)
static

Definition at line 3174 of file winhttp.c.

3175{
3176 static const WCHAR bad_headerW[] =
3177 {'C','o','n','t','e','n','t','-','T','y','p','e',':',' ',
3178 't','e','x','t','/','h','t','m','l','\n','\r',0};
3179 static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0};
3180 static const WCHAR content_typeW[] = {'C','o','n','t','e','n','t','-','T','y','p','e',0};
3181 WCHAR buffer[32];
3182 HINTERNET ses, con, req;
3183 DWORD index, len;
3184 BOOL ret;
3185
3187 ok( ses != NULL, "failed to open session %u\n", GetLastError() );
3188
3189 con = WinHttpConnect( ses, localhostW, port, 0 );
3190 ok( con != NULL, "failed to open a connection %u\n", GetLastError() );
3191
3192 req = WinHttpOpenRequest( con, NULL, NULL, NULL, NULL, NULL, 0 );
3193 ok( req != NULL, "failed to open a request %u\n", GetLastError() );
3194
3195 ret = WinHttpAddRequestHeaders( req, bad_headerW, ~0u, WINHTTP_ADDREQ_FLAG_ADD );
3196 ok( ret, "failed to add header %u\n", GetLastError() );
3197
3198 index = 0;
3199 buffer[0] = 0;
3200 len = sizeof(buffer);
3202 content_typeW, buffer, &len, &index );
3203 ok( ret, "failed to query headers %u\n", GetLastError() );
3204 ok( !lstrcmpW( buffer, text_htmlW ), "got %s\n", wine_dbgstr_w(buffer) );
3205 ok( index == 1, "index = %u\n", index );
3206
3207 WinHttpCloseHandle( req );
3208 WinHttpCloseHandle( con );
3209 WinHttpCloseHandle( ses );
3210}
#define index(s, c)
Definition: various.h:29
USHORT port
Definition: uri.c:228
HINTERNET WINAPI WinHttpOpen(LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWSTR bypass, DWORD flags)
Definition: session.c:250
HINTERNET WINAPI WinHttpConnect(HINTERNET hsession, LPCWSTR server, INTERNET_PORT port, DWORD reserved)
Definition: session.c:541
GLuint index
Definition: glext.h:6031
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
static const WCHAR text_htmlW[]
Definition: navigate.c:29
BOOL WINAPI WinHttpAddRequestHeaders(HINTERNET hrequest, LPCWSTR headers, DWORD len, DWORD flags)
Definition: request.c:542
static const WCHAR test_useragent[]
Definition: winhttp.c:40
static const WCHAR localhostW[]
Definition: winhttp.c:44
#define WINHTTP_QUERY_FLAG_REQUEST_HEADERS
Definition: winhttp.h:375
#define WINHTTP_ADDREQ_FLAG_ADD
Definition: winhttp.h:84
#define WINHTTP_QUERY_CUSTOM
Definition: winhttp.h:374
#define WINHTTP_ACCESS_TYPE_NO_PROXY
Definition: winhttp.h:63

Referenced by START_TEST().

◆ test_basic_authentication()

static void test_basic_authentication ( int  port)
static

Definition at line 2555 of file winhttp.c.

2556{
2557 static const WCHAR authW[] = {'/','a','u','t','h',0};
2558 static const WCHAR auth_with_credsW[] = {'/','a','u','t','h','_','w','i','t','h','_','c','r','e','d','s',0};
2559 static WCHAR userW[] = {'u','s','e','r',0};
2560 static WCHAR passW[] = {'p','w','d',0};
2561 static WCHAR pass2W[] = {'p','w','d','2',0};
2562 HINTERNET ses, con, req;
2563 DWORD status, size, error, supported, first, target;
2564 char buffer[32];
2565 BOOL ret;
2566
2568 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2569
2570 con = WinHttpConnect(ses, localhostW, port, 0);
2571 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2572
2573 req = WinHttpOpenRequest(con, NULL, authW, NULL, NULL, NULL, 0);
2574 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2575
2576 SetLastError(0xdeadbeef);
2578 error = GetLastError();
2579 ok(!ret, "expected failure\n");
2580 ok(error == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %u\n", error);
2581
2582 SetLastError(0xdeadbeef);
2584 error = GetLastError();
2585 ok(!ret, "expected failure\n");
2587
2588 supported = 0xdeadbeef;
2589 SetLastError(0xdeadbeef);
2590 ret = WinHttpQueryAuthSchemes(req, &supported, NULL, NULL);
2591 error = GetLastError();
2592 ok(!ret, "expected failure\n");
2594 ok(supported == 0xdeadbeef, "got %x\n", supported);
2595
2596 supported = first = 0xdeadbeef;
2597 SetLastError(0xdeadbeef);
2598 ret = WinHttpQueryAuthSchemes(req, &supported, &first, NULL);
2599 error = GetLastError();
2600 ok(!ret, "expected failure\n");
2602 ok(supported == 0xdeadbeef, "got %x\n", supported);
2603 ok(first == 0xdeadbeef, "got %x\n", first);
2604
2605 supported = first = target = 0xdeadbeef;
2606 SetLastError(0xdeadbeef);
2607 ret = WinHttpQueryAuthSchemes(req, &supported, &first, &target);
2608 error = GetLastError();
2609 ok(!ret, "expected failure\n");
2610 ok(error == ERROR_INVALID_OPERATION, "expected ERROR_INVALID_OPERATION, got %u\n", error);
2611 ok(supported == 0xdeadbeef, "got %x\n", supported);
2612 ok(first == 0xdeadbeef, "got %x\n", first);
2613 ok(target == 0xdeadbeef, "got %x\n", target);
2614
2615 supported = first = target = 0xdeadbeef;
2616 SetLastError(0xdeadbeef);
2617 ret = WinHttpQueryAuthSchemes(NULL, &supported, &first, &target);
2618 error = GetLastError();
2619 ok(!ret, "expected failure\n");
2620 ok(error == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %u\n", error);
2621 ok(supported == 0xdeadbeef, "got %x\n", supported);
2622 ok(first == 0xdeadbeef, "got %x\n", first);
2623 ok(target == 0xdeadbeef, "got %x\n", target);
2624
2625 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
2626 ok(ret, "failed to send request %u\n", GetLastError());
2627
2629 ok(ret, "failed to receive response %u\n", GetLastError());
2630
2631 status = 0xdeadbeef;
2632 size = sizeof(status);
2634 ok(ret, "failed to query status code %u\n", GetLastError());
2635 ok(status == HTTP_STATUS_DENIED, "request failed unexpectedly %u\n", status);
2636
2637 size = 0;
2638 ret = WinHttpReadData(req, buffer, sizeof(buffer), &size);
2639 error = GetLastError();
2640 ok(ret || broken(error == ERROR_WINHTTP_SHUTDOWN || error == ERROR_WINHTTP_TIMEOUT) /* XP */, "failed to read data %u\n", GetLastError());
2641 if (ret)
2642 {
2643 ok(size == 12, "expected 12, got %u\n", size);
2644 ok(!memcmp(buffer, unauthorized, 12), "got %s\n", buffer);
2645 }
2646
2647 supported = first = target = 0xdeadbeef;
2648 SetLastError(0xdeadbeef);
2649 ret = WinHttpQueryAuthSchemes(req, &supported, &first, &target);
2650 error = GetLastError();
2651 ok(ret, "failed to query authentication schemes %u\n", error);
2652 ok(error == ERROR_SUCCESS || broken(error == 0xdeadbeef) /* < win7 */, "expected ERROR_SUCCESS, got %u\n", error);
2653 ok(supported == WINHTTP_AUTH_SCHEME_BASIC, "got %x\n", supported);
2654 ok(first == WINHTTP_AUTH_SCHEME_BASIC, "got %x\n", first);
2655 ok(target == WINHTTP_AUTH_TARGET_SERVER, "got %x\n", target);
2656
2657 SetLastError(0xdeadbeef);
2659 error = GetLastError();
2660 ok(ret, "failed to set credentials %u\n", error);
2661 ok(error == ERROR_SUCCESS || broken(error == 0xdeadbeef) /* < win7 */, "expected ERROR_SUCCESS, got %u\n", error);
2662
2664 ok(ret, "failed to set credentials %u\n", GetLastError());
2665
2667 ok(ret, "failed to set credentials %u\n", GetLastError());
2668
2669 SetLastError(0xdeadbeef);
2671 error = GetLastError();
2672 ok(!ret, "expected failure\n");
2673 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
2674
2675 SetLastError(0xdeadbeef);
2677 error = GetLastError();
2678 ok(!ret, "expected failure\n");
2679 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
2680
2681 SetLastError(0xdeadbeef);
2683 error = GetLastError();
2684 ok(!ret, "expected failure\n");
2685 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
2686
2687 SetLastError(0xdeadbeef);
2689 error = GetLastError();
2690 ok(!ret, "expected failure\n");
2691 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
2692
2694 ok(ret, "failed to set credentials %u\n", GetLastError());
2695
2696 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
2697 ok(ret, "failed to send request %u\n", GetLastError());
2698
2700 ok(ret, "failed to receive response %u\n", GetLastError());
2701
2702 status = 0xdeadbeef;
2703 size = sizeof(status);
2705 ok(ret, "failed to query status code %u\n", GetLastError());
2706 ok(status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status);
2707
2708 size = 0;
2709 ret = WinHttpReadData(req, buffer, sizeof(buffer), &size);
2710 error = GetLastError();
2711 ok(ret || broken(error == ERROR_WINHTTP_SHUTDOWN || error == ERROR_WINHTTP_TIMEOUT) /* XP */, "failed to read data %u\n", GetLastError());
2712 if (ret)
2713 {
2714 ok(size == 11, "expected 11, got %u\n", size);
2715 ok(!memcmp(buffer, hello_world, 11), "got %s\n", buffer);
2716 }
2717
2718 WinHttpCloseHandle(req);
2719 WinHttpCloseHandle(con);
2720 WinHttpCloseHandle(ses);
2721
2722 /* now set the credentials first to show that they get sent with the first request */
2724 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2725
2726 con = WinHttpConnect(ses, localhostW, port, 0);
2727 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2728
2729 req = WinHttpOpenRequest(con, NULL, auth_with_credsW, NULL, NULL, NULL, 0);
2730 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2731
2733 ok(ret, "failed to set credentials %u\n", GetLastError());
2734
2735 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
2736 ok(ret, "failed to send request %u\n", GetLastError());
2737
2739 ok(ret, "failed to receive response %u\n", GetLastError());
2740
2741 status = 0xdeadbeef;
2742 size = sizeof(status);
2744 ok(ret, "failed to query status code %u\n", GetLastError());
2745 ok(status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status);
2746
2747 size = 0;
2748 ret = WinHttpReadData(req, buffer, sizeof(buffer), &size);
2749 error = GetLastError();
2750 ok(ret || broken(error == ERROR_WINHTTP_SHUTDOWN || error == ERROR_WINHTTP_TIMEOUT) /* XP */, "failed to read data %u\n", GetLastError());
2751 if (ret)
2752 {
2753 ok(size == 11, "expected 11, got %u\n", size);
2754 ok(!memcmp(buffer, hello_world, 11), "got %s\n", buffer);
2755 }
2756
2757 WinHttpCloseHandle(req);
2758 WinHttpCloseHandle(con);
2759 WinHttpCloseHandle(ses);
2760
2761 /* credentials set with WinHttpSetCredentials take precedence over those set through options */
2762
2764 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2765
2766 con = WinHttpConnect(ses, localhostW, port, 0);
2767 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2768
2769 req = WinHttpOpenRequest(con, NULL, authW, NULL, NULL, NULL, 0);
2770 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2771
2773 ok(ret, "failed to set credentials %u\n", GetLastError());
2774
2776 ok(ret, "failed to set username %u\n", GetLastError());
2777
2778 ret = WinHttpSetOption(req, WINHTTP_OPTION_PASSWORD, pass2W, lstrlenW(pass2W));
2779 ok(ret, "failed to set password %u\n", GetLastError());
2780
2781 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
2782 ok(ret, "failed to send request %u\n", GetLastError());
2783
2785 ok(ret, "failed to receive response %u\n", GetLastError());
2786
2787 status = 0xdeadbeef;
2788 size = sizeof(status);
2790 ok(ret, "failed to query status code %u\n", GetLastError());
2791 ok(status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status);
2792
2793 WinHttpCloseHandle(req);
2794 WinHttpCloseHandle(con);
2795 WinHttpCloseHandle(ses);
2796
2798 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2799
2800 con = WinHttpConnect(ses, localhostW, port, 0);
2801 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2802
2803 req = WinHttpOpenRequest(con, NULL, authW, NULL, NULL, NULL, 0);
2804 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2805
2807 ok(ret, "failed to set username %u\n", GetLastError());
2808
2810 ok(ret, "failed to set password %u\n", GetLastError());
2811
2813 ok(ret, "failed to set credentials %u\n", GetLastError());
2814
2815 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
2816 ok(ret, "failed to send request %u\n", GetLastError());
2817
2819 ok(ret, "failed to receive response %u\n", GetLastError());
2820
2821 status = 0xdeadbeef;
2822 size = sizeof(status);
2824 ok(ret, "failed to query status code %u\n", GetLastError());
2825 ok(status == HTTP_STATUS_DENIED, "request failed unexpectedly %u\n", status);
2826
2827 WinHttpCloseHandle(req);
2828 WinHttpCloseHandle(con);
2829 WinHttpCloseHandle(ses);
2830}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define lstrlenW
Definition: compat.h:750
BOOL WINAPI WinHttpSetOption(HINTERNET handle, DWORD option, LPVOID buffer, DWORD buflen)
Definition: session.c:1312
const GLint * first
Definition: glext.h:5794
GLenum target
Definition: glext.h:7315
#define error(str)
Definition: mkdosfs.c:1605
BOOL WINAPI WinHttpReadData(HINTERNET hrequest, LPVOID buffer, DWORD to_read, LPDWORD read)
Definition: request.c:3053
BOOL WINAPI WinHttpSetCredentials(HINTERNET hrequest, DWORD target, DWORD scheme, LPCWSTR username, LPCWSTR password, LPVOID params)
Definition: request.c:2442
BOOL WINAPI WinHttpQueryAuthSchemes(HINTERNET hrequest, LPDWORD supported, LPDWORD first, LPDWORD target)
Definition: request.c:964
#define ERROR_INVALID_OPERATION
Definition: winerror.h:1261
#define WINHTTP_OPTION_USERNAME
Definition: winhttp.h:145
#define WINHTTP_AUTH_SCHEME_BASIC
Definition: winhttp.h:452
#define WINHTTP_AUTH_SCHEME_PASSPORT
Definition: winhttp.h:454
#define WINHTTP_OPTION_PASSWORD
Definition: winhttp.h:146
#define WINHTTP_AUTH_SCHEME_NEGOTIATE
Definition: winhttp.h:456
#define WINHTTP_AUTH_TARGET_SERVER
Definition: winhttp.h:458
#define WINHTTP_AUTH_SCHEME_DIGEST
Definition: winhttp.h:455
#define HTTP_STATUS_DENIED
Definition: winhttp.h:256
#define ERROR_WINHTTP_TIMEOUT
Definition: winhttp.h:189
#define ERROR_WINHTTP_SHUTDOWN
Definition: winhttp.h:196
#define WINHTTP_AUTH_SCHEME_NTLM
Definition: winhttp.h:453

Referenced by START_TEST().

◆ test_basic_request()

static void test_basic_request ( int  port,
const WCHAR verb,
const WCHAR path 
)
static

Definition at line 2463 of file winhttp.c.

2464{
2465 static const WCHAR test_header_end_clrf[] = {'\r','\n','\r','\n',0};
2466 static const WCHAR test_header_end_raw[] = {0,0};
2467 HINTERNET ses, con, req;
2468 char buffer[0x100];
2469 WCHAR buffer2[0x100];
2470 DWORD count, status, size, error, supported, first, target;
2471 BOOL ret;
2472
2474 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2475
2476 SetLastError(0xdeadbeef);
2477 ret = WinHttpSetOption(ses, 0, buffer, sizeof(buffer));
2479
2480 SetLastError(0xdeadbeef);
2481 ret = WinHttpQueryOption(ses, 0, buffer, &size);
2482 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %u\n", GetLastError());
2483
2484 con = WinHttpConnect(ses, localhostW, port, 0);
2485 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2486
2487 SetLastError(0xdeadbeef);
2488 ret = WinHttpSetOption(con, 0, buffer, sizeof(buffer));
2490
2491 SetLastError(0xdeadbeef);
2492 ret = WinHttpQueryOption(con, 0, buffer, &size);
2493 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %u\n", GetLastError());
2494
2495 req = WinHttpOpenRequest(con, verb, path, NULL, NULL, NULL, 0);
2496 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2497
2498 SetLastError(0xdeadbeef);
2499 ret = WinHttpSetOption(req, 0, buffer, sizeof(buffer));
2501
2502 SetLastError(0xdeadbeef);
2503 ret = WinHttpQueryOption(req, 0, buffer, &size);
2504 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %u\n", GetLastError());
2505
2506 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
2507 ok(ret, "failed to send request %u\n", GetLastError());
2508
2510 ok(ret, "failed to receive response %u\n", GetLastError());
2511
2512 status = 0xdeadbeef;
2513 size = sizeof(status);
2515 ok(ret, "failed to query status code %u\n", GetLastError());
2516 ok(status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status);
2517
2518 supported = first = target = 0xdeadbeef;
2519 SetLastError(0xdeadbeef);
2520 ret = WinHttpQueryAuthSchemes(req, &supported, &first, &target);
2521 error = GetLastError();
2522 ok(!ret, "unexpected success\n");
2523 ok(error == ERROR_INVALID_OPERATION, "expected ERROR_INVALID_OPERATION, got %u\n", error);
2524 ok(supported == 0xdeadbeef, "got %x\n", supported);
2525 ok(first == 0xdeadbeef, "got %x\n", first);
2526 ok(target == 0xdeadbeef, "got %x\n", target);
2527
2528 size = sizeof(buffer2);
2529 memset(buffer2, 0, sizeof(buffer2));
2531 ok(ret, "failed to query for raw headers: %u\n", GetLastError());
2532 ok(!memcmp(buffer2 + lstrlenW(buffer2) - 4, test_header_end_clrf, sizeof(test_header_end_clrf)),
2533 "WinHttpQueryHeaders returned invalid end of header string\n");
2534
2535 size = sizeof(buffer2);
2536 memset(buffer2, 0, sizeof(buffer2));
2538 ok(ret, "failed to query for raw headers: %u\n", GetLastError());
2539 ok(!memcmp(buffer2 + (size / sizeof(WCHAR)) - 1, test_header_end_raw, sizeof(test_header_end_raw)),
2540 "WinHttpQueryHeaders returned invalid end of header string\n");
2541 ok(buffer2[(size / sizeof(WCHAR)) - 2] != 0, "returned string has too many NULL characters\n");
2542
2543 count = 0;
2544 memset(buffer, 0, sizeof(buffer));
2545 ret = WinHttpReadData(req, buffer, sizeof buffer, &count);
2546 ok(ret, "failed to read data %u\n", GetLastError());
2547 ok(count == sizeof page1 - 1, "count was wrong\n");
2548 ok(!memcmp(buffer, page1, sizeof page1), "http data wrong\n");
2549
2550 WinHttpCloseHandle(req);
2551 WinHttpCloseHandle(con);
2552 WinHttpCloseHandle(ses);
2553}
BOOL WINAPI WinHttpQueryOption(HINTERNET handle, DWORD option, LPVOID buffer, LPDWORD buflen)
Definition: session.c:1253
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define todo_wine
Definition: custom.c:79
#define ERROR_WINHTTP_INVALID_OPTION
Definition: winhttp.h:194
#define WINHTTP_QUERY_RAW_HEADERS_CRLF
Definition: winhttp.h:320
#define WINHTTP_QUERY_RAW_HEADERS
Definition: winhttp.h:319

Referenced by START_TEST().

◆ test_chunked_read()

static void test_chunked_read ( void  )
static

Definition at line 4755 of file winhttp.c.

4756{
4757 static const WCHAR verb[] = {'/','t','e','s','t','s','/','c','h','u','n','k','e','d',0};
4758 static const WCHAR chunked[] = {'c','h','u','n','k','e','d',0};
4759 WCHAR header[32];
4760 DWORD len, err;
4761 HINTERNET ses, con = NULL, req = NULL;
4762 BOOL ret;
4763
4764 trace( "starting chunked read test\n" );
4765
4766 ses = WinHttpOpen( test_useragent, 0, NULL, NULL, 0 );
4767 ok( ses != NULL, "WinHttpOpen failed with error %u\n", GetLastError() );
4768 if (!ses) goto done;
4769
4770 con = WinHttpConnect( ses, test_winehq, 0, 0 );
4771 ok( con != NULL, "WinHttpConnect failed with error %u\n", GetLastError() );
4772 if (!con) goto done;
4773
4774 req = WinHttpOpenRequest( con, NULL, verb, NULL, NULL, NULL, 0 );
4775 ok( req != NULL, "WinHttpOpenRequest failed with error %u\n", GetLastError() );
4776 if (!req) goto done;
4777
4778 ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
4779 err = GetLastError();
4781 {
4782 skip("connection failed, skipping\n");
4783 goto done;
4784 }
4785 ok( ret, "WinHttpSendRequest failed with error %u\n", GetLastError() );
4786 if (!ret) goto done;
4787
4789 ok( ret, "WinHttpReceiveResponse failed with error %u\n", GetLastError() );
4790 if (!ret) goto done;
4791
4792 header[0] = 0;
4793 len = sizeof(header);
4795 ok( ret, "failed to get TRANSFER_ENCODING header (error %u)\n", GetLastError() );
4796 ok( !lstrcmpW( header, chunked ), "wrong transfer encoding %s\n", wine_dbgstr_w(header) );
4797 trace( "transfer encoding: %s\n", wine_dbgstr_w(header) );
4798
4799 header[0] = 0;
4800 len = sizeof(header);
4801 SetLastError( 0xdeadbeef );
4803 ok( !ret, "unexpected CONTENT_LENGTH header %s\n", wine_dbgstr_w(header) );
4804 ok( GetLastError() == ERROR_WINHTTP_HEADER_NOT_FOUND, "wrong error %u\n", GetLastError() );
4805
4806 trace( "entering query loop\n" );
4807 for (;;)
4808 {
4809 len = 0xdeadbeef;
4811 ok( ret, "WinHttpQueryDataAvailable failed with error %u\n", GetLastError() );
4812 if (ret) ok( len != 0xdeadbeef, "WinHttpQueryDataAvailable return wrong length\n" );
4813 trace( "got %u available\n", len );
4814 if (len)
4815 {
4816 DWORD bytes_read;
4817 char *buf = HeapAlloc( GetProcessHeap(), 0, len + 1 );
4818
4819 ret = WinHttpReadData( req, buf, len, &bytes_read );
4820 ok(ret, "WinHttpReadData failed: %u.\n", GetLastError());
4821
4822 buf[bytes_read] = 0;
4823 trace( "WinHttpReadData -> %d %u\n", ret, bytes_read );
4824 ok( len == bytes_read, "only got %u of %u available\n", bytes_read, len );
4825 ok( buf[bytes_read - 1] == '\n', "received partial line '%s'\n", buf );
4826
4827 HeapFree( GetProcessHeap(), 0, buf );
4828 if (!bytes_read) break;
4829 }
4830 if (!len) break;
4831 }
4832 trace( "done\n" );
4833
4834done:
4835 if (req) WinHttpCloseHandle( req );
4836 if (con) WinHttpCloseHandle( con );
4837 if (ses) WinHttpCloseHandle( ses );
4838}
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define err(...)
BOOL WINAPI WinHttpQueryDataAvailable(HINTERNET hrequest, LPDWORD available)
Definition: request.c:3005
static const WCHAR test_winehq[]
Definition: winhttp.c:42
#define WINHTTP_QUERY_CONTENT_LENGTH
Definition: winhttp.h:303
#define ERROR_WINHTTP_CANNOT_CONNECT
Definition: winhttp.h:201
#define ERROR_WINHTTP_HEADER_NOT_FOUND
Definition: winhttp.h:213
#define WINHTTP_QUERY_TRANSFER_ENCODING
Definition: winhttp.h:361

Referenced by START_TEST().

◆ test_connection_info()

static void test_connection_info ( int  port)
static

Definition at line 3495 of file winhttp.c.

3496{
3497 static const WCHAR basicW[] = {'/','b','a','s','i','c',0};
3498 HINTERNET ses, con, req;
3499 WINHTTP_CONNECTION_INFO info;
3500 DWORD size, error;
3501 BOOL ret;
3502
3504 ok( ses != NULL, "failed to open session %u\n", GetLastError() );
3505
3506 con = WinHttpConnect( ses, localhostW, port, 0 );
3507 ok( con != NULL, "failed to open a connection %u\n", GetLastError() );
3508
3509 req = WinHttpOpenRequest( con, NULL, basicW, NULL, NULL, NULL, 0 );
3510 ok( req != NULL, "failed to open a request %u\n", GetLastError() );
3511
3512 size = sizeof(info);
3513 SetLastError( 0xdeadbeef );
3515 error = GetLastError();
3517 {
3518 win_skip( "WINHTTP_OPTION_CONNECTION_INFO not supported\n" );
3519 return;
3520 }
3521 ok( !ret, "unexpected success\n" );
3523
3524 ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
3525 ok( ret, "failed to send request %u\n", GetLastError() );
3526
3527 size = 0;
3528 SetLastError( 0xdeadbeef );
3530 error = GetLastError();
3531 ok( !ret, "unexpected success\n" );
3532 ok( error == ERROR_INSUFFICIENT_BUFFER, "got %u\n", error );
3533
3534 size = sizeof(info);
3535 memset( &info, 0, sizeof(info) );
3537 ok( ret, "failed to retrieve connection info %u\n", GetLastError() );
3538 ok( info.cbSize == sizeof(info) || info.cbSize == sizeof(info) - sizeof(info.cbSize) /* Win7 */, "wrong size %u\n", info.cbSize );
3539
3541 ok( ret, "failed to receive response %u\n", GetLastError() );
3542
3543 size = sizeof(info);
3544 memset( &info, 0, sizeof(info) );
3546 ok( ret, "failed to retrieve connection info %u\n", GetLastError() );
3547 ok( info.cbSize == sizeof(info) || info.cbSize == sizeof(info) - sizeof(info.cbSize) /* Win7 */, "wrong size %u\n", info.cbSize );
3548
3549 WinHttpCloseHandle( req );
3550 WinHttpCloseHandle( con );
3551 WinHttpCloseHandle( ses );
3552}
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define win_skip
Definition: test.h:160
#define WINHTTP_OPTION_CONNECTION_INFO
Definition: winhttp.h:136
#define ERROR_WINHTTP_INCORRECT_HANDLE_STATE
Definition: winhttp.h:200

Referenced by START_TEST().

◆ test_cookies()

static void test_cookies ( int  port)
static

Definition at line 3266 of file winhttp.c.

3267{
3268 static const WCHAR cookieW[] = {'/','c','o','o','k','i','e',0};
3269 static const WCHAR cookie2W[] = {'/','c','o','o','k','i','e','2',0};
3270 static const WCHAR cookie3W[] = {'/','c','o','o','k','i','e','3',0};
3271 static const WCHAR cookie4W[] = {'/','c','o','o','k','i','e','4',0};
3272 static const WCHAR cookie5W[] = {'/','c','o','o','k','i','e','5',0};
3273 static const WCHAR cookieheaderW[] =
3274 {'C','o','o','k','i','e',':',' ','n','a','m','e','=','v','a','l','u','e','2','\r','\n',0};
3275 HINTERNET ses, con, req;
3276 DWORD status, size;
3277 BOOL ret;
3278
3280 ok( ses != NULL, "failed to open session %u\n", GetLastError() );
3281
3282 con = WinHttpConnect( ses, localhostW, port, 0 );
3283 ok( con != NULL, "failed to open a connection %u\n", GetLastError() );
3284
3285 req = WinHttpOpenRequest( con, NULL, cookieW, NULL, NULL, NULL, 0 );
3286 ok( req != NULL, "failed to open a request %u\n", GetLastError() );
3287
3288 ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
3289 ok( ret, "failed to send request %u\n", GetLastError() );
3290
3292 ok( ret, "failed to receive response %u\n", GetLastError() );
3293
3294 status = 0xdeadbeef;
3295 size = sizeof(status);
3297 ok( ret, "failed to query status code %u\n", GetLastError() );
3298 ok( status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status );
3299
3300 WinHttpCloseHandle( req );
3301
3302 req = WinHttpOpenRequest( con, NULL, cookie2W, NULL, NULL, NULL, 0 );
3303 ok( req != NULL, "failed to open a request %u\n", GetLastError() );
3304
3305 ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
3306 ok( ret, "failed to send request %u\n", GetLastError() );
3307
3309 ok( ret, "failed to receive response %u\n", GetLastError() );
3310
3311 status = 0xdeadbeef;
3312 size = sizeof(status);
3314 ok( ret, "failed to query status code %u\n", GetLastError() );
3315 ok( status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status );
3316
3317 WinHttpCloseHandle( req );
3318 WinHttpCloseHandle( con );
3319
3320 con = WinHttpConnect( ses, localhostW, port, 0 );
3321 ok( con != NULL, "failed to open a connection %u\n", GetLastError() );
3322
3323 req = WinHttpOpenRequest( con, NULL, cookie2W, NULL, NULL, NULL, 0 );
3324 ok( req != NULL, "failed to open a request %u\n", GetLastError() );
3325
3326 ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
3327 ok( ret, "failed to send request %u\n", GetLastError() );
3328
3330 ok( ret, "failed to receive response %u\n", GetLastError() );
3331
3332 status = 0xdeadbeef;
3333 size = sizeof(status);
3335 ok( ret, "failed to query status code %u\n", GetLastError() );
3336 ok( status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status );
3337
3338 WinHttpCloseHandle( req );
3339
3340 req = WinHttpOpenRequest( con, NULL, cookie3W, NULL, NULL, NULL, 0 );
3341 ok( req != NULL, "failed to open a request %u\n", GetLastError() );
3342
3343 ret = WinHttpSendRequest( req, cookieheaderW, ~0u, NULL, 0, 0, 0 );
3344 ok( ret, "failed to send request %u\n", GetLastError() );
3345
3347 ok( ret, "failed to receive response %u\n", GetLastError() );
3348
3349 status = 0xdeadbeef;
3350 size = sizeof(status);
3352 ok( ret, "failed to query status code %u\n", GetLastError() );
3353 ok( status == HTTP_STATUS_OK || broken(status == HTTP_STATUS_BAD_REQUEST), "request failed unexpectedly %u\n", status );
3354
3355 WinHttpCloseHandle( req );
3356 WinHttpCloseHandle( con );
3357 WinHttpCloseHandle( ses );
3358
3360 ok( ses != NULL, "failed to open session %u\n", GetLastError() );
3361
3362 con = WinHttpConnect( ses, localhostW, port, 0 );
3363 ok( con != NULL, "failed to open a connection %u\n", GetLastError() );
3364
3365 req = WinHttpOpenRequest( con, NULL, cookie2W, NULL, NULL, NULL, 0 );
3366 ok( req != NULL, "failed to open a request %u\n", GetLastError() );
3367
3368 ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
3369 ok( ret, "failed to send request %u\n", GetLastError() );
3370
3372 ok( ret, "failed to receive response %u\n", GetLastError() );
3373
3374 status = 0xdeadbeef;
3375 size = sizeof(status);
3377 ok( ret, "failed to query status code %u\n", GetLastError() );
3378 ok( status == HTTP_STATUS_BAD_REQUEST, "request failed unexpectedly %u\n", status );
3379
3380 WinHttpCloseHandle( req );
3381 WinHttpCloseHandle( con );
3382 WinHttpCloseHandle( ses );
3383
3385 ok( ses != NULL, "failed to open session %u\n", GetLastError() );
3386
3387 con = WinHttpConnect( ses, localhostW, port, 0 );
3388 ok( con != NULL, "failed to open a connection %u\n", GetLastError() );
3389
3390 req = WinHttpOpenRequest( con, NULL, cookie4W, NULL, NULL, NULL, 0 );
3391 ok( req != NULL, "failed to open a request %u\n", GetLastError() );
3392
3393 ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
3394 ok( ret, "failed to send request %u\n", GetLastError() );
3395
3397 ok( ret, "failed to receive response %u\n", GetLastError() );
3398
3399 status = 0xdeadbeef;
3400 size = sizeof(status);
3402 ok( ret, "failed to query status code %u\n", GetLastError() );
3403 ok( status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status );
3404 WinHttpCloseHandle( req );
3405
3406 req = WinHttpOpenRequest( con, NULL, cookie5W, NULL, NULL, NULL, 0 );
3407 ok( req != NULL, "failed to open a request %u\n", GetLastError() );
3408
3409 ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
3410 ok( ret, "failed to send request %u\n", GetLastError() );
3411
3413 ok( ret, "failed to receive response %u\n", GetLastError() );
3414
3415 status = 0xdeadbeef;
3416 size = sizeof(status);
3418 ok( ret, "failed to query status code %u\n", GetLastError() );
3420 "request failed unexpectedly %u\n", status );
3421
3422 WinHttpCloseHandle( req );
3423 WinHttpCloseHandle( con );
3424 WinHttpCloseHandle( ses );
3425}

Referenced by START_TEST().

◆ test_credentials()

static void test_credentials ( void  )
static

Definition at line 3625 of file winhttp.c.

3626{
3627 static WCHAR userW[] = {'u','s','e','r',0};
3628 static WCHAR passW[] = {'p','a','s','s',0};
3629 static WCHAR proxy_userW[] = {'p','r','o','x','y','u','s','e','r',0};
3630 static WCHAR proxy_passW[] = {'p','r','o','x','y','p','a','s','s',0};
3631 HINTERNET ses, con, req;
3632 DWORD size, error;
3633 WCHAR buffer[32];
3634 BOOL ret;
3635
3636 ses = WinHttpOpen(test_useragent, 0, proxy_userW, proxy_passW, 0);
3637 ok(ses != NULL, "failed to open session %u\n", GetLastError());
3638
3639 con = WinHttpConnect(ses, localhostW, 0, 0);
3640 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
3641
3642 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
3643 ok(req != NULL, "failed to open a request %u\n", GetLastError());
3644
3647 ok(ret, "failed to query proxy username %u\n", GetLastError());
3648 ok(!buffer[0], "unexpected result %s\n", wine_dbgstr_w(buffer));
3649 ok(!size, "expected 0, got %u\n", size);
3650
3653 ok(ret, "failed to query proxy password %u\n", GetLastError());
3654 ok(!buffer[0], "unexpected result %s\n", wine_dbgstr_w(buffer));
3655 ok(!size, "expected 0, got %u\n", size);
3656
3657 ret = WinHttpSetOption(req, WINHTTP_OPTION_PROXY_USERNAME, proxy_userW, lstrlenW(proxy_userW));
3658 ok(ret, "failed to set username %u\n", GetLastError());
3659
3662 ok(ret, "failed to query proxy username %u\n", GetLastError());
3663 ok(!winetest_strcmpW(buffer, proxy_userW), "unexpected result %s\n", wine_dbgstr_w(buffer));
3664 ok(size == lstrlenW(proxy_userW) * sizeof(WCHAR), "unexpected result %u\n", size);
3665
3668 ok(ret, "failed to query username %u\n", GetLastError());
3669 ok(!buffer[0], "unexpected result %s\n", wine_dbgstr_w(buffer));
3670 ok(!size, "expected 0, got %u\n", size);
3671
3674 ok(ret, "failed to query password %u\n", GetLastError());
3675 ok(!buffer[0], "unexpected result %s\n", wine_dbgstr_w(buffer));
3676 ok(!size, "expected 0, got %u\n", size);
3677
3678 ret = WinHttpSetOption(req, WINHTTP_OPTION_PROXY_PASSWORD, proxy_passW, lstrlenW(proxy_passW));
3679 ok(ret, "failed to set proxy password %u\n", GetLastError());
3680
3683 ok(ret, "failed to query proxy password %u\n", GetLastError());
3684 ok(!winetest_strcmpW(buffer, proxy_passW), "unexpected result %s\n", wine_dbgstr_w(buffer));
3685 ok(size == lstrlenW(proxy_passW) * sizeof(WCHAR), "unexpected result %u\n", size);
3686
3688 ok(ret, "failed to set username %u\n", GetLastError());
3689
3692 ok(ret, "failed to query username %u\n", GetLastError());
3693 ok(!winetest_strcmpW(buffer, userW), "unexpected result %s\n", wine_dbgstr_w(buffer));
3694 ok(size == lstrlenW(userW) * sizeof(WCHAR), "unexpected result %u\n", size);
3695
3697 ok(ret, "failed to set password %u\n", GetLastError());
3698
3701 ok(ret, "failed to query password %u\n", GetLastError());
3702 ok(!winetest_strcmpW(buffer, passW), "unexpected result %s\n", wine_dbgstr_w(buffer));
3703 ok(size == lstrlenW(passW) * sizeof(WCHAR), "unexpected result %u\n", size);
3704
3705 WinHttpCloseHandle(req);
3706
3707 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
3708 ok(req != NULL, "failed to open a request %u\n", GetLastError());
3709
3710 SetLastError(0xdeadbeef);
3712 error = GetLastError();
3713 ok(!ret, "expected failure\n");
3714 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
3715
3716 SetLastError(0xdeadbeef);
3718 error = GetLastError();
3719 ok(!ret, "expected failure\n");
3720 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
3721
3723 ok(ret, "failed to set credentials %u\n", GetLastError());
3724
3727 ok(ret, "failed to query username %u\n", GetLastError());
3728 todo_wine {
3729 ok(!buffer[0], "unexpected result %s\n", wine_dbgstr_w(buffer));
3730 ok(!size, "expected 0, got %u\n", size);
3731 }
3732
3735 ok(ret, "failed to query password %u\n", GetLastError());
3736 todo_wine {
3737 ok(!buffer[0], "unexpected result %s\n", wine_dbgstr_w(buffer));
3738 ok(!size, "expected 0, got %u\n", size);
3739 }
3740
3741 WinHttpCloseHandle(req);
3742 WinHttpCloseHandle(con);
3743 WinHttpCloseHandle(ses);
3744}
#define ARRAY_SIZE(A)
Definition: main.h:33
static int winetest_strcmpW(const WCHAR *str1, const WCHAR *str2)
Definition: test.h:94
#define WINHTTP_OPTION_PROXY_PASSWORD
Definition: winhttp.h:148
#define WINHTTP_OPTION_PROXY_USERNAME
Definition: winhttp.h:147

Referenced by START_TEST().

◆ test_empty_headers_param()

static void test_empty_headers_param ( void  )
static

Definition at line 334 of file winhttp.c.

335{
336 static const WCHAR empty[] = {0};
337 HINTERNET ses, con, req;
338 DWORD err;
339 BOOL ret;
340
341 ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
342 ok(ses != NULL, "failed to open session %u\n", GetLastError());
343
344 con = WinHttpConnect(ses, test_winehq, 80, 0);
345 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
346
347 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
348 ok(req != NULL, "failed to open a request %u\n", GetLastError());
349
350 ret = WinHttpSendRequest(req, empty, 0, NULL, 0, 0, 0);
351 err = GetLastError();
353 {
354 skip("connection failed, skipping\n");
355 goto done;
356 }
357 ok(ret, "failed to send request %u\n", GetLastError());
358
359 done:
363}
static const WCHAR empty[]
Definition: main.c:47

Referenced by START_TEST().

◆ test_head_request()

static void test_head_request ( int  port)
static

Definition at line 3058 of file winhttp.c.

3059{
3060 static const WCHAR verbW[] = {'H','E','A','D',0};
3061 static const WCHAR headW[] = {'/','h','e','a','d',0};
3062 HINTERNET ses, con, req;
3063 char buf[128];
3065 BOOL ret;
3066
3068 ok(ses != NULL, "failed to open session %u\n", GetLastError());
3069
3070 con = WinHttpConnect(ses, localhostW, port, 0);
3071 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
3072
3073 req = WinHttpOpenRequest(con, verbW, headW, NULL, NULL, NULL, 0);
3074 ok(req != NULL, "failed to open a request %u\n", GetLastError());
3075
3076 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
3077 ok(ret, "failed to send request %u\n", GetLastError());
3078
3080 ok(ret, "failed to receive response %u\n", GetLastError());
3081
3082 status = 0xdeadbeef;
3083 size = sizeof(status);
3085 NULL, &status, &size, NULL);
3086 ok(ret, "failed to get status code %u\n", GetLastError());
3087 ok(status == HTTP_STATUS_OK, "got %u\n", status);
3088
3089 len = 0xdeadbeef;
3090 size = sizeof(len);
3092 NULL, &len, &size, 0);
3093 ok(ret, "failed to get content-length header %u\n", GetLastError());
3094 ok(len == HTTP_STATUS_CONTINUE, "got %u\n", len);
3095
3096 count = 0xdeadbeef;
3098 ok(ret, "failed to query data available %u\n", GetLastError());
3099 ok(!count, "got %u\n", count);
3100
3101 len = sizeof(buf);
3102 count = 0xdeadbeef;
3103 ret = WinHttpReadData(req, buf, len, &count);
3104 ok(ret, "failed to read data %u\n", GetLastError());
3105 ok(!count, "got %u\n", count);
3106
3107 count = 0xdeadbeef;
3109 ok(ret, "failed to query data available %u\n", GetLastError());
3110 ok(!count, "got %u\n", count);
3111
3112 WinHttpCloseHandle(req);
3113 WinHttpCloseHandle(con);
3114 WinHttpCloseHandle(ses);
3115}
static const WCHAR headW[]
Definition: htmlelem.c:28
static const WCHAR verbW[]
Definition: main.c:64
#define HTTP_STATUS_CONTINUE
Definition: winhttp.h:238

Referenced by START_TEST().

◆ test_IWinHttpRequest()

static void test_IWinHttpRequest ( int  port)
static

Definition at line 3746 of file winhttp.c.

3747{
3748 static const WCHAR data_start[] = {'<','!','D','O','C','T','Y','P','E',' ','h','t','m','l',' ','P','U','B','L','I','C'};
3749 static const WCHAR usernameW[] = {'u','s','e','r','n','a','m','e',0};
3750 static const WCHAR passwordW[] = {'p','a','s','s','w','o','r','d',0};
3751 static const WCHAR url1W[] = {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0};
3752 static const WCHAR url2W[] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0};
3753 static const WCHAR url3W[] = {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.',
3754 'o','r','g','/','t','e','s','t','s','/','p','o','s','t','.','p','h','p',0};
3755 static const WCHAR method1W[] = {'G','E','T',0};
3756 static const WCHAR method2W[] = {'I','N','V','A','L','I','D',0};
3757 static const WCHAR method3W[] = {'P','O','S','T',0};
3758 static const WCHAR proxy_serverW[] = {'p','r','o','x','y','s','e','r','v','e','r',0};
3759 static const WCHAR bypas_listW[] = {'b','y','p','a','s','s','l','i','s','t',0};
3760 static const WCHAR connectionW[] = {'C','o','n','n','e','c','t','i','o','n',0};
3761 static const WCHAR dateW[] = {'D','a','t','e',0};
3762 static const WCHAR test_dataW[] = {'t','e','s','t','d','a','t','a',128,0};
3763 static const WCHAR utf8W[] = {'u','t','f','-','8',0};
3764 static const WCHAR unauthW[] = {'U','n','a','u','t','h','o','r','i','z','e','d',0};
3765 HRESULT hr;
3766 IWinHttpRequest *req;
3767 BSTR method, url, username, password, response = NULL, status_text = NULL, headers = NULL;
3768 BSTR date, today, connection, value = NULL;
3769 VARIANT async, empty, timeout, body, body2, proxy_server, bypass_list, data, cp;
3770 VARIANT_BOOL succeeded;
3771 LONG status;
3773 SYSTEMTIME st;
3774 IStream *stream, *stream2;
3776 char buf[128];
3777 WCHAR bufW[128];
3778 DWORD count;
3779
3780 GetSystemTime( &st );
3781 WinHttpTimeFromSystemTime( &st, todayW );
3782
3783 CoInitialize( NULL );
3784 hr = CoCreateInstance( &CLSID_WinHttpRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IWinHttpRequest, (void **)&req );
3785 ok( hr == S_OK, "got %08x\n", hr );
3786
3787 V_VT( &empty ) = VT_ERROR;
3788 V_ERROR( &empty ) = 0xdeadbeef;
3789
3790 V_VT( &async ) = VT_BOOL;
3791 V_BOOL( &async ) = VARIANT_FALSE;
3792
3793 method = SysAllocString( method3W );
3794 url = SysAllocString( url3W );
3795 hr = IWinHttpRequest_Open( req, method, url, async );
3796 ok( hr == S_OK, "got %08x\n", hr );
3798 SysFreeString( url );
3799
3800 V_VT( &data ) = VT_BSTR;
3801 V_BSTR( &data ) = SysAllocString( test_dataW );
3802 hr = IWinHttpRequest_Send( req, data );
3804 SysFreeString( V_BSTR( &data ) );
3805 if (hr != S_OK) goto done;
3806
3807 hr = IWinHttpRequest_Open( req, NULL, NULL, empty );
3808 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3809
3810 method = SysAllocString( method1W );
3811 hr = IWinHttpRequest_Open( req, method, NULL, empty );
3812 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3813
3814 hr = IWinHttpRequest_Open( req, method, NULL, async );
3815 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3816
3818 hr = IWinHttpRequest_Open( req, NULL, url, empty );
3819 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3820
3821 hr = IWinHttpRequest_Abort( req );
3822 ok( hr == S_OK, "got %08x\n", hr );
3823
3824 hr = IWinHttpRequest_Open( req, method, url, empty );
3825 ok( hr == S_OK, "got %08x\n", hr );
3826
3827 hr = IWinHttpRequest_Abort( req );
3828 ok( hr == S_OK, "got %08x\n", hr );
3829
3830 IWinHttpRequest_Release( req );
3831
3832 hr = CoCreateInstance( &CLSID_WinHttpRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IWinHttpRequest, (void **)&req );
3833 ok( hr == S_OK, "got %08x\n", hr );
3834
3835 SysFreeString( url );
3836 url = SysAllocString( url2W );
3837 hr = IWinHttpRequest_Open( req, method, url, async );
3839
3841 method = SysAllocString( method2W );
3842 hr = IWinHttpRequest_Open( req, method, url, async );
3844
3846 method = SysAllocString( method1W );
3847 SysFreeString( url );
3849 V_VT( &async ) = VT_ERROR;
3850 V_ERROR( &async ) = DISP_E_PARAMNOTFOUND;
3851 hr = IWinHttpRequest_Open( req, method, url, async );
3852 ok( hr == S_OK, "got %08x\n", hr );
3853
3854 V_VT( &cp ) = VT_ERROR;
3855 V_ERROR( &cp ) = 0xdeadbeef;
3856 hr = IWinHttpRequest_get_Option( req, WinHttpRequestOption_URLCodePage, &cp );
3857 ok( hr == S_OK, "got %08x\n", hr );
3858 ok( V_VT( &cp ) == VT_I4, "got %08x\n", V_VT( &cp ) );
3859 ok( V_I4( &cp ) == CP_UTF8, "got %u\n", V_I4( &cp ) );
3860
3861 V_VT( &cp ) = VT_UI4;
3862 V_UI4( &cp ) = CP_ACP;
3863 hr = IWinHttpRequest_put_Option( req, WinHttpRequestOption_URLCodePage, cp );
3864 ok( hr == S_OK, "got %08x\n", hr );
3865
3866 V_VT( &cp ) = VT_ERROR;
3867 V_ERROR( &cp ) = 0xdeadbeef;
3868 hr = IWinHttpRequest_get_Option( req, WinHttpRequestOption_URLCodePage, &cp );
3869 ok( hr == S_OK, "got %08x\n", hr );
3870 ok( V_VT( &cp ) == VT_I4, "got %08x\n", V_VT( &cp ) );
3871 ok( V_I4( &cp ) == CP_ACP, "got %u\n", V_I4( &cp ) );
3872
3874 V_VT( &cp ) = VT_BSTR;
3875 V_BSTR( &cp ) = value;
3876 hr = IWinHttpRequest_put_Option( req, WinHttpRequestOption_URLCodePage, cp );
3877 ok( hr == S_OK, "got %08x\n", hr );
3879
3880 V_VT( &cp ) = VT_ERROR;
3881 V_ERROR( &cp ) = 0xdeadbeef;
3882 hr = IWinHttpRequest_get_Option( req, WinHttpRequestOption_URLCodePage, &cp );
3883 ok( hr == S_OK, "got %08x\n", hr );
3884 ok( V_VT( &cp ) == VT_I4, "got %08x\n", V_VT( &cp ) );
3885 ok( V_I4( &cp ) == CP_UTF8, "got %u\n", V_I4( &cp ) );
3886
3887 hr = IWinHttpRequest_Abort( req );
3888 ok( hr == S_OK, "got %08x\n", hr );
3889
3890 hr = IWinHttpRequest_Send( req, empty );
3892
3893 hr = IWinHttpRequest_Abort( req );
3894 ok( hr == S_OK, "got %08x\n", hr );
3895
3896 IWinHttpRequest_Release( req );
3897
3898 hr = CoCreateInstance( &CLSID_WinHttpRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IWinHttpRequest, (void **)&req );
3899 ok( hr == S_OK, "got %08x\n", hr );
3900
3901 hr = IWinHttpRequest_get_ResponseText( req, NULL );
3902 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3903
3904 hr = IWinHttpRequest_get_ResponseText( req, &response );
3906
3907 hr = IWinHttpRequest_get_Status( req, NULL );
3908 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3909
3910 hr = IWinHttpRequest_get_Status( req, &status );
3912
3913 hr = IWinHttpRequest_get_StatusText( req, NULL );
3914 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3915
3916 hr = IWinHttpRequest_get_StatusText( req, &status_text );
3918
3919 hr = IWinHttpRequest_get_ResponseBody( req, NULL );
3920 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3921
3922 hr = IWinHttpRequest_SetTimeouts( req, 10000, 10000, 10000, 10000 );
3923 ok( hr == S_OK, "got %08x\n", hr );
3924
3925 hr = IWinHttpRequest_SetCredentials( req, NULL, NULL, 0xdeadbeef );
3927
3930 VariantInit( &bypass_list );
3931 V_VT( &bypass_list ) = VT_ERROR;
3932 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_DIRECT, proxy_server, bypass_list );
3933 ok( hr == S_OK, "got %08x\n", hr );
3934
3935 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_PROXY, proxy_server, bypass_list );
3936 ok( hr == S_OK, "got %08x\n", hr );
3937
3938 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_DIRECT, proxy_server, bypass_list );
3939 ok( hr == S_OK, "got %08x\n", hr );
3940
3941 hr = IWinHttpRequest_GetAllResponseHeaders( req, NULL );
3942 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3943
3944 hr = IWinHttpRequest_GetAllResponseHeaders( req, &headers );
3946
3947 hr = IWinHttpRequest_GetResponseHeader( req, NULL, NULL );
3949
3950 connection = SysAllocString( connectionW );
3951 hr = IWinHttpRequest_GetResponseHeader( req, connection, NULL );
3953
3954 hr = IWinHttpRequest_GetResponseHeader( req, connection, &value );
3956
3957 hr = IWinHttpRequest_SetRequestHeader( req, NULL, NULL );
3958 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3959
3960 date = SysAllocString( dateW );
3961 hr = IWinHttpRequest_SetRequestHeader( req, date, NULL );
3963
3964 today = SysAllocString( todayW );
3965 hr = IWinHttpRequest_SetRequestHeader( req, date, today );
3967
3968 hr = IWinHttpRequest_SetAutoLogonPolicy( req, 0xdeadbeef );
3969 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3970
3971 hr = IWinHttpRequest_SetAutoLogonPolicy( req, AutoLogonPolicy_OnlyIfBypassProxy );
3972 ok( hr == S_OK, "got %08x\n", hr );
3973
3975 method = SysAllocString( method1W );
3976 SysFreeString( url );
3978 hr = IWinHttpRequest_Open( req, method, url, async );
3979 ok( hr == S_OK, "got %08x\n", hr );
3980
3981 hr = IWinHttpRequest_get_ResponseText( req, NULL );
3982 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3983
3984 hr = IWinHttpRequest_get_ResponseText( req, &response );
3986
3987 hr = IWinHttpRequest_get_Status( req, &status );
3989
3990 hr = IWinHttpRequest_get_StatusText( req, &status_text );
3992
3993 hr = IWinHttpRequest_get_ResponseBody( req, NULL );
3994 ok( hr == E_INVALIDARG, "got %08x\n", hr );
3995
3996 hr = IWinHttpRequest_SetTimeouts( req, 10000, 10000, 10000, 10000 );
3997 ok( hr == S_OK, "got %08x\n", hr );
3998
3999 hr = IWinHttpRequest_SetCredentials( req, NULL, NULL, 0xdeadbeef );
4000 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4001
4002 username = SysAllocString( usernameW );
4003 hr = IWinHttpRequest_SetCredentials( req, username, NULL, 0xdeadbeef );
4004 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4005
4006 password = SysAllocString( passwordW );
4007 hr = IWinHttpRequest_SetCredentials( req, NULL, password, 0xdeadbeef );
4008 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4009
4010 hr = IWinHttpRequest_SetCredentials( req, username, password, 0xdeadbeef );
4011 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4012
4013 hr = IWinHttpRequest_SetCredentials( req, NULL, password, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER );
4014 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4015
4016 hr = IWinHttpRequest_SetCredentials( req, username, password, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER );
4017 ok( hr == S_OK, "got %08x\n", hr );
4018
4020 V_BSTR( &proxy_server ) = SysAllocString( proxy_serverW );
4021 V_VT( &bypass_list ) = VT_BSTR;
4022 V_BSTR( &bypass_list ) = SysAllocString( bypas_listW );
4023 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_PROXY, proxy_server, bypass_list );
4024 ok( hr == S_OK, "got %08x\n", hr );
4025
4026 hr = IWinHttpRequest_SetProxy( req, 0xdeadbeef, proxy_server, bypass_list );
4027 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4028
4029 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_DIRECT, proxy_server, bypass_list );
4030 ok( hr == S_OK, "got %08x\n", hr );
4031
4032 hr = IWinHttpRequest_GetAllResponseHeaders( req, &headers );
4034
4035 hr = IWinHttpRequest_GetResponseHeader( req, connection, &value );
4037
4038 hr = IWinHttpRequest_SetRequestHeader( req, date, today );
4039 ok( hr == S_OK, "got %08x\n", hr );
4040
4041 hr = IWinHttpRequest_SetRequestHeader( req, date, NULL );
4042 ok( hr == S_OK, "got %08x\n", hr );
4043
4044 hr = IWinHttpRequest_SetAutoLogonPolicy( req, AutoLogonPolicy_OnlyIfBypassProxy );
4045 ok( hr == S_OK, "got %08x\n", hr );
4046
4047 hr = IWinHttpRequest_Send( req, empty );
4048 ok( hr == S_OK, "got %08x\n", hr );
4049
4050 hr = IWinHttpRequest_Send( req, empty );
4051 ok( hr == S_OK, "got %08x\n", hr );
4052
4053 hr = IWinHttpRequest_get_ResponseText( req, NULL );
4054 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4055
4056 hr = IWinHttpRequest_get_ResponseText( req, &response );
4057 ok( hr == S_OK, "got %08x\n", hr );
4058 ok( !memcmp(response, data_start, sizeof(data_start)), "got %s\n", wine_dbgstr_wn(response, 32) );
4059 SysFreeString( response );
4060
4061 hr = IWinHttpRequest_get_Status( req, NULL );
4062 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4063
4064 status = 0;
4065 hr = IWinHttpRequest_get_Status( req, &status );
4066 ok( hr == S_OK, "got %08x\n", hr );
4067 trace("Status=%d\n", status);
4068
4069 hr = IWinHttpRequest_get_StatusText( req, NULL );
4070 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4071
4072 hr = IWinHttpRequest_get_StatusText( req, &status_text );
4073 ok( hr == S_OK, "got %08x\n", hr );
4074 trace("StatusText=%s\n", wine_dbgstr_w(status_text));
4075 SysFreeString( status_text );
4076
4077 hr = IWinHttpRequest_get_ResponseBody( req, NULL );
4078 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4079
4080 hr = IWinHttpRequest_SetCredentials( req, username, password, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER );
4081 ok( hr == S_OK, "got %08x\n", hr );
4082
4083 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_PROXY, proxy_server, bypass_list );
4084 ok( hr == S_OK, "got %08x\n", hr );
4085
4086 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_DIRECT, proxy_server, bypass_list );
4087 ok( hr == S_OK, "got %08x\n", hr );
4088
4089 hr = IWinHttpRequest_GetAllResponseHeaders( req, NULL );
4090 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4091
4092 hr = IWinHttpRequest_GetAllResponseHeaders( req, &headers );
4093 ok( hr == S_OK, "got %08x\n", hr );
4095
4096 hr = IWinHttpRequest_GetResponseHeader( req, NULL, NULL );
4097 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4098
4099 hr = IWinHttpRequest_GetResponseHeader( req, connection, NULL );
4100 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4101
4102 hr = IWinHttpRequest_GetResponseHeader( req, connection, &value );
4103 ok( hr == S_OK, "got %08x\n", hr );
4105
4106 hr = IWinHttpRequest_SetRequestHeader( req, date, today );
4108
4109 hr = IWinHttpRequest_SetAutoLogonPolicy( req, AutoLogonPolicy_OnlyIfBypassProxy );
4110 ok( hr == S_OK, "got %08x\n", hr );
4111
4112 VariantInit( &timeout );
4113 V_VT( &timeout ) = VT_I4;
4114 V_I4( &timeout ) = 10;
4115 hr = IWinHttpRequest_WaitForResponse( req, timeout, &succeeded );
4116 ok( hr == S_OK, "got %08x\n", hr );
4117
4118 hr = IWinHttpRequest_get_Status( req, &status );
4119 ok( hr == S_OK, "got %08x\n", hr );
4120
4121 hr = IWinHttpRequest_get_StatusText( req, &status_text );
4122 ok( hr == S_OK, "got %08x\n", hr );
4123 SysFreeString( status_text );
4124
4125 hr = IWinHttpRequest_SetCredentials( req, username, password, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER );
4126 ok( hr == S_OK, "got %08x\n", hr );
4127
4128 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_PROXY, proxy_server, bypass_list );
4129 ok( hr == S_OK, "got %08x\n", hr );
4130
4131 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_DIRECT, proxy_server, bypass_list );
4132 ok( hr == S_OK, "got %08x\n", hr );
4133
4134 hr = IWinHttpRequest_Send( req, empty );
4135 ok( hr == S_OK, "got %08x\n", hr );
4136
4137 hr = IWinHttpRequest_get_ResponseText( req, NULL );
4138 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4139
4140 hr = IWinHttpRequest_get_ResponseText( req, &response );
4141 ok( hr == S_OK, "got %08x\n", hr );
4142 SysFreeString( response );
4143
4144 hr = IWinHttpRequest_get_ResponseBody( req, NULL );
4145 ok( hr == E_INVALIDARG, "got %08x\n", hr );
4146
4147 VariantInit( &body );
4148 V_VT( &body ) = VT_ERROR;
4149 hr = IWinHttpRequest_get_ResponseBody( req, &body );
4150 ok( hr == S_OK, "got %08x\n", hr );
4151 ok( V_VT( &body ) == (VT_ARRAY|VT_UI1), "got %08x\n", V_VT( &body ) );
4152
4153 hr = VariantClear( &body );
4154 ok( hr == S_OK, "got %08x\n", hr );
4155
4156 VariantInit( &body );
4157 V_VT( &body ) = VT_ERROR;
4158 hr = IWinHttpRequest_get_ResponseStream( req, &body );
4159 ok( hr == S_OK, "got %08x\n", hr );
4160 ok( V_VT( &body ) == VT_UNKNOWN, "got %08x\n", V_VT( &body ) );
4161
4162 hr = IUnknown_QueryInterface( V_UNKNOWN( &body ), &IID_IStream, (void **)&stream );
4163 ok( hr == S_OK, "got %08x\n", hr );
4164 ok( V_UNKNOWN( &body ) == (IUnknown *)stream, "got different interface pointer\n" );
4165
4166 buf[0] = 0;
4167 count = 0xdeadbeef;
4168 hr = IStream_Read( stream, buf, 128, &count );
4169 ok( hr == S_OK, "got %08x\n", hr );
4170 ok( count != 0xdeadbeef, "count not set\n" );
4171 ok( buf[0], "no data\n" );
4172
4173 VariantInit( &body2 );
4174 V_VT( &body2 ) = VT_ERROR;
4175 hr = IWinHttpRequest_get_ResponseStream( req, &body2 );
4176 ok( hr == S_OK, "got %08x\n", hr );
4177 ok( V_VT( &body2 ) == VT_UNKNOWN, "got %08x\n", V_VT( &body2 ) );
4178 ok( V_UNKNOWN( &body ) != V_UNKNOWN( &body2 ), "got same interface pointer\n" );
4179
4180 hr = IUnknown_QueryInterface( V_UNKNOWN( &body2 ), &IID_IStream, (void **)&stream2 );
4181 ok( hr == S_OK, "got %08x\n", hr );
4182 ok( V_UNKNOWN( &body2 ) == (IUnknown *)stream2, "got different interface pointer\n" );
4183 IStream_Release( stream2 );
4184
4185 hr = VariantClear( &body );
4186 ok( hr == S_OK, "got %08x\n", hr );
4187
4188 hr = VariantClear( &body2 );
4189 ok( hr == S_OK, "got %08x\n", hr );
4190
4191 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_PROXY, proxy_server, bypass_list );
4192 ok( hr == S_OK, "got %08x\n", hr );
4193
4194 hr = IWinHttpRequest_SetProxy( req, HTTPREQUEST_PROXYSETTING_DIRECT, proxy_server, bypass_list );
4195 ok( hr == S_OK, "got %08x\n", hr );
4196
4197 hr = IWinHttpRequest_GetAllResponseHeaders( req, &headers );
4198 ok( hr == S_OK, "got %08x\n", hr );
4200
4201 hr = IWinHttpRequest_GetResponseHeader( req, connection, &value );
4202 ok( hr == S_OK, "got %08x\n", hr );
4204
4205 hr = IWinHttpRequest_SetRequestHeader( req, date, today );
4207
4208 hr = IWinHttpRequest_SetAutoLogonPolicy( req, AutoLogonPolicy_OnlyIfBypassProxy );
4209 ok( hr == S_OK, "got %08x\n", hr );
4210
4211 hr = IWinHttpRequest_Send( req, empty );
4212 ok( hr == S_OK, "got %08x\n", hr );
4213
4214 hr = IWinHttpRequest_Abort( req );
4215 ok( hr == S_OK, "got %08x\n", hr );
4216
4217 hr = IWinHttpRequest_Abort( req );
4218 ok( hr == S_OK, "got %08x\n", hr );
4219
4220 IWinHttpRequest_Release( req );
4221
4222 pos.QuadPart = 0;
4223 hr = IStream_Seek( stream, pos, STREAM_SEEK_SET, NULL );
4224 ok( hr == S_OK, "got %08x\n", hr );
4225
4226 buf[0] = 0;
4227 count = 0xdeadbeef;
4228 hr = IStream_Read( stream, buf, 128, &count );
4229 ok( hr == S_OK, "got %08x\n", hr );
4230 ok( count != 0xdeadbeef, "count not set\n" );
4231 ok( buf[0], "no data\n" );
4232 IStream_Release( stream );
4233
4234 hr = CoCreateInstance( &CLSID_WinHttpRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IWinHttpRequest, (void **)&req );
4235 ok( hr == S_OK, "got %08x\n", hr );
4236
4237 V_VT( &async ) = VT_I4;
4238 V_I4( &async ) = 1;
4239 hr = IWinHttpRequest_Open( req, method, url, async );
4240 ok( hr == S_OK, "got %08x\n", hr );
4241
4242 hr = IWinHttpRequest_Send( req, empty );
4243 ok( hr == S_OK, "got %08x\n", hr );
4244
4245 hr = IWinHttpRequest_WaitForResponse( req, timeout, &succeeded );
4246 ok( hr == S_OK, "got %08x\n", hr );
4247
4248 IWinHttpRequest_Release( req );
4249
4251 SysFreeString( url );
4254 SysFreeString( connection );
4256 SysFreeString( today );
4258 VariantClear( &bypass_list );
4259
4260 hr = CoCreateInstance( &CLSID_WinHttpRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IWinHttpRequest, (void **)&req );
4261 ok( hr == S_OK, "got %08x\n", hr );
4262
4264 method = SysAllocString( method3W );
4265 V_VT( &async ) = VT_BOOL;
4266 V_BOOL( &async ) = VARIANT_FALSE;
4267 hr = IWinHttpRequest_Open( req, method, url, async );
4268 ok( hr == S_OK, "got %08x\n", hr );
4270 SysFreeString( url );
4271
4272 hr = IWinHttpRequest_Send( req, empty );
4274 hr == SEC_E_ILLEGAL_MESSAGE /* winxp */, "got %08x\n", hr );
4275 if (hr != S_OK) goto done;
4276
4277 hr = IWinHttpRequest_get_ResponseText( req, &response );
4278 ok( hr == S_OK, "got %08x\n", hr );
4279#ifdef __REACTOS__
4280 ok( !memcmp(response, data_start, sizeof(data_start)), "got %s\n",
4281 wine_dbgstr_wn(response, min(SysStringLen(response), 32)) );
4282#else
4283 ok( !memcmp(response, data_start, sizeof(data_start)), "got %s\n", wine_dbgstr_wn(response, 32) );
4284#endif
4285 SysFreeString( response );
4286
4287 IWinHttpRequest_Release( req );
4288
4289 hr = CoCreateInstance( &CLSID_WinHttpRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IWinHttpRequest, (void **)&req );
4290 ok( hr == S_OK, "got %08x\n", hr );
4291
4292 sprintf( buf, "http://localhost:%d/auth", port );
4293 MultiByteToWideChar( CP_ACP, 0, buf, -1, bufW, ARRAY_SIZE( bufW ));
4294 url = SysAllocString( bufW );
4295 method = SysAllocString( method3W );
4296 V_VT( &async ) = VT_BOOL;
4297 V_BOOL( &async ) = VARIANT_FALSE;
4298 hr = IWinHttpRequest_Open( req, method, url, async );
4299 ok( hr == S_OK, "got %08x\n", hr );
4301 SysFreeString( url );
4302
4303 hr = IWinHttpRequest_get_Status( req, &status );
4305
4306 V_VT( &data ) = VT_BSTR;
4307 V_BSTR( &data ) = SysAllocString( test_dataW );
4308 hr = IWinHttpRequest_Send( req, data );
4309 ok( hr == S_OK, "got %08x\n", hr );
4310 SysFreeString( V_BSTR( &data ) );
4311
4312 hr = IWinHttpRequest_get_ResponseText( req, &response );
4313 ok( hr == S_OK, "got %08x\n", hr );
4314 ok( !memcmp( response, unauthW, sizeof(unauthW) ), "got %s\n", wine_dbgstr_w(response) );
4315 SysFreeString( response );
4316
4317 status = 0xdeadbeef;
4318 hr = IWinHttpRequest_get_Status( req, &status );
4319 ok( hr == S_OK, "got %08x\n", hr );
4320 ok( status == HTTP_STATUS_DENIED, "got %d\n", status );
4321
4322done:
4323 IWinHttpRequest_Release( req );
4325}
static const WCHAR proxy_server[]
Definition: connections.c:40
#define E_INVALIDARG
Definition: ddrawi.h:101
const char * wine_dbgstr_wn(const WCHAR *str, int n)
Definition: compat.c:367
OLECHAR * BSTR
Definition: compat.h:2293
short VARIANT_BOOL
Definition: compat.h:2290
@ VT_BSTR
Definition: compat.h:2303
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_ERROR
Definition: compat.h:2305
@ VT_ARRAY
Definition: compat.h:2341
@ VT_BOOL
Definition: compat.h:2306
@ VT_UI4
Definition: compat.h:2313
@ VT_UI1
Definition: compat.h:2311
VOID WINAPI GetSystemTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:327
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
BOOL WINAPI WinHttpTimeFromSystemTime(const SYSTEMTIME *time, LPWSTR string)
Definition: session.c:2158
method
Definition: dragdrop.c:54
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
POINT cp
Definition: magnifier.c:59
__u16 date
Definition: mkdosfs.c:8
#define sprintf(buf, format,...)
Definition: sprintf.c:55
static const WCHAR url1W[]
Definition: atl.c:53
static const WCHAR url[]
Definition: encode.c:1432
static WCHAR password[]
Definition: url.c:33
static WCHAR username[]
Definition: url.c:32
#define min(a, b)
Definition: monoChain.cc:55
static const WCHAR utf8W[]
Definition: mxwriter.c:86
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:196
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define V_ERROR(A)
Definition: oleauto.h:241
#define V_BOOL(A)
Definition: oleauto.h:224
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_UI4(A)
Definition: oleauto.h:270
#define CP_UTF8
Definition: nls.h:20
static const void * body(MD5_CTX *ctx, const void *data, unsigned long size)
Definition: md5.c:100
vector< Header * > headers
Definition: sdkparse.cpp:39
Definition: parse.h:23
Definition: dhcpd.h:245
Definition: pdh_main.c:94
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
#define DISP_E_PARAMNOTFOUND
Definition: winerror.h:2513
#define SEC_E_ILLEGAL_MESSAGE
Definition: winerror.h:2943
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
static const WCHAR test_winehq_https[]
Definition: winhttp.c:43
#define ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN
Definition: winhttp.h:209
#define ERROR_WINHTTP_INVALID_SERVER_RESPONSE
Definition: winhttp.h:214
#define ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND
Definition: winhttp.h:210
#define ERROR_WINHTTP_UNRECOGNIZED_SCHEME
Definition: winhttp.h:192
#define ERROR_WINHTTP_CANNOT_CALL_AFTER_SEND
Definition: winhttp.h:211
#define WINHTTP_TIME_FORMAT_BUFSIZE
Definition: winhttp.h:461

Referenced by START_TEST().

◆ test_IWinHttpRequest_Invoke()

static void test_IWinHttpRequest_Invoke ( void  )
static

Definition at line 4347 of file winhttp.c.

4348{
4349 static const WCHAR utf8W[] = {'U','T','F','-','8',0};
4350 static const WCHAR regid[] = {'W','i','n','H','t','t','p','.','W','i','n','H','t','t','p','R','e','q','u','e','s','t','.','5','.','1',0};
4351 WCHAR openW[] = {'O','p','e','n',0};
4352 WCHAR optionW[] = {'O','p','t','i','o','n',0};
4353 OLECHAR *open = openW, *option = optionW;
4354 BSTR utf8;
4355 CLSID clsid;
4356 IWinHttpRequest *request;
4358 DISPID id;
4360 VARIANT arg[3], ret;
4361 UINT err;
4362 BOOL bret;
4363 HRESULT hr;
4364
4366
4368 ok(hr == S_OK, "CLSIDFromProgID error %#x\n", hr);
4369 bret = IsEqualIID(&clsid, &CLSID_WinHttpRequest);
4370 ok(bret || broken(!bret) /* win2003 */, "not expected %s\n", wine_dbgstr_guid(&clsid));
4371
4372 hr = CoCreateInstance(&CLSID_WinHttpRequest, 0, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&request);
4373 ok(hr == S_OK, "error %#x\n", hr);
4374
4375 hr = IWinHttpRequest_QueryInterface(request, &IID_IDispatch, (void **)&dispatch);
4376 ok(hr == S_OK, "error %#x\n", hr);
4377 IDispatch_Release(dispatch);
4378
4379 hr = IWinHttpRequest_GetIDsOfNames(request, &IID_NULL, &open, 1, 0x0409, &id);
4380 ok(hr == S_OK, "error %#x\n", hr);
4381 ok(id == DISPID_HTTPREQUEST_OPEN, "expected DISPID_HTTPREQUEST_OPEN, got %u\n", id);
4382
4383 hr = IWinHttpRequest_GetIDsOfNames(request, &IID_NULL, &option, 1, 0x0409, &id);
4384 ok(hr == S_OK, "error %#x\n", hr);
4385 ok(id == DISPID_HTTPREQUEST_OPTION, "expected DISPID_HTTPREQUEST_OPTION, got %u\n", id);
4386
4387 request_get_property(request, WinHttpRequestOption_URLCodePage, &ret);
4388 ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret));
4389 ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret));
4390
4391 memset(&params, 0, sizeof(params));
4392 params.cArgs = 2;
4393 params.cNamedArgs = 0;
4394 params.rgvarg = arg;
4395 V_VT(&arg[0]) = VT_I4;
4396 V_I4(&arg[0]) = 1252;
4397 V_VT(&arg[1]) = VT_R8;
4398 V_R8(&arg[1]) = 2.0; /* WinHttpRequestOption_URLCodePage */
4399 VariantInit(&ret);
4400 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0,
4402 ok(hr == S_OK, "error %#x\n", hr);
4403
4404 request_get_property(request, WinHttpRequestOption_URLCodePage, &ret);
4405 ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret));
4406 ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret));
4407
4408 memset(&params, 0, sizeof(params));
4409 params.cArgs = 2;
4410 params.cNamedArgs = 0;
4411 params.rgvarg = arg;
4412 V_VT(&arg[0]) = VT_I4;
4413 V_I4(&arg[0]) = 1252;
4414 V_VT(&arg[1]) = VT_R8;
4415 V_R8(&arg[1]) = 2.0; /* WinHttpRequestOption_URLCodePage */
4416 VariantInit(&ret);
4417 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0,
4419 ok(hr == S_OK, "error %#x\n", hr);
4420
4421 request_get_property(request, WinHttpRequestOption_URLCodePage, &ret);
4422 ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret));
4423 ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret));
4424
4425 memset(&params, 0, sizeof(params));
4426 params.cArgs = 2;
4427 params.cNamedArgs = 0;
4428 params.rgvarg = arg;
4429 V_VT(&arg[0]) = VT_I4;
4430 V_I4(&arg[0]) = 1252;
4431 V_VT(&arg[1]) = VT_R8;
4432 V_R8(&arg[1]) = 2.0; /* WinHttpRequestOption_URLCodePage */
4433 VariantInit(&ret);
4434 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0,
4436 ok(hr == S_OK, "error %#x\n", hr);
4437
4438 request_get_property(request, WinHttpRequestOption_URLCodePage, &ret);
4439 ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret));
4440 ok(V_I4(&ret) == 1252, "expected 1252, got %d\n", V_I4(&ret));
4441
4442 memset(&params, 0, sizeof(params));
4443 params.cArgs = 2;
4444 params.cNamedArgs = 0;
4445 params.rgvarg = arg;
4446 V_VT(&arg[0]) = VT_BSTR;
4447 utf8 = SysAllocString(utf8W);
4448 V_BSTR(&arg[0]) = utf8;
4449 V_VT(&arg[1]) = VT_R8;
4450 V_R8(&arg[1]) = 2.0; /* WinHttpRequestOption_URLCodePage */
4451 hr = IWinHttpRequest_Invoke(request, id, &IID_NULL, 0, DISPATCH_METHOD, &params, NULL, NULL, &err);
4452 ok(hr == S_OK, "error %#x\n", hr);
4453
4454 request_get_property(request, WinHttpRequestOption_URLCodePage, &ret);
4455 ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret));
4456 ok(V_I4(&ret) == 1252, "expected 1252, got %d\n", V_I4(&ret));
4457
4458 VariantInit(&ret);
4459 hr = IWinHttpRequest_Invoke(request, id, &IID_NULL, 0, DISPATCH_METHOD, &params, &ret, NULL, &err);
4460 ok(hr == S_OK, "error %#x\n", hr);
4461
4462 request_get_property(request, WinHttpRequestOption_URLCodePage, &ret);
4463 ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret));
4464 ok(V_I4(&ret) == 1252, "expected 1252, got %d\n", V_I4(&ret));
4465
4466 VariantInit(&ret);
4467 hr = IWinHttpRequest_Invoke(request, id, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &params, &ret, NULL, &err);
4468 ok(hr == S_OK, "error %#x\n", hr);
4469
4470 request_get_property(request, WinHttpRequestOption_URLCodePage, &ret);
4471 ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret));
4472 ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret));
4473
4475 ok(hr == S_OK, "error %#x\n", hr);
4476
4477 hr = IWinHttpRequest_Invoke(request, 255, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &params, NULL, NULL, NULL);
4478 ok(hr == DISP_E_MEMBERNOTFOUND, "error %#x\n", hr);
4479
4480 VariantInit(&ret);
4481 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_IUnknown, 0, DISPATCH_PROPERTYPUT, &params, &ret, NULL, &err);
4482 ok(hr == DISP_E_UNKNOWNINTERFACE, "error %#x\n", hr);
4483
4484 VariantInit(&ret);
4485 if (0) /* crashes */
4486 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_PROPERTYPUT, NULL, &ret, NULL, &err);
4487
4488 params.cArgs = 1;
4489 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &params, &ret, NULL, &err);
4490 ok(hr == DISP_E_TYPEMISMATCH, "error %#x\n", hr);
4491
4492 VariantInit(&arg[2]);
4493 params.cArgs = 3;
4494 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &params, &ret, NULL, &err);
4496 ok(hr == S_OK, "error %#x\n", hr);
4497
4498 VariantInit(&arg[0]);
4499 VariantInit(&arg[1]);
4500 VariantInit(&arg[2]);
4501
4502 params.cArgs = 1;
4503 V_VT(&arg[0]) = VT_I4;
4506 ok(hr == S_OK, "error %#x\n", hr);
4507
4508 V_VT(&ret) = 0xdead;
4509 V_I4(&ret) = 0xbeef;
4511 ok(hr == S_OK, "error %#x\n", hr);
4512 ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret));
4513 ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret));
4514
4515 V_VT(&ret) = 0xdead;
4516 V_I4(&ret) = 0xbeef;
4517 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, DISPATCH_METHOD, &params, &ret, NULL, NULL);
4518 ok(hr == S_OK, "error %#x\n", hr);
4519 ok(V_VT(&ret) == VT_I4, "expected VT_I4, got %d\n", V_VT(&ret));
4520 ok(V_I4(&ret) == CP_UTF8, "expected CP_UTF8, got %d\n", V_I4(&ret));
4521
4523 ok(hr == S_OK, "error %#x\n", hr);
4524
4525 V_VT(&ret) = 0xdead;
4526 V_I4(&ret) = 0xbeef;
4527 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, 0, &params, &ret, NULL, NULL);
4528 ok(hr == S_OK, "error %#x\n", hr);
4529 ok(V_VT(&ret) == VT_EMPTY, "expected VT_EMPTY, got %d\n", V_VT(&ret));
4530 ok(V_I4(&ret) == 0xbeef || V_I4(&ret) == 0 /* Win8 */, "expected 0xdead, got %d\n", V_I4(&ret));
4531
4532 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_OPTION, &IID_NULL, 0, 0, &params, NULL, NULL, NULL);
4533 ok(hr == S_OK, "error %#x\n", hr);
4534
4536 ok(hr == DISP_E_UNKNOWNINTERFACE, "error %#x\n", hr);
4537
4538 params.cArgs = 2;
4541 ok(hr == S_OK, "error %#x\n", hr);
4542
4543 params.cArgs = 0;
4545 ok(hr == DISP_E_PARAMNOTFOUND, "error %#x\n", hr);
4546
4547 SysFreeString(utf8);
4548
4549 params.cArgs = 1;
4550 V_VT(&arg[0]) = VT_I4;
4552 VariantInit(&ret);
4553 hr = IWinHttpRequest_Invoke(request, DISPID_HTTPREQUEST_SETAUTOLOGONPOLICY, &IID_NULL, 0,
4555 ok(hr == S_OK, "error %#x\n", hr);
4556
4557 IWinHttpRequest_Release(request);
4558
4560}
#define open
Definition: acwin.h:95
void dispatch(HANDLE hStopEvent)
Definition: dispatch.c:70
const GUID IID_IUnknown
WCHAR OLECHAR
Definition: compat.h:2292
@ VT_R8
Definition: compat.h:2300
@ VT_EMPTY
Definition: compat.h:2295
HRESULT WINAPI DECLSPEC_HOTPATCH CLSIDFromProgID(LPCOLESTR progid, LPCLSID clsid)
Definition: compobj.c:2602
#define regid
Definition: ecma_167.h:64
GLuint id
Definition: glext.h:5910
static const WCHAR optionW[]
Definition: htmlelem.c:36
#define DISPID_HTTPREQUEST_SETAUTOLOGONPOLICY
Definition: httprequestid.h:40
#define DISPID_HTTPREQUEST_OPEN
Definition: httprequestid.h:23
static VARIANTARG static DISPID
Definition: ordinal.c:52
REFCLSID clsid
Definition: msctf.c:82
@ WinHttpRequestOption_URLCodePage
Definition: httprequest.idl:54
@ AutoLogonPolicy_Never
Definition: httprequest.idl:80
unsigned int UINT
Definition: ndis.h:50
#define DISPATCH_PROPERTYPUT
Definition: oleauto.h:1008
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define V_R8(A)
Definition: oleauto.h:262
const GUID IID_IDispatch
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
Definition: getopt.h:109
#define DISP_E_UNKNOWNINTERFACE
Definition: winerror.h:2511
#define DISP_E_MEMBERNOTFOUND
Definition: winerror.h:2512
#define DISP_E_TYPEMISMATCH
Definition: winerror.h:2514
static void request_get_property(IWinHttpRequest *request, int property, VARIANT *ret)
Definition: winhttp.c:4327

Referenced by START_TEST().

◆ test_large_data_authentication()

static void test_large_data_authentication ( int  port)
static

Definition at line 2887 of file winhttp.c.

2888{
2889 static const WCHAR largeauthW[] = {'/','l','a','r','g','e','a','u','t','h',0};
2890 static const WCHAR getW[] = {'G','E','T',0};
2891 static WCHAR userW[] = {'u','s','e','r',0};
2892 static WCHAR passW[] = {'p','w','d',0};
2893 HINTERNET ses, con, req;
2894 DWORD status, size;
2895 BOOL ret;
2896
2898 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2899
2900 con = WinHttpConnect(ses, localhostW, port, 0);
2901 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2902
2903 req = WinHttpOpenRequest(con, getW, largeauthW, NULL, NULL, NULL, 0);
2904 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2905
2907 ok(ret, "expected success\n");
2908
2910 ok(ret, "expected success\n");
2911
2912 size = sizeof(status);
2914 &status, &size, NULL);
2915 ok(ret, "expected success\n");
2916 ok(status == HTTP_STATUS_DENIED, "got %d\n", status);
2917
2919 ok(ret, "expected success\n");
2920
2922 ok(ret, "expected success %d\n", GetLastError());
2923
2925 ok(ret, "expected success\n");
2926
2927 size = sizeof(status);
2929 &status, &size, NULL);
2930 ok(ret, "expected success\n");
2931 ok(status == HTTP_STATUS_OK, "got %d\n", status);
2932
2933 WinHttpCloseHandle(req);
2934 WinHttpCloseHandle(con);
2935 WinHttpCloseHandle(ses);
2936}
static const WCHAR getW[]
Definition: object.c:50
#define WINHTTP_NO_REQUEST_DATA
Definition: winhttp.h:184
#define WINHTTP_NO_ADDITIONAL_HEADERS
Definition: winhttp.h:183

Referenced by START_TEST().

◆ test_multi_authentication()

static void test_multi_authentication ( int  port)
static

Definition at line 2832 of file winhttp.c.

2833{
2834 static const WCHAR multiauthW[] = {'/','m','u','l','t','i','a','u','t','h',0};
2835 static const WCHAR www_authenticateW[] =
2836 {'W','W','W','-','A','u','t','h','e','n','t','i','c','a','t','e',0};
2837 static const WCHAR getW[] = {'G','E','T',0};
2838 HINTERNET ses, con, req;
2839 DWORD supported, first, target, size, index;
2840 WCHAR buf[512];
2841 BOOL ret;
2842
2844 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2845
2846 con = WinHttpConnect(ses, localhostW, port, 0);
2847 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2848
2849 req = WinHttpOpenRequest(con, getW, multiauthW, NULL, NULL, NULL, 0);
2850 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2851
2853 WINHTTP_NO_REQUEST_DATA,0, 0, 0 );
2854 ok(ret, "expected success\n");
2855
2857 ok(ret, "expected success\n");
2858
2859 supported = first = target = 0xdeadbeef;
2860 ret = WinHttpQueryAuthSchemes(req, &supported, &first, &target);
2861 ok(ret, "expected success\n");
2862 ok(supported == (WINHTTP_AUTH_SCHEME_BASIC | WINHTTP_AUTH_SCHEME_NTLM), "got %x\n", supported);
2863 ok(target == WINHTTP_AUTH_TARGET_SERVER, "got %x\n", target);
2864 ok(first == WINHTTP_AUTH_SCHEME_BASIC, "got %x\n", first);
2865
2866 index = 0;
2867 size = sizeof(buf);
2868 ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_CUSTOM, www_authenticateW, buf, &size, &index);
2869 ok(ret, "expected success\n");
2870 ok(!strcmp_wa(buf, "Bearer"), "buf = %s\n", wine_dbgstr_w(buf));
2871 ok(size == lstrlenW(buf) * sizeof(WCHAR), "size = %u\n", size);
2872 ok(index == 1, "index = %u\n", index);
2873
2874 index = 0;
2875 size = 0xdeadbeef;
2876 ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_CUSTOM, www_authenticateW, NULL, &size, &index);
2878 "WinHttpQueryHeaders returned %x(%u)\n", ret, GetLastError());
2879 ok(size == (lstrlenW(buf) + 1) * sizeof(WCHAR), "size = %u\n", size);
2880 ok(index == 0, "index = %u\n", index);
2881
2882 WinHttpCloseHandle(req);
2883 WinHttpCloseHandle(con);
2884 WinHttpCloseHandle(ses);
2885}
static int strcmp_wa(const WCHAR *str1, const char *stra)
Definition: winhttp.c:54

Referenced by START_TEST().

◆ test_multiple_reads()

static void test_multiple_reads ( int  port)
static

Definition at line 3212 of file winhttp.c.

3213{
3214 static const WCHAR bigW[] = {'b','i','g',0};
3215 HINTERNET ses, con, req;
3216 DWORD total_len = 0;
3217 BOOL ret;
3218
3220 ok(ses != NULL, "failed to open session %u\n", GetLastError());
3221
3222 con = WinHttpConnect(ses, localhostW, port, 0);
3223 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
3224
3225 req = WinHttpOpenRequest(con, NULL, bigW, NULL, NULL, NULL, 0);
3226 ok(req != NULL, "failed to open a request %u\n", GetLastError());
3227
3228 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
3229 ok(ret, "failed to send request %u\n", GetLastError());
3230
3231 trace("waiting for response\n");
3233 ok(ret == TRUE, "expected success\n");
3234
3235 trace("finished waiting for response\n");
3236
3237 for (;;)
3238 {
3239 DWORD len = 0xdeadbeef;
3241 ok( ret, "WinHttpQueryDataAvailable failed with error %u\n", GetLastError() );
3242 if (ret) ok( len != 0xdeadbeef, "WinHttpQueryDataAvailable return wrong length\n" );
3243 if (len)
3244 {
3245 DWORD bytes_read;
3246 char *buf = HeapAlloc( GetProcessHeap(), 0, len + 1 );
3247
3248 ret = WinHttpReadData( req, buf, len, &bytes_read );
3249 ok(ret, "WinHttpReadData failed: %u.\n", GetLastError());
3250 ok( len == bytes_read, "only got %u of %u available\n", bytes_read, len );
3251
3252 HeapFree( GetProcessHeap(), 0, buf );
3253 if (!bytes_read) break;
3254 total_len += bytes_read;
3255 trace("read bytes %u, total_len: %u\n", bytes_read, total_len);
3256 }
3257 if (!len) break;
3258 }
3259 ok(total_len == BIG_BUFFER_LEN, "got wrong length: 0x%x\n", total_len);
3260
3261 WinHttpCloseHandle(req);
3262 WinHttpCloseHandle(con);
3263 WinHttpCloseHandle(ses);
3264}
#define TRUE
Definition: types.h:120
static const WCHAR bigW[]
Definition: string.c:38

Referenced by START_TEST().

◆ test_no_content()

static void test_no_content ( int  port)
static

Definition at line 2974 of file winhttp.c.

2975{
2976 static const WCHAR no_contentW[] = {'/','n','o','_','c','o','n','t','e','n','t',0};
2977 HINTERNET ses, con, req;
2978 char buf[128];
2979 DWORD size, len = sizeof(buf), bytes_read, status;
2980 BOOL ret;
2981
2983 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2984
2985 con = WinHttpConnect(ses, localhostW, port, 0);
2986 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2987
2988 req = WinHttpOpenRequest(con, NULL, no_contentW, NULL, NULL, NULL, 0);
2989 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2990
2991 size = 12345;
2992 SetLastError(0xdeadbeef);
2994 todo_wine {
2995 ok(!ret, "expected error\n");
2997 "expected ERROR_WINHTTP_INCORRECT_HANDLE_STATE, got 0x%08x\n", GetLastError());
2998 ok(size == 12345 || broken(size == 0) /* Win <= 2003 */,
2999 "expected 12345, got %u\n", size);
3000 }
3001
3002 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
3003 ok(ret, "expected success\n");
3004
3006 ok(ret, "expected success\n");
3007
3008 status = 0xdeadbeef;
3009 size = sizeof(status);
3011 NULL, &status, &size, NULL);
3012 ok(ret, "expected success\n");
3013 ok(status == HTTP_STATUS_NO_CONTENT, "expected status 204, got %d\n", status);
3014
3015 SetLastError(0xdeadbeef);
3016 size = sizeof(status);
3017 status = 12345;
3019 NULL, &status, &size, 0);
3020 ok(!ret, "expected no content-length header\n");
3021 ok(GetLastError() == ERROR_WINHTTP_HEADER_NOT_FOUND, "wrong error %u\n", GetLastError());
3022 ok(status == 12345, "expected 0, got %d\n", status);
3023
3024 SetLastError(0xdeadbeef);
3025 size = 12345;
3027 ok(ret, "expected success\n");
3028 ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
3029 "wrong error %u\n", GetLastError());
3030 ok(!size, "expected 0, got %u\n", size);
3031
3032 SetLastError(0xdeadbeef);
3033 ret = WinHttpReadData(req, buf, len, &bytes_read);
3034 ok(ret, "expected success\n");
3035 ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
3036 "wrong error %u\n", GetLastError());
3037 ok(!bytes_read, "expected 0, got %u\n", bytes_read);
3038
3039 size = 12345;
3041 ok(ret, "expected success\n");
3042 ok(size == 0, "expected 0, got %d\n", size);
3043
3044 WinHttpCloseHandle(req);
3045
3046 size = 12345;
3047 SetLastError(0xdeadbeef);
3049 ok(!ret, "expected error\n");
3051 "expected ERROR_INVALID_HANDLE, got 0x%08x\n", GetLastError());
3052 ok(size == 12345, "expected 12345, got %u\n", size);
3053
3054 WinHttpCloseHandle(con);
3055 WinHttpCloseHandle(ses);
3056}
#define HTTP_STATUS_NO_CONTENT
Definition: winhttp.h:244

Referenced by START_TEST().

◆ test_no_headers()

static void test_no_headers ( int  port)
static

Definition at line 2938 of file winhttp.c.

2939{
2940 static const WCHAR no_headersW[] = {'/','n','o','_','h','e','a','d','e','r','s',0};
2941 HINTERNET ses, con, req;
2942 DWORD error;
2943 BOOL ret;
2944
2946 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2947
2948 con = WinHttpConnect(ses, localhostW, port, 0);
2949 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2950
2951 req = WinHttpOpenRequest(con, NULL, no_headersW, NULL, NULL, NULL, 0);
2952 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2953
2954 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
2955 if (!ret)
2956 {
2957 error = GetLastError();
2959 }
2960 else
2961 {
2962 SetLastError(0xdeadbeef);
2964 error = GetLastError();
2965 ok(!ret, "expected failure\n");
2967 }
2968
2969 WinHttpCloseHandle(req);
2970 WinHttpCloseHandle(con);
2971 WinHttpCloseHandle(ses);
2972}

Referenced by START_TEST().

◆ test_not_modified()

static void test_not_modified ( int  port)
static

Definition at line 3117 of file winhttp.c.

3118{
3119 static const WCHAR pathW[] = {'/','n','o','t','_','m','o','d','i','f','i','e','d',0};
3120 static const WCHAR ifmodifiedW[] = {'I','f','-','M','o','d','i','f','i','e','d','-','S','i','n','c','e',':',' '};
3121 static const WCHAR ifmodified2W[] = {'I','f','-','M','o','d','i','f','i','e','d','-','S','i','n','c','e',0};
3122 BOOL ret;
3123 HINTERNET session, request, connection;
3125 SYSTEMTIME st;
3126 WCHAR today[(sizeof(ifmodifiedW) + WINHTTP_TIME_FORMAT_BUFSIZE)/sizeof(WCHAR) + 3], buffer[32];
3127
3128 memcpy(today, ifmodifiedW, sizeof(ifmodifiedW));
3129 GetSystemTime(&st);
3130 WinHttpTimeFromSystemTime(&st, &today[ARRAY_SIZE(ifmodifiedW)]);
3131
3134 ok(session != NULL, "WinHttpOpen failed: %u\n", GetLastError());
3135
3136 connection = WinHttpConnect(session, localhostW, port, 0);
3137 ok(connection != NULL, "WinHttpConnect failed: %u\n", GetLastError());
3138
3139 request = WinHttpOpenRequest(connection, NULL, pathW, NULL, WINHTTP_NO_REFERER,
3141 ok(request != NULL, "WinHttpOpenrequest failed: %u\n", GetLastError());
3142
3143 ret = WinHttpSendRequest(request, today, 0, NULL, 0, 0, 0);
3144 ok(ret, "WinHttpSendRequest failed: %u\n", GetLastError());
3145
3147 ok(ret, "WinHttpReceiveResponse failed: %u\n", GetLastError());
3148
3149 index = 0;
3150 len = sizeof(buffer);
3152 ifmodified2W, buffer, &len, &index);
3153 ok(ret, "failed to get header %u\n", GetLastError());
3154
3155 status = 0xdeadbeef;
3156 size = sizeof(status);
3158 NULL, &status, &size, NULL);
3159 ok(ret, "WinHttpQueryHeaders failed: %u\n", GetLastError());
3160 ok(status == HTTP_STATUS_NOT_MODIFIED, "got %u\n", status);
3161
3162 size = 0xdeadbeef;
3164 ok(ret, "WinHttpQueryDataAvailable failed: %u\n", GetLastError());
3165 ok(!size, "got %u\n", size);
3166
3168 WinHttpCloseHandle(connection);
3170 start = GetTickCount() - start;
3171 ok(start <= 2000, "Expected less than 2 seconds for the test, got %u ms\n", start);
3172}
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
GLuint start
Definition: gl.h:1545
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define WINHTTP_DEFAULT_ACCEPT_TYPES
Definition: winhttp.h:180
#define WINHTTP_FLAG_BYPASS_PROXY_CACHE
Definition: winhttp.h:58
#define WINHTTP_NO_PROXY_NAME
Definition: winhttp.h:66
#define HTTP_STATUS_NOT_MODIFIED
Definition: winhttp.h:252
#define WINHTTP_NO_REFERER
Definition: winhttp.h:179
#define WINHTTP_NO_PROXY_BYPASS
Definition: winhttp.h:67

Referenced by START_TEST().

◆ test_passport_auth()

static void test_passport_auth ( int  port)
static

Definition at line 3554 of file winhttp.c.

3555{
3556 static const WCHAR passportW[] =
3557 {'/','p','a','s','s','p','o','r','t',0};
3558 static const WCHAR foundW[] =
3559 {'F','o','u','n','d',0};
3560 static const WCHAR unauthorizedW[] =
3561 {'U','n','a','u','t','h','o','r','i','z','e','d',0};
3562 static const WCHAR headersW[] =
3563 {'H','T','T','P','/','1','.','1',' ','4','0','1',' ','F','o','u','n','d','\r','\n',
3564 'C','o','n','t','e','n','t','-','L','e','n','g','t','h',':',' ','0','\r','\n',
3565 'L','o','c','a','t','i','o','n',':',' ','/','\r','\n',
3566 'W','W','W','-','A','u','t','h','e','n','t','i','c','a','t','e',':',' ',
3567 'P','a','s','s','p','o','r','t','1','.','4','\r','\n','\r','\n',0};
3568 HINTERNET ses, con, req;
3570 WCHAR buf[128];
3571 BOOL ret;
3572
3573 ses = WinHttpOpen( test_useragent, 0, NULL, NULL, 0 );
3574 ok( ses != NULL, "got %u\n", GetLastError() );
3575
3578 ok( ret, "got %u\n", GetLastError() );
3579
3580 con = WinHttpConnect( ses, localhostW, port, 0 );
3581 ok( con != NULL, "got %u\n", GetLastError() );
3582
3583 req = WinHttpOpenRequest( con, NULL, passportW, NULL, NULL, NULL, 0 );
3584 ok( req != NULL, "got %u\n", GetLastError() );
3585
3586 ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 );
3587 ok( ret, "got %u\n", GetLastError() );
3588
3590 ok( ret || broken(!ret && GetLastError() == ERROR_WINHTTP_LOGIN_FAILURE) /* winxp */, "got %u\n", GetLastError() );
3592 {
3593 win_skip("no support for Passport redirects\n");
3594 goto cleanup;
3595 }
3596
3597 status = 0xdeadbeef;
3598 size = sizeof(status);
3600 ok( ret, "got %u\n", GetLastError() );
3601 ok( status == HTTP_STATUS_DENIED, "got %u\n", status );
3602
3603 buf[0] = 0;
3604 size = sizeof(buf);
3606 ok( ret, "got %u\n", GetLastError() );
3607 ok( !lstrcmpW(foundW, buf) || broken(!lstrcmpW(unauthorizedW, buf)) /* < win7 */, "got %s\n", wine_dbgstr_w(buf) );
3608
3609 buf[0] = 0;
3610 size = sizeof(buf);
3612 ok( ret || broken(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER) /* < win7 */, "got %u\n", GetLastError() );
3613 if (ret)
3614 {
3615 ok( size == lstrlenW(headersW) * sizeof(WCHAR), "got %u\n", size );
3616 ok( !lstrcmpW(headersW, buf), "got %s\n", wine_dbgstr_w(buf) );
3617 }
3618
3619cleanup:
3620 WinHttpCloseHandle( req );
3621 WinHttpCloseHandle( con );
3622 WinHttpCloseHandle( ses );
3623}
static void cleanup(void)
Definition: main.c:1335
static const WCHAR passportW[]
#define WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH
Definition: winhttp.h:126
#define WINHTTP_ENABLE_PASSPORT_AUTH
Definition: winhttp.h:164
#define WINHTTP_QUERY_STATUS_TEXT
Definition: winhttp.h:318
#define ERROR_WINHTTP_LOGIN_FAILURE
Definition: winhttp.h:197

Referenced by START_TEST().

◆ test_request_parameter_defaults()

static void test_request_parameter_defaults ( void  )
static

Definition at line 1222 of file winhttp.c.

1223{
1224 static const WCHAR empty[] = {0};
1225 HINTERNET ses, con, req;
1227 WCHAR *version;
1228 BOOL ret;
1229
1230 ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
1231 ok(ses != NULL, "failed to open session %u\n", GetLastError());
1232
1233 con = WinHttpConnect(ses, test_winehq, 0, 0);
1234 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
1235
1236 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
1237 ok(req != NULL, "failed to open a request %u\n", GetLastError());
1238
1239 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
1240 error = GetLastError();
1242 {
1243 skip("connection failed, skipping\n");
1244 goto done;
1245 }
1246 ok(ret, "failed to send request %u\n", GetLastError());
1247
1249 ok(ret, "failed to receive response %u\n", GetLastError());
1250
1251 status = 0xdeadbeef;
1252 size = sizeof(status);
1254 ok(ret, "failed unexpectedly %u\n", GetLastError());
1255 ok(status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status);
1256
1257 WinHttpCloseHandle(req);
1258
1259 req = WinHttpOpenRequest(con, empty, empty, empty, NULL, NULL, 0);
1260 ok(req != NULL, "failed to open a request %u\n", GetLastError());
1261
1262 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
1263 error = GetLastError();
1265 {
1266 skip("connection failed, skipping\n");
1267 goto done;
1268 }
1269 ok(ret, "failed to send request %u\n", GetLastError());
1270
1272 ok(ret, "failed to receive response %u\n", GetLastError());
1273
1274 size = 0;
1275 SetLastError(0xdeadbeef);
1277 error = GetLastError();
1278 ok(!ret, "succeeded unexpectedly\n");
1279 ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error);
1280
1283 ok(ret, "failed unexpectedly %u\n", GetLastError());
1284 ok(lstrlenW(version) == size / sizeof(WCHAR), "unexpected size %u\n", size);
1286
1287 status = 0xdeadbeef;
1288 size = sizeof(status);
1290 ok(ret, "failed unexpectedly %u\n", GetLastError());
1291 ok(status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status);
1292
1293done:
1294 WinHttpCloseHandle(req);
1295 WinHttpCloseHandle(con);
1296 WinHttpCloseHandle(ses);
1297}
static const WCHAR version[]
Definition: asmname.c:66
#define WINHTTP_QUERY_VERSION
Definition: winhttp.h:316

Referenced by START_TEST().

◆ test_request_path_escapes()

static void test_request_path_escapes ( int  port)
static

Definition at line 3451 of file winhttp.c.

3452{
3453 static const WCHAR objW[] =
3454 {'/','e','s','c','a','p','e','\r','\n',0x1f,0x7f,'<',' ','%','o','n','e','?',0x1f,0x7f,' ','!','"','#',
3455 '$','%','&','\'','(',')','*','+',',','-','.','/',':',';','<','=','>','?','@','[','\\',']','^','_','`',
3456 '{','|','}','~','\r','\n',0};
3457 static const WCHAR obj2W[] =
3458 {'/','e','s','c','a','p','e','\r','\n',0x1f,0x7f,'<',' ','%','t','w','o','?',0x1f,0x7f,' ','!','"','#',
3459 '$','%','&','\'','(',')','*','+',',','-','.','/',':',';','<','=','>','?','@','[','\\',']','^','_','`',
3460 '{','|','}','~','\r','\n',0};
3461 static const WCHAR obj3W[] =
3462 {'/','e','s','c','a','p','e','\r','\n',0x1f,0x7f,'<',' ','%','t','h','r','e','e','?',0x1f,0x7f,' ','!',
3463 '"','#','$','%','&','\'','(',')','*','+',',','-','.','/',':',';','<','=','>','?','@','[','\\',']','^',
3464 '_','`','{','|','}','~','\r','\n',0};
3465 static const WCHAR obj4W[] =
3466 {'/','e','s','c','a','p','e','\r','\n',0x1f,0x7f,'<',' ','%','f','o','u','r','?',0x1f,0x7f,' ','!','"',
3467 '#','$','%','&','\'','(',')','*','+',',','-','.','/',':',';','<','=','>','?','@','[','\\',']','^','_',
3468 '`','{','|','}','~','\r','\n',0};
3469 static const WCHAR obj5W[] =
3470 {'/','e','s','c','a','p','e','&','t','e','x','t','=','o','n','e',0x80,0x7f,0x7e,0};
3471 static const WCHAR obj6W[] =
3472 {'/','e','s','c','a','p','e','&','t','e','x','t','=','t','w','o',0x80,0x7f,0x7e,0};
3473 static const WCHAR obj7W[] =
3474 {'/','e','s','c','a','p','e','&','t','e','x','t','=',0x541b,0x306e,0x540d,0x306f,0};
3475 HINTERNET ses, con;
3476
3478 ok( ses != NULL, "failed to open session %u\n", GetLastError() );
3479
3480 con = WinHttpConnect( ses, localhostW, port, 0 );
3481 ok( con != NULL, "failed to open a connection %u\n", GetLastError() );
3482
3483 do_request( con, objW, 0 );
3487 do_request( con, obj5W, 0 );
3490
3491 WinHttpCloseHandle( con );
3492 WinHttpCloseHandle( ses );
3493}
static void do_request(HINTERNET con, const WCHAR *obj, DWORD flags)
Definition: winhttp.c:3427
#define WINHTTP_FLAG_ESCAPE_DISABLE_QUERY
Definition: winhttp.h:57
#define WINHTTP_FLAG_ESCAPE_PERCENT
Definition: winhttp.h:54
#define WINHTTP_FLAG_ESCAPE_DISABLE
Definition: winhttp.h:56

Referenced by START_TEST().

◆ test_resolve_timeout()

static void test_resolve_timeout ( void  )
static

Definition at line 2104 of file winhttp.c.

2105{
2106 static const WCHAR nxdomain[] =
2107 {'n','x','d','o','m','a','i','n','.','w','i','n','e','h','q','.','o','r','g',0};
2108 HINTERNET ses, con, req;
2109 DWORD timeout;
2110 BOOL ret;
2111
2112 if (! proxy_active())
2113 {
2114 ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
2115 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2116
2117 timeout = 10000;
2119 ok(ret, "failed to set resolve timeout %u\n", GetLastError());
2120
2121 con = WinHttpConnect(ses, nxdomain, 0, 0);
2122 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2123
2124 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
2125 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2126
2127 SetLastError(0xdeadbeef);
2128 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
2129 if (ret)
2130 {
2131 skip("nxdomain returned success. Broken ISP redirects?\n");
2132 goto done;
2133 }
2135 "expected ERROR_WINHTTP_NAME_NOT_RESOLVED got %u\n", GetLastError());
2136
2140 "got %u\n", GetLastError() );
2141
2142 WinHttpCloseHandle(req);
2143 WinHttpCloseHandle(con);
2144 WinHttpCloseHandle(ses);
2145 }
2146 else
2147 skip("Skipping host resolution tests, host resolution preformed by proxy\n");
2148
2149 ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
2150 ok(ses != NULL, "failed to open session %u\n", GetLastError());
2151
2152 timeout = 10000;
2154 ok(ret, "failed to set resolve timeout %u\n", GetLastError());
2155
2156 con = WinHttpConnect(ses, test_winehq, 0, 0);
2157 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
2158
2159 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
2160 ok(req != NULL, "failed to open a request %u\n", GetLastError());
2161
2162 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
2164 {
2165 skip("connection failed, skipping\n");
2166 goto done;
2167 }
2168 ok(ret, "failed to send request\n");
2169
2170 done:
2171 WinHttpCloseHandle(req);
2172 WinHttpCloseHandle(con);
2173 WinHttpCloseHandle(ses);
2174}
static BOOL proxy_active(void)
Definition: winhttp.c:62
#define ERROR_WINHTTP_NAME_NOT_RESOLVED
Definition: winhttp.h:193
#define ERROR_WINHTTP_OPERATION_CANCELLED
Definition: winhttp.h:198
#define WINHTTP_OPTION_RESOLVE_TIMEOUT
Definition: winhttp.h:95

Referenced by START_TEST().

◆ test_secure_connection()

static void test_secure_connection ( void  )
static

Definition at line 1048 of file winhttp.c.

1049{
1050 static const char data_start[] = "<!DOCTYPE html PUBLIC";
1051 HINTERNET ses, con, req;
1052 DWORD size, status, policy, bitness, read_size, err, available_size, protocols, flags;
1053 BOOL ret;
1056 char buffer[32];
1057
1058 ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
1059 ok(ses != NULL, "failed to open session %u\n", GetLastError());
1060
1063 ok(ret, "failed to set redirect policy %u\n", GetLastError());
1064
1067 err = GetLastError();
1068 ok(ret || err == ERROR_INVALID_PARAMETER /* < win7 */, "failed to set protocols %u\n", err);
1069
1070 con = WinHttpConnect(ses, test_winehq, 443, 0);
1071 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
1072
1073 /* try without setting WINHTTP_FLAG_SECURE */
1074 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
1075 ok(req != NULL, "failed to open a request %u\n", GetLastError());
1076
1078 err = GetLastError();
1079 ok(!ret, "unexpected success\n");
1081 "setting client cert context returned %u\n", err);
1082
1083 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
1084 err = GetLastError();
1086 {
1087 skip("Connection failed, skipping.\n");
1088 goto cleanup;
1089 }
1090 ok(ret, "failed to send request %u\n", GetLastError());
1091
1093 ok(ret, "failed to receive response %u\n", GetLastError());
1094
1095 status = 0xdeadbeef;
1096 size = sizeof(status);
1098 ok(ret, "header query failed %u\n", GetLastError());
1099 ok(status == HTTP_STATUS_BAD_REQUEST, "got %u\n", status);
1100
1101 WinHttpCloseHandle(req);
1102
1104 ok(req != NULL, "failed to open a request %u\n", GetLastError());
1105
1106 flags = 0xdeadbeef;
1107 size = sizeof(flags);
1109 ok(ret, "failed to query security flags %u\n", GetLastError());
1110 ok(!flags, "got %08x\n", flags);
1111
1114 ok(ret, "failed to set security flags %u\n", GetLastError());
1115
1118 ok(!ret, "success\n");
1119
1122 ok(!ret, "success\n");
1123
1127 ok(ret, "failed to set security flags %u\n", GetLastError());
1128
1129 flags = 0;
1131 ok(ret, "failed to set security flags %u\n", GetLastError());
1132
1134 err = GetLastError();
1135 ok(ret || broken(!ret && err == ERROR_INVALID_PARAMETER) /* winxp */, "failed to set client cert context %u\n", err);
1136
1138
1139 ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0);
1140 err = GetLastError();
1143 {
1144 skip("secure connection failed, skipping remaining secure tests\n");
1145 goto cleanup;
1146 }
1147 ok(ret, "failed to send request %u\n", GetLastError());
1148
1149 size = sizeof(cert);
1151 ok(ret, "failed to retrieve certificate context %u\n", GetLastError());
1153
1154 size = sizeof(bitness);
1156 ok(ret, "failed to retrieve key bitness %u\n", GetLastError());
1157
1158 size = sizeof(info);
1160 ok(ret, "failed to retrieve certificate info %u\n", GetLastError());
1161
1162 if (ret)
1163 {
1164 trace("lpszSubjectInfo %s\n", wine_dbgstr_w(info.lpszSubjectInfo));
1165 trace("lpszIssuerInfo %s\n", wine_dbgstr_w(info.lpszIssuerInfo));
1166 trace("lpszProtocolName %s\n", wine_dbgstr_w(info.lpszProtocolName));
1167 trace("lpszSignatureAlgName %s\n", wine_dbgstr_w(info.lpszSignatureAlgName));
1168 trace("lpszEncryptionAlgName %s\n", wine_dbgstr_w(info.lpszEncryptionAlgName));
1169 trace("dwKeySize %u\n", info.dwKeySize);
1170 LocalFree( info.lpszSubjectInfo );
1171 LocalFree( info.lpszIssuerInfo );
1172 }
1173
1176 {
1177 skip("connection error, skipping remaining secure tests\n");
1178 goto cleanup;
1179 }
1180 ok(ret, "failed to receive response %u\n", GetLastError());
1181
1182 available_size = 0;
1183 ret = WinHttpQueryDataAvailable(req, &available_size);
1184 ok(ret, "failed to query available data %u\n", GetLastError());
1185 ok(available_size > 2014, "available_size = %u\n", available_size);
1186
1187 status = 0xdeadbeef;
1188 size = sizeof(status);
1190 ok(ret, "failed unexpectedly %u\n", GetLastError());
1191 ok(status == HTTP_STATUS_OK, "request failed unexpectedly %u\n", status);
1192
1193 size = 0;
1195 ok(!ret, "succeeded unexpectedly\n");
1196
1197 read_size = 0;
1198 for (;;)
1199 {
1200 size = 0;
1201 ret = WinHttpReadData(req, buffer, sizeof(buffer), &size);
1202 ok(ret == TRUE, "WinHttpReadData failed: %u.\n", GetLastError());
1203 if (!size) break;
1204 read_size += size;
1205
1206 if (read_size <= 32)
1207 ok(!memcmp(buffer, data_start, sizeof(data_start)-1), "not expected: %.32s\n", buffer);
1208 }
1209 ok(read_size >= available_size, "read_size = %u, available_size = %u\n", read_size, available_size);
1210
1211 size = sizeof(cert);
1213 ok(ret, "failed to retrieve certificate context %u\n", GetLastError());
1215
1216cleanup:
1217 WinHttpCloseHandle(req);
1218 WinHttpCloseHandle(con);
1219 WinHttpCloseHandle(ses);
1220}
struct protocol * protocols
Definition: dispatch.c:56
BOOL WINAPI CertFreeCertificateContext(PCCERT_CONTEXT pCertContext)
Definition: cert.c:371
WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback(HINTERNET handle, WINHTTP_STATUS_CALLBACK callback, DWORD flags, DWORD_PTR reserved)
Definition: session.c:2056
WDF_INTERRUPT_POLICY policy
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
static BYTE cert[]
Definition: msg.c:1437
static void CALLBACK cert_error(HINTERNET handle, DWORD_PTR ctx, DWORD status, LPVOID buf, DWORD len)
Definition: winhttp.c:1028
#define SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE
Definition: winhttp.h:284
#define WINHTTP_OPTION_SERVER_CERT_CONTEXT
Definition: winhttp.h:121
#define WINHTTP_OPTION_SECURITY_FLAGS
Definition: winhttp.h:106
#define WINHTTP_OPTION_CLIENT_CERT_CONTEXT
Definition: winhttp.h:113
#define ERROR_WINHTTP_SECURE_FAILURE
Definition: winhttp.h:225
#define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID
Definition: winhttp.h:282
#define SECURITY_FLAG_SECURE
Definition: winhttp.h:285
#define ERROR_WINHTTP_CONNECTION_ERROR
Definition: winhttp.h:202
#define WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT
Definition: winhttp.h:107
#define WINHTTP_NO_CLIENT_CERT_CONTEXT
Definition: winhttp.h:69
#define WINHTTP_FLAG_SECURE
Definition: winhttp.h:60
#define WINHTTP_OPTION_REDIRECT_POLICY
Definition: winhttp.h:131
#define WINHTTP_OPTION_SECURITY_KEY_BITNESS
Definition: winhttp.h:109
#define WINHTTP_OPTION_SECURE_PROTOCOLS
Definition: winhttp.h:127
#define WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2
Definition: winhttp.h:447
#define SECURITY_FLAG_STRENGTH_STRONG
Definition: winhttp.h:288
#define WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS
Definition: winhttp.h:159
#define SECURITY_FLAG_IGNORE_UNKNOWN_CA
Definition: winhttp.h:281
#define WINHTTP_CALLBACK_STATUS_SECURE_FAILURE
Definition: winhttp.h:395
#define SECURITY_FLAG_IGNORE_CERT_CN_INVALID
Definition: winhttp.h:283

Referenced by START_TEST().

◆ test_set_default_proxy_config()

static void test_set_default_proxy_config ( void  )
static

Definition at line 1358 of file winhttp.c.

1359{
1360 static WCHAR wideString[] = { 0x226f, 0x575b, 0 };
1361 static WCHAR normalString[] = { 'f','o','o',0 };
1362 DWORD type, len;
1363 BYTE *saved_proxy_settings = NULL;
1365 BOOL ret;
1366
1367 /* FIXME: it would be simpler to read the current settings using
1368 * WinHttpGetDefaultProxyConfiguration and save them using
1369 * WinHttpSetDefaultProxyConfiguration, but they appear to have a bug.
1370 *
1371 * If a proxy is configured in the registry, e.g. via 'proxcfg -p "foo"',
1372 * the access type reported by WinHttpGetDefaultProxyConfiguration is 1,
1373 * WINHTTP_ACCESS_TYPE_NO_PROXY, whereas it should be
1374 * WINHTTP_ACCESS_TYPE_NAMED_PROXY.
1375 * If WinHttpSetDefaultProxyConfiguration is called with dwAccessType = 1,
1376 * the lpszProxy and lpszProxyBypass values are ignored.
1377 * Thus, if a proxy is set with proxycfg, then calling
1378 * WinHttpGetDefaultProxyConfiguration followed by
1379 * WinHttpSetDefaultProxyConfiguration results in the proxy settings
1380 * getting deleted from the registry.
1381 *
1382 * Instead I read the current registry value and restore it directly.
1383 */
1385 if (len)
1386 {
1387 saved_proxy_settings = HeapAlloc( GetProcessHeap(), 0, len );
1388 len = get_default_proxy_reg_value( saved_proxy_settings, len, &type );
1389 }
1390
1391 if (0)
1392 {
1393 /* Crashes on Vista and higher */
1394 SetLastError(0xdeadbeef);
1397 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1398 }
1399
1400 /* test with invalid access type */
1401 info.dwAccessType = 0xdeadbeef;
1402 info.lpszProxy = info.lpszProxyBypass = NULL;
1403 SetLastError(0xdeadbeef);
1406 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1407
1408 /* at a minimum, the proxy server must be set */
1410 info.lpszProxy = info.lpszProxyBypass = NULL;
1411 SetLastError(0xdeadbeef);
1414 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1415 info.lpszProxyBypass = normalString;
1416 SetLastError(0xdeadbeef);
1419 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1420
1421 /* the proxy server can't have wide characters */
1422 info.lpszProxy = wideString;
1423 SetLastError(0xdeadbeef);
1426 skip("couldn't set default proxy configuration: access denied\n");
1427 else
1429 broken(ret), /* Earlier winhttp versions on W2K/XP */
1430 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
1431
1432 info.lpszProxy = normalString;
1433 SetLastError(0xdeadbeef);
1436 skip("couldn't set default proxy configuration: access denied\n");
1437 else
1438 {
1439 ok(ret, "WinHttpSetDefaultProxyConfiguration failed: %u\n", GetLastError());
1440 ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
1441 "got %u\n", GetLastError());
1442 }
1443 set_default_proxy_reg_value( saved_proxy_settings, len, type );
1444}
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
BOOL WINAPI WinHttpSetDefaultProxyConfiguration(WINHTTP_PROXY_INFO *info)
Definition: session.c:1948
static DWORD get_default_proxy_reg_value(BYTE *buf, DWORD len, DWORD *type)
Definition: winhttp.c:1309
static void set_default_proxy_reg_value(BYTE *buf, DWORD len, DWORD type)
Definition: winhttp.c:1345
#define WINHTTP_ACCESS_TYPE_NAMED_PROXY
Definition: winhttp.h:64
unsigned char BYTE
Definition: xxhash.c:193

Referenced by START_TEST().

◆ test_timeouts()

static void test_timeouts ( void  )
static

Definition at line 1446 of file winhttp.c.

1447{
1448 BOOL ret;
1449 DWORD value, size;
1450 HINTERNET ses, req, con;
1451
1452 ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
1453 ok(ses != NULL, "failed to open session %u\n", GetLastError());
1454
1455 SetLastError(0xdeadbeef);
1456 ret = WinHttpSetTimeouts(ses, -2, 0, 0, 0);
1458 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1459
1460 SetLastError(0xdeadbeef);
1461 ret = WinHttpSetTimeouts(ses, 0, -2, 0, 0);
1463 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1464
1465 SetLastError(0xdeadbeef);
1466 ret = WinHttpSetTimeouts(ses, 0, 0, -2, 0);
1468 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1469
1470 SetLastError(0xdeadbeef);
1471 ret = WinHttpSetTimeouts(ses, 0, 0, 0, -2);
1473 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1474
1475 SetLastError(0xdeadbeef);
1476 ret = WinHttpSetTimeouts(ses, -1, -1, -1, -1);
1477 ok(ret, "%u\n", GetLastError());
1478 ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
1479 "expected ERROR_SUCCESS, got %u\n", GetLastError());
1480
1481 SetLastError(0xdeadbeef);
1482 ret = WinHttpSetTimeouts(ses, 0, 0, 0, 0);
1483 ok(ret, "%u\n", GetLastError());
1484
1485 SetLastError(0xdeadbeef);
1486 ret = WinHttpSetTimeouts(ses, 0x0123, 0x4567, 0x89ab, 0xcdef);
1487 ok(ret, "%u\n", GetLastError());
1488
1489 SetLastError(0xdeadbeef);
1490 value = 0xdeadbeef;
1491 size = sizeof(DWORD);
1493 ok(ret, "%u\n", GetLastError());
1494 ok(value == 0x0123, "Expected 0x0123, got %u\n", value);
1495
1496 SetLastError(0xdeadbeef);
1497 value = 0xdeadbeef;
1498 size = sizeof(DWORD);
1500 ok(ret, "%u\n", GetLastError());
1501 ok(value == 0x4567, "Expected 0x4567, got %u\n", value);
1502
1503 SetLastError(0xdeadbeef);
1504 value = 0xdeadbeef;
1505 size = sizeof(DWORD);
1507 ok(ret, "%u\n", GetLastError());
1508 ok(value == 0x89ab, "Expected 0x89ab, got %u\n", value);
1509
1510 SetLastError(0xdeadbeef);
1511 value = 0xdeadbeef;
1512 size = sizeof(DWORD);
1514 ok(ret, "%u\n", GetLastError());
1515 ok(value == 0xcdef, "Expected 0xcdef, got %u\n", value);
1516
1517 SetLastError(0xdeadbeef);
1518 value = 0;
1520 ok(ret, "%u\n", GetLastError());
1521
1522 SetLastError(0xdeadbeef);
1523 value = 0xdeadbeef;
1524 size = sizeof(DWORD);
1526 ok(ret, "%u\n", GetLastError());
1527 ok(value == 0, "Expected 0, got %u\n", value);
1528
1529 SetLastError(0xdeadbeef);
1530 value = 0;
1532 ok(ret, "%u\n", GetLastError());
1533
1534 SetLastError(0xdeadbeef);
1535 value = 0xdeadbeef;
1536 size = sizeof(DWORD);
1538 ok(ret, "%u\n", GetLastError());
1539 ok(value == 0, "Expected 0, got %u\n", value);
1540
1541 SetLastError(0xdeadbeef);
1542 value = 0;
1544 ok(ret, "%u\n", GetLastError());
1545
1546 SetLastError(0xdeadbeef);
1547 value = 0xdeadbeef;
1548 size = sizeof(DWORD);
1550 ok(ret, "%u\n", GetLastError());
1551 ok(value == 0, "Expected 0, got %u\n", value);
1552
1553 SetLastError(0xdeadbeef);
1554 value = 0;
1556 ok(ret, "%u\n", GetLastError());
1557
1558 SetLastError(0xdeadbeef);
1559 value = 0xdeadbeef;
1560 size = sizeof(DWORD);
1562 ok(ret, "%u\n", GetLastError());
1563 ok(value == 0, "Expected 0, got %u\n", value);
1564
1565 SetLastError(0xdeadbeef);
1566 value = 0xbeefdead;
1568 ok(ret, "%u\n", GetLastError());
1569
1570 SetLastError(0xdeadbeef);
1571 value = 0xdeadbeef;
1572 size = sizeof(DWORD);
1574 ok(ret, "%u\n", GetLastError());
1575 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1576
1577 SetLastError(0xdeadbeef);
1578 value = 0xbeefdead;
1580 ok(ret, "%u\n", GetLastError());
1581
1582 SetLastError(0xdeadbeef);
1583 value = 0xdeadbeef;
1584 size = sizeof(DWORD);
1586 ok(ret, "%u\n", GetLastError());
1587 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1588
1589 SetLastError(0xdeadbeef);
1590 value = 0xbeefdead;
1592 ok(ret, "%u\n", GetLastError());
1593
1594 SetLastError(0xdeadbeef);
1595 value = 0xdeadbeef;
1596 size = sizeof(DWORD);
1598 ok(ret, "%u\n", GetLastError());
1599 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1600
1601 SetLastError(0xdeadbeef);
1602 value = 0xbeefdead;
1604 ok(ret, "%u\n", GetLastError());
1605
1606 SetLastError(0xdeadbeef);
1607 value = 0xdeadbeef;
1608 size = sizeof(DWORD);
1610 ok(ret, "%u\n", GetLastError());
1611 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1612
1613 con = WinHttpConnect(ses, test_winehq, 0, 0);
1614 ok(con != NULL, "failed to open a connection %u\n", GetLastError());
1615
1616 /* Timeout values should match the last one set for session */
1617 SetLastError(0xdeadbeef);
1618 value = 0xdeadbeef;
1619 size = sizeof(DWORD);
1621 ok(ret, "%u\n", GetLastError());
1622 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1623
1624 SetLastError(0xdeadbeef);
1625 value = 0xdeadbeef;
1626 size = sizeof(DWORD);
1628 ok(ret, "%u\n", GetLastError());
1629 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1630
1631 SetLastError(0xdeadbeef);
1632 value = 0xdeadbeef;
1633 size = sizeof(DWORD);
1635 ok(ret, "%u\n", GetLastError());
1636 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1637
1638 SetLastError(0xdeadbeef);
1639 value = 0xdeadbeef;
1640 size = sizeof(DWORD);
1642 ok(ret, "%u\n", GetLastError());
1643 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1644
1645 SetLastError(0xdeadbeef);
1646 ret = WinHttpSetTimeouts(con, -2, 0, 0, 0);
1648 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1649
1650 SetLastError(0xdeadbeef);
1651 ret = WinHttpSetTimeouts(con, 0, -2, 0, 0);
1653 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1654
1655 SetLastError(0xdeadbeef);
1656 ret = WinHttpSetTimeouts(con, 0, 0, -2, 0);
1658 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1659
1660 SetLastError(0xdeadbeef);
1661 ret = WinHttpSetTimeouts(con, 0, 0, 0, -2);
1663 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1664
1665 SetLastError(0xdeadbeef);
1666 ret = WinHttpSetTimeouts(con, -1, -1, -1, -1);
1668 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1669
1670 SetLastError(0xdeadbeef);
1671 ret = WinHttpSetTimeouts(con, 0, 0, 0, 0);
1673 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1674
1675 SetLastError(0xdeadbeef);
1676 value = 0;
1679 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1680
1681 SetLastError(0xdeadbeef);
1682 value = 0;
1685 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1686
1687 SetLastError(0xdeadbeef);
1688 value = 0;
1691 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1692
1693 SetLastError(0xdeadbeef);
1694 value = 0;
1697 "expected ERROR_WINHTTP_INVALID_TYPE, got %u\n", GetLastError());
1698
1699 /* Changing timeout values for session should affect the values for connection */
1700 SetLastError(0xdeadbeef);
1701 value = 0xdead;
1703 ok(ret, "%u\n", GetLastError());
1704
1705 SetLastError(0xdeadbeef);
1706 value = 0xdeadbeef;
1707 size = sizeof(DWORD);
1709 ok(ret, "%u\n", GetLastError());
1710 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1711
1712 SetLastError(0xdeadbeef);
1713 value = 0xdead;
1715 ok(ret, "%u\n", GetLastError());
1716
1717 SetLastError(0xdeadbeef);
1718 value = 0xdeadbeef;
1719 size = sizeof(DWORD);
1721 ok(ret, "%u\n", GetLastError());
1722 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1723
1724 SetLastError(0xdeadbeef);
1725 value = 0xdead;
1727 ok(ret, "%u\n", GetLastError());
1728
1729 SetLastError(0xdeadbeef);
1730 value = 0xdeadbeef;
1731 size = sizeof(DWORD);
1733 ok(ret, "%u\n", GetLastError());
1734 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1735
1736 SetLastError(0xdeadbeef);
1737 value = 0xdead;
1739 ok(ret, "%u\n", GetLastError());
1740
1741 SetLastError(0xdeadbeef);
1742 value = 0xdeadbeef;
1743 size = sizeof(DWORD);
1745 ok(ret, "%u\n", GetLastError());
1746 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1747
1748 req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
1749 ok(req != NULL, "failed to open a request %u\n", GetLastError());
1750
1751 /* Timeout values should match the last one set for session */
1752 SetLastError(0xdeadbeef);
1753 value = 0xdeadbeef;
1754 size = sizeof(DWORD);
1756 ok(ret, "%u\n", GetLastError());
1757 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1758
1759 SetLastError(0xdeadbeef);
1760 value = 0xdeadbeef;
1761 size = sizeof(DWORD);
1763 ok(ret, "%u\n", GetLastError());
1764 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1765
1766 SetLastError(0xdeadbeef);
1767 value = 0xdeadbeef;
1768 size = sizeof(DWORD);
1770 ok(ret, "%u\n", GetLastError());
1771 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1772
1773 SetLastError(0xdeadbeef);
1774 value = 0xdeadbeef;
1775 size = sizeof(DWORD);
1777 ok(ret, "%u\n", GetLastError());
1778 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1779
1780 SetLastError(0xdeadbeef);
1781 ret = WinHttpSetTimeouts(req, -2, 0, 0, 0);
1783 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1784
1785 SetLastError(0xdeadbeef);
1786 ret = WinHttpSetTimeouts(req, 0, -2, 0, 0);
1788 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1789
1790 SetLastError(0xdeadbeef);
1791 ret = WinHttpSetTimeouts(req, 0, 0, -2, 0);
1793 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1794
1795 SetLastError(0xdeadbeef);
1796 ret = WinHttpSetTimeouts(req, 0, 0, 0, -2);
1798 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1799
1800 SetLastError(0xdeadbeef);
1801 ret = WinHttpSetTimeouts(req, -1, -1, -1, -1);
1802 ok(ret, "%u\n", GetLastError());
1803
1804 SetLastError(0xdeadbeef);
1805 ret = WinHttpSetTimeouts(req, 0, 0, 0, 0);
1806 ok(ret, "%u\n", GetLastError());
1807
1808 SetLastError(0xdeadbeef);
1809 ret = WinHttpSetTimeouts(req, 0xcdef, 0x89ab, 0x4567, 0x0123);
1810 ok(ret, "%u\n", GetLastError());
1811
1812 SetLastError(0xdeadbeef);
1813 value = 0xdeadbeef;
1814 size = sizeof(DWORD);
1816 ok(ret, "%u\n", GetLastError());
1817 ok(value == 0xcdef, "Expected 0xcdef, got %u\n", value);
1818
1819 SetLastError(0xdeadbeef);
1820 value = 0xdeadbeef;
1821 size = sizeof(DWORD);
1823 ok(ret, "%u\n", GetLastError());
1824 ok(value == 0x89ab, "Expected 0x89ab, got %u\n", value);
1825
1826 SetLastError(0xdeadbeef);
1827 value = 0xdeadbeef;
1828 size = sizeof(DWORD);
1830 ok(ret, "%u\n", GetLastError());
1831 ok(value == 0x4567, "Expected 0x4567, got %u\n", value);
1832
1833 SetLastError(0xdeadbeef);
1834 value = 0xdeadbeef;
1835 size = sizeof(DWORD);
1837 ok(ret, "%u\n", GetLastError());
1838 ok(value == 0x0123, "Expected 0x0123, got %u\n", value);
1839
1840 SetLastError(0xdeadbeef);
1841 value = 0;
1843 ok(ret, "%u\n", GetLastError());
1844
1845 SetLastError(0xdeadbeef);
1846 value = 0xdeadbeef;
1847 size = sizeof(DWORD);
1849 ok(ret, "%u\n", GetLastError());
1850 ok(value == 0, "Expected 0, got %u\n", value);
1851
1852 SetLastError(0xdeadbeef);
1853 value = 0;
1855 ok(ret, "%u\n", GetLastError());
1856
1857 SetLastError(0xdeadbeef);
1858 value = 0xdeadbeef;
1859 size = sizeof(DWORD);
1861 ok(ret, "%u\n", GetLastError());
1862 ok(value == 0, "Expected 0, got %u\n", value);
1863
1864 SetLastError(0xdeadbeef);
1865 value = 0;
1867 ok(ret, "%u\n", GetLastError());
1868
1869 SetLastError(0xdeadbeef);
1870 value = 0xdeadbeef;
1871 size = sizeof(DWORD);
1873 ok(ret, "%u\n", GetLastError());
1874 ok(value == 0, "Expected 0, got %u\n", value);
1875
1876 SetLastError(0xdeadbeef);
1877 value = 0;
1879 ok(ret, "%u\n", GetLastError());
1880
1881 SetLastError(0xdeadbeef);
1882 value = 0xdeadbeef;
1883 size = sizeof(DWORD);
1885 ok(ret, "%u\n", GetLastError());
1886 ok(value == 0, "Expected 0, got %u\n", value);
1887
1888 SetLastError(0xdeadbeef);
1889 value = 0xbeefdead;
1891 ok(ret, "%u\n", GetLastError());
1892
1893 SetLastError(0xdeadbeef);
1894 value = 0xdeadbeef;
1895 size = sizeof(DWORD);
1897 ok(ret, "%u\n", GetLastError());
1898 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1899
1900 SetLastError(0xdeadbeef);
1901 value = 0xbeefdead;
1903 ok(ret, "%u\n", GetLastError());
1904
1905 SetLastError(0xdeadbeef);
1906 value = 0xdeadbeef;
1907 size = sizeof(DWORD);
1909 ok(ret, "%u\n", GetLastError());
1910 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1911
1912 SetLastError(0xdeadbeef);
1913 value = 0xbeefdead;
1915 ok(ret, "%u\n", GetLastError());
1916
1917 SetLastError(0xdeadbeef);
1918 value = 0xdeadbeef;
1919 size = sizeof(DWORD);
1921 ok(ret, "%u\n", GetLastError());
1922 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1923
1924 SetLastError(0xdeadbeef);
1925 value = 0xbeefdead;
1927 ok(ret, "%u\n", GetLastError());
1928
1929 SetLastError(0xdeadbeef);
1930 value = 0xdeadbeef;
1931 size = sizeof(DWORD);
1933 ok(ret, "%u\n", GetLastError());
1934 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1935
1936 /* Changing timeout values for session should not affect the values for a request,
1937 * neither should the other way around.
1938 */
1939 SetLastError(0xdeadbeef);
1940 value = 0xbeefdead;
1942 ok(ret, "%u\n", GetLastError());
1943
1944 SetLastError(0xdeadbeef);
1945 value = 0xdeadbeef;
1946 size = sizeof(DWORD);
1948 ok(ret, "%u\n", GetLastError());
1949 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1950
1951 SetLastError(0xdeadbeef);
1952 value = 0xbeefdead;
1954 ok(ret, "%u\n", GetLastError());
1955
1956 SetLastError(0xdeadbeef);
1957 value = 0xdeadbeef;
1958 size = sizeof(DWORD);
1960 ok(ret, "%u\n", GetLastError());
1961 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1962
1963 SetLastError(0xdeadbeef);
1964 value = 0xbeefdead;
1966 ok(ret, "%u\n", GetLastError());
1967
1968 SetLastError(0xdeadbeef);
1969 value = 0xdeadbeef;
1970 size = sizeof(DWORD);
1972 ok(ret, "%u\n", GetLastError());
1973 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1974
1975 SetLastError(0xdeadbeef);
1976 value = 0xbeefdead;
1978 ok(ret, "%u\n", GetLastError());
1979
1980 SetLastError(0xdeadbeef);
1981 value = 0xdeadbeef;
1982 size = sizeof(DWORD);
1984 ok(ret, "%u\n", GetLastError());
1985 ok(value == 0xdead, "Expected 0xdead, got %u\n", value);
1986
1987 SetLastError(0xdeadbeef);
1988 value = 0xbeef;
1990 ok(ret, "%u\n", GetLastError());
1991
1992 SetLastError(0xdeadbeef);
1993 value = 0xdeadbeef;
1994 size = sizeof(DWORD);
1996 ok(ret, "%u\n", GetLastError());
1997 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
1998
1999 SetLastError(0xdeadbeef);
2000 value = 0xbeef;
2002 ok(ret, "%u\n", GetLastError());
2003
2004 SetLastError(0xdeadbeef);
2005 value = 0xdeadbeef;
2006 size = sizeof(DWORD);
2008 ok(ret, "%u\n", GetLastError());
2009 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
2010
2011 SetLastError(0xdeadbeef);
2012 value = 0xbeef;
2014 ok(ret, "%u\n", GetLastError());
2015
2016 SetLastError(0xdeadbeef);
2017 value = 0xdeadbeef;
2018 size = sizeof(DWORD);
2020 ok(ret, "%u\n", GetLastError());
2021 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
2022
2023 SetLastError(0xdeadbeef);
2024 value = 0xbeef;
2026 ok(ret, "%u\n", GetLastError());
2027
2028 SetLastError(0xdeadbeef);
2029 value = 0xdeadbeef;
2030 size = sizeof(DWORD);
2032 ok(ret, "%u\n", GetLastError());
2033 ok(value == 0xbeefdead, "Expected 0xbeefdead, got %u\n", value);
2034
2035 /* response timeout */
2036 SetLastError(0xdeadbeef);
2037 value = 0xdeadbeef;
2038 size = sizeof(value);
2040 ok(ret, "%u\n", GetLastError());
2041 ok(value == ~0u, "got %u\n", value);
2042
2043 SetLastError(0xdeadbeef);
2044 value = 30000;
2046 ok(ret, "%u\n", GetLastError());
2047
2048 SetLastError(0xdeadbeef);
2049 value = 0xdeadbeef;
2050 size = sizeof(value);
2052 ok(ret, "%u\n", GetLastError());
2053 todo_wine ok(value == 0xbeefdead, "got %u\n", value);
2054
2055 SetLastError(0xdeadbeef);
2056 value = 0xdeadbeef;
2057 size = sizeof(value);
2059 ok(ret, "%u\n", GetLastError());
2060 ok(value == ~0u, "got %u\n", value);
2061
2062 SetLastError(0xdeadbeef);
2063 value = 30000;
2065 ok(!ret, "expected failure\n");
2067
2068 SetLastError(0xdeadbeef);
2069 value = 0xdeadbeef;
2070 size = sizeof(value);
2072 ok(ret, "%u\n", GetLastError());
2073 ok(value == ~0u, "got %u\n", value);
2074
2075 SetLastError(0xdeadbeef);
2076 value = 48878;
2078 ok(ret, "%u\n", GetLastError());
2079
2080 SetLastError(0xdeadbeef);
2081 value = 0xdeadbeef;
2082 size = sizeof(value);
2084 ok(ret, "%u\n", GetLastError());
2085 todo_wine ok(value == 48879, "got %u\n", value);
2086
2087 SetLastError(0xdeadbeef);
2088 value = 48880;
2090 ok(ret, "%u\n", GetLastError());
2091
2092 SetLastError(0xdeadbeef);
2093 value = 0xdeadbeef;
2094 size = sizeof(value);
2096 ok(ret, "%u\n", GetLastError());
2097 ok(value == 48880, "got %u\n", value);
2098
2099 WinHttpCloseHandle(req);
2100 WinHttpCloseHandle(con);
2101 WinHttpCloseHandle(ses);
2102}
BOOL WINAPI WinHttpSetTimeouts(HINTERNET handle, int resolve, int connect, int send, int receive)
Definition: session.c:2081
#define DWORD
Definition: nt_native.h:44
#define WINHTTP_OPTION_SEND_TIMEOUT
Definition: winhttp.h:98
#define WINHTTP_OPTION_CONNECT_TIMEOUT
Definition: winhttp.h:96
#define WINHTTP_OPTION_RECEIVE_TIMEOUT
Definition: winhttp.h:99
#define ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
Definition: winhttp.h:199
#define WINHTTP_OPTION_RECEIVE_RESPONSE_TIMEOUT
Definition: winhttp.h:100

Referenced by START_TEST().

◆ test_WinHttpAddHeaders()

static void test_WinHttpAddHeaders ( void  )
static

Definition at line 556 of file winhttp.c.

557{
558 HINTERNET session, request, connection;
562 DWORD err, index, len, oldlen;
563
564 static const WCHAR test_file[] = {'/','p','o','s','t','t','e','s','t','.','p','h','p',0};
565 static const WCHAR test_verb[] = {'P','O','S','T',0};
566 static const WCHAR test_header_begin[] =
567 {'P','O','S','T',' ','/','p','o','s','t','t','e','s','t','.','p','h','p',' ','H','T','T','P','/','1'};
568 static const WCHAR full_path_test_header_begin[] =
569 {'P','O','S','T',' ','h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',':','8','0',
570 '/','p','o','s','t','t','e','s','t','.','p','h','p',' ','H','T','T','P','/','1'};
571 static const WCHAR test_header_end[] = {'\r','\n','\r','\n',0};
572 static const WCHAR test_header_name[] = {'W','a','r','n','i','n','g',0};
573 static const WCHAR test_header_name2[] = {'n','a','m','e',0};
574 static const WCHAR test_header_name3[] = {'a',0};
575 static const WCHAR test_header_range[] = {'R','a','n','g','e',0};
576 static const WCHAR test_header_range_bytes[] = {'R','a','n','g','e',':',' ','b','y','t','e','s','=','0','-','7','7','3','\r','\n',0};
577 static const WCHAR test_header_bytes[] = {'b','y','t','e','s','=','0','-','7','7','3',0};
578
579 static const WCHAR test_flag_coalesce[] = {'t','e','s','t','2',',',' ','t','e','s','t','4',0};
580 static const WCHAR test_flag_coalesce_reverse[] = {'t','e','s','t','3',',',' ','t','e','s','t','4',0};
581 static const WCHAR test_flag_coalesce_comma[] =
582 {'t','e','s','t','2',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',0};
583 static const WCHAR test_flag_coalesce_comma_reverse[] =
584 {'t','e','s','t','3',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',0};
585 static const WCHAR test_flag_coalesce_semicolon[] =
586 {'t','e','s','t','2',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',';',' ','t','e','s','t','6',0};
587 static const WCHAR test_flag_coalesce_semicolon_reverse[] =
588 {'t','e','s','t','3',',',' ','t','e','s','t','4',',',' ','t','e','s','t','5',';',' ','t','e','s','t','6',0};
589
590 static const WCHAR field[] = {'f','i','e','l','d',0};
591 static const WCHAR value[] = {'v','a','l','u','e',' ',0};
592 static const WCHAR value_nospace[] = {'v','a','l','u','e',0};
593 static const WCHAR empty[] = {0};
594
595 static const WCHAR test_headers[][14] =
596 {
597 {'W','a','r','n','i','n','g',':','t','e','s','t','1',0},
598 {'W','a','r','n','i','n','g',':','t','e','s','t','2',0},
599 {'W','a','r','n','i','n','g',':','t','e','s','t','3',0},
600 {'W','a','r','n','i','n','g',':','t','e','s','t','4',0},
601 {'W','a','r','n','i','n','g',':','t','e','s','t','5',0},
602 {'W','a','r','n','i','n','g',':','t','e','s','t','6',0},
603 {'W','a','r','n','i','n','g',':','t','e','s','t','7',0},
604 {0},
605 {':',0},
606 {'a',':',0},
607 {':','b',0},
608 {'c','d',0},
609 {' ','e',' ',':','f',0},
610 {'f','i','e','l','d',':',' ','v','a','l','u','e',' ',0},
611 {'n','a','m','e',':',' ','v','a','l','u','e',0},
612 {'n','a','m','e',':',0}
613 };
614 static const WCHAR test_indices[][6] =
615 {
616 {'t','e','s','t','1',0},
617 {'t','e','s','t','2',0},
618 {'t','e','s','t','3',0},
619 {'t','e','s','t','4',0}
620 };
621
624 ok(session != NULL, "WinHttpOpen failed to open session.\n");
625
627 ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
628
632 {
633 skip("Network unreachable, skipping.\n");
634 goto done;
635 }
636 ok(request != NULL, "WinHttpOpenRequest failed to open a request, error: %u.\n", GetLastError());
637
638 index = 0;
639 len = sizeof(buffer);
641 test_header_name, buffer, &len, &index);
642 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded, found 'Warning' header.\n");
643 SetLastError(0xdeadbeef);
645 err = GetLastError();
646 ok(ret, "WinHttpAddRequestHeaders failed to add new header, got %d with error %u.\n", ret, err);
647 ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
648
649 index = 0;
650 len = sizeof(buffer);
652 test_header_name, buffer, &len, &index);
653 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
654 ok(index == 1, "WinHttpQueryHeaders failed: header index not incremented\n");
655 ok(memcmp(buffer, test_indices[0], sizeof(test_indices[0])) == 0, "WinHttpQueryHeaders failed: incorrect string returned\n");
656 ok(len == 5*sizeof(WCHAR), "WinHttpQueryHeaders failed: invalid length returned, expected 5, got %d\n", len);
657
659 test_header_name, buffer, &len, &index);
660 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded, second index should not exist.\n");
661
662 /* Try to fetch the header info with a buffer that's big enough to fit the
663 * string but not the NULL terminator.
664 */
665 index = 0;
666 len = 5*sizeof(WCHAR);
667 memset(check_buffer, 0xab, sizeof(check_buffer));
668 memcpy(buffer, check_buffer, sizeof(buffer));
670 test_header_name, buffer, &len, &index);
671 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded with a buffer that's too small.\n");
672 ok(memcmp(buffer, check_buffer, sizeof(buffer)) == 0,
673 "WinHttpQueryHeaders failed, modified the buffer when it should not have.\n");
674 ok(len == 6*sizeof(WCHAR), "WinHttpQueryHeaders returned invalid length, expected 12, got %d\n", len);
675
676 /* Try with a NULL buffer */
677 index = 0;
678 len = sizeof(buffer);
679 SetLastError(0xdeadbeef);
681 test_header_name, NULL, &len, &index);
682 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n");
683 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
684 ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len);
685 ok(index == 0, "WinHttpQueryHeaders incorrectly incremented header index.\n");
686
687 /* Try with a NULL buffer and a length that's too small */
688 index = 0;
689 len = 10;
690 SetLastError(0xdeadbeef);
692 test_header_name, NULL, &len, &index);
693 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n");
695 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICENT_BUFFER, got %u\n", GetLastError());
696 ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len);
697 ok(index == 0, "WinHttpQueryHeaders incorrectly incremented header index.\n");
698
699 index = 0;
700 len = 0;
701 SetLastError(0xdeadbeef);
703 test_header_name, NULL, &len, &index);
704 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n");
706 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
707 ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len);
708 ok(index == 0, "WinHttpQueryHeaders failed: index was incremented.\n");
709
710 /* valid query */
711 oldlen = len;
712 index = 0;
713 len = sizeof(buffer);
714 memset(buffer, 0xff, sizeof(buffer));
716 test_header_name, buffer, &len, &index);
717 ok(ret == TRUE, "WinHttpQueryHeaders failed: got %d\n", ret);
718 ok(len + sizeof(WCHAR) <= oldlen, "WinHttpQueryHeaders resulting length longer than advertized.\n");
719 ok((len < sizeof(buffer) - sizeof(WCHAR)) && buffer[len / sizeof(WCHAR)] == 0, "WinHttpQueryHeaders did not append NULL terminator\n");
720 ok(len == lstrlenW(buffer) * sizeof(WCHAR), "WinHttpQueryHeaders returned incorrect length.\n");
721 ok(memcmp(buffer, test_header_begin, sizeof(test_header_begin)) == 0 ||
722 memcmp(buffer, full_path_test_header_begin, sizeof(full_path_test_header_begin)) == 0,
723 "WinHttpQueryHeaders returned invalid beginning of header string.\n");
724 ok(memcmp(buffer + lstrlenW(buffer) - 4, test_header_end, sizeof(test_header_end)) == 0,
725 "WinHttpQueryHeaders returned invalid end of header string.\n");
726 ok(index == 0, "WinHttpQueryHeaders incremented header index.\n");
727
728 index = 0;
729 len = 0;
730 SetLastError(0xdeadbeef);
732 test_header_name, NULL, &len, &index);
733 ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n");
735 "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
736 ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len);
737 ok(index == 0, "WinHttpQueryHeaders failed: index was incremented.\n");
738
739 oldlen = len;
740 index = 0;
741 len = sizeof(buffer);
742 memset(buffer, 0xff, sizeof(buffer));
744 test_header_name, buffer, &len, &index);
745 ok(ret == TRUE, "WinHttpQueryHeaders failed %u\n", GetLastError());
746 ok(len + sizeof(WCHAR) <= oldlen, "resulting length longer than advertized\n");
747 ok((len < sizeof(buffer) - sizeof(WCHAR)) && !buffer[len / sizeof(WCHAR)] && !buffer[len / sizeof(WCHAR) - 1],
748 "no double NULL terminator\n");
749 ok(memcmp(buffer, test_header_begin, sizeof(test_header_begin)) == 0 ||
750 memcmp(buffer, full_path_test_header_begin, sizeof(full_path_test_header_begin)) == 0,
751 "invalid beginning of header string.\n");
752 ok(index == 0, "header index was incremented\n");
753
754 /* tests for more indices */
756 ok(ret == TRUE, "WinHttpAddRequestHeaders failed to add duplicate header: %d\n", ret);
757
758 index = 0;
759 len = sizeof(buffer);
761 test_header_name, buffer, &len, &index);
762 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
763 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
764 ok(memcmp(buffer, test_indices[0], sizeof(test_indices[0])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
765
766 len = sizeof(buffer);
768 test_header_name, buffer, &len, &index);
769 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
770 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
771 ok(memcmp(buffer, test_indices[1], sizeof(test_indices[1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
772
774 ok(ret == TRUE, "WinHttpAddRequestHeaders failed to add duplicate header.\n");
775
776 index = 0;
777 len = sizeof(buffer);
779 test_header_name, buffer, &len, &index);
780 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
781 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
782 reverse = (memcmp(buffer, test_indices[1], sizeof(test_indices[1])) != 0); /* Win7 returns values in reverse order of adding */
783 ok(memcmp(buffer, test_indices[reverse ? 2 : 1], sizeof(test_indices[reverse ? 2 : 1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
784
785 len = sizeof(buffer);
787 test_header_name, buffer, &len, &index);
788 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
789 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
790 ok(memcmp(buffer, test_indices[reverse ? 1 : 2], sizeof(test_indices[reverse ? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
791
792 /* add if new flag */
794 ok(ret == FALSE, "WinHttpAddRequestHeaders incorrectly replaced existing header.\n");
795
796 index = 0;
797 len = sizeof(buffer);
799 test_header_name, buffer, &len, &index);
800 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
801 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
802 ok(memcmp(buffer, test_indices[reverse ? 2 : 1], sizeof(test_indices[reverse ? 2 : 1])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
803
804 len = sizeof(buffer);
806 test_header_name, buffer, &len, &index);
807 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
808 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
809 ok(memcmp(buffer, test_indices[reverse ? 1 : 2], sizeof(test_indices[reverse ? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
810
811 len = sizeof(buffer);
813 test_header_name, buffer, &len, &index);
814 ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
815
816 /* coalesce flag */
818 ok(ret == TRUE, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE.\n");
819
820 index = 0;
821 len = sizeof(buffer);
823 test_header_name, buffer, &len, &index);
824 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
825 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
826 ok(memcmp(buffer, reverse ? test_flag_coalesce_reverse : test_flag_coalesce,
827 reverse ? sizeof(test_flag_coalesce_reverse) : sizeof(test_flag_coalesce)) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
828
829 len = sizeof(buffer);
831 test_header_name, buffer, &len, &index);
832 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
833 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
834 ok(memcmp(buffer, test_indices[reverse ? 1 : 2], sizeof(test_indices[reverse ? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
835
836 len = sizeof(buffer);
838 test_header_name, buffer, &len, &index);
839 ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
840
841 /* coalesce with comma flag */
843 ok(ret == TRUE, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA.\n");
844
845 index = 0;
846 len = sizeof(buffer);
848 test_header_name, buffer, &len, &index);
849 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
850 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
851 ok(memcmp(buffer, reverse ? test_flag_coalesce_comma_reverse : test_flag_coalesce_comma,
852 reverse ? sizeof(test_flag_coalesce_comma_reverse) : sizeof(test_flag_coalesce_comma)) == 0,
853 "WinHttpQueryHeaders returned incorrect string.\n");
854
855 len = sizeof(buffer);
857 test_header_name, buffer, &len, &index);
858 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
859 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
860 ok(memcmp(buffer, test_indices[reverse ? 1 : 2], sizeof(test_indices[reverse ? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
861
862 len = sizeof(buffer);
864 test_header_name, buffer, &len, &index);
865 ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
866
867
868 /* coalesce with semicolon flag */
870 ok(ret == TRUE, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON.\n");
871
872 index = 0;
873 len = sizeof(buffer);
875 test_header_name, buffer, &len, &index);
876 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
877 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
878 ok(memcmp(buffer, reverse ? test_flag_coalesce_semicolon_reverse : test_flag_coalesce_semicolon,
879 reverse ? sizeof(test_flag_coalesce_semicolon_reverse) : sizeof(test_flag_coalesce_semicolon)) == 0,
880 "WinHttpQueryHeaders returned incorrect string.\n");
881
882 len = sizeof(buffer);
884 test_header_name, buffer, &len, &index);
885 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
886 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
887 ok(memcmp(buffer, test_indices[reverse ? 1 : 2], sizeof(test_indices[reverse ? 1 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
888
889 len = sizeof(buffer);
891 test_header_name, buffer, &len, &index);
892 ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
893
894 /* add and replace flags */
896 ok(ret == TRUE, "WinHttpAddRequestHeaders failed with flag WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE.\n");
897
898 index = 0;
899 len = sizeof(buffer);
901 test_header_name, buffer, &len, &index);
902 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
903 ok(index == 1, "WinHttpQueryHeaders failed to increment index.\n");
904 ok(memcmp(buffer, test_indices[reverse ? 3 : 2], sizeof(test_indices[reverse ? 3 : 2])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
905
906 len = sizeof(buffer);
908 test_header_name, buffer, &len, &index);
909 ok(ret == TRUE, "WinHttpQueryHeaders failed: %u\n", GetLastError());
910 ok(index == 2, "WinHttpQueryHeaders failed to increment index.\n");
911 ok(memcmp(buffer, test_indices[reverse ? 1 : 3], sizeof(test_indices[reverse ? 1 : 3])) == 0, "WinHttpQueryHeaders returned incorrect string.\n");
912
913 len = sizeof(buffer);
915 test_header_name, buffer, &len, &index);
916 ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n");
917
919 ok(!ret, "WinHttpAddRequestHeaders failed\n");
920
922 ok(ret, "WinHttpAddRequestHeaders failed\n");
923
924 index = 0;
925 memset(buffer, 0xff, sizeof(buffer));
926 len = sizeof(buffer);
928 test_header_name3, buffer, &len, &index);
929 ok(ret, "WinHttpQueryHeaders failed: %u\n", GetLastError());
930 ok(!memcmp(buffer, empty, sizeof(empty)), "unexpected result\n");
931
933 ok(!ret, "WinHttpAddRequestHeaders failed\n");
934
936 ok(!ret, "WinHttpAddRequestHeaders failed\n");
937
939 ok(!ret, "WinHttpAddRequestHeaders failed\n");
940
942 ok(ret, "WinHttpAddRequestHeaders failed\n");
943
944 index = 0;
945 buffer[0] = 0;
946 len = sizeof(buffer);
948 field, buffer, &len, &index);
949 ok(ret, "WinHttpQueryHeaders failed: %u\n", GetLastError());
950 ok(!memcmp(buffer, value, sizeof(value)) || ! memcmp(buffer, value_nospace, sizeof(value_nospace)), "unexpected result\n");
951
952 SetLastError(0xdeadbeef);
953 ret = WinHttpAddRequestHeaders(request, test_header_range_bytes, 0,
955 err = GetLastError();
956 ok(!ret, "unexpected success\n");
957 ok(err == ERROR_INVALID_PARAMETER, "got %u\n", err);
958
959 ret = WinHttpAddRequestHeaders(request, test_header_range_bytes, ~0u,
961 ok(ret, "failed to add header: %u\n", GetLastError());
962
963 index = 0;
964 len = sizeof(buffer);
966 test_header_range, buffer, &len, &index);
967 ok(ret, "failed to get range header %u\n", GetLastError());
968 ok(!memcmp(buffer, test_header_bytes, sizeof(test_header_bytes)), "incorrect string returned\n");
969 ok(len == lstrlenW(test_header_bytes) * sizeof(WCHAR), "wrong length %u\n", len);
970 ok(index == 1, "wrong index %u\n", index);
971
972 index = 0;
973 len = sizeof(buffer);
975 test_header_name2, buffer, &len, &index);
976 ok(!ret, "unexpected success\n");
977
978 SetLastError(0xdeadbeef);
980 err = GetLastError();
981 ok(!ret, "unexpected success\n");
982 ok(err == ERROR_WINHTTP_HEADER_NOT_FOUND, "got %u\n", err);
983
985 ok(ret, "got %u\n", GetLastError());
986
987 index = 0;
988 len = sizeof(buffer);
990 test_header_name2, buffer, &len, &index);
991 ok(ret, "got %u\n", GetLastError());
992 ok(index == 1, "wrong index %u\n", index);
993 ok(!memcmp(buffer, value_nospace, sizeof(value_nospace)), "incorrect string\n");
994
996 ok(ret, "got %u\n", GetLastError());
997
998 index = 0;
999 len = sizeof(buffer);
1000 SetLastError(0xdeadbeef);
1002 test_header_name2, buffer, &len, &index);
1003 err = GetLastError();
1004 ok(!ret, "unexpected success\n");
1005 ok(err == ERROR_WINHTTP_HEADER_NOT_FOUND, "got %u\n", err);
1006
1007 ret = WinHttpAddRequestHeaders(request, test_headers[14], -1L, 0);
1008 ok(ret, "got %u\n", GetLastError());
1009
1010 index = 0;
1011 len = sizeof(buffer);
1013 test_header_name2, buffer, &len, &index);
1014 ok(ret, "got %u\n", GetLastError());
1015 ok(index == 1, "wrong index %u\n", index);
1016 ok(!memcmp(buffer, value_nospace, sizeof(value_nospace)), "incorrect string\n");
1017
1019 ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
1020 done:
1021 ret = WinHttpCloseHandle(connection);
1022 ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
1024 ok(ret == TRUE, "WinHttpCloseHandle failed on closing session, got %d.\n", ret);
1025
1026}
#define MAX_PATH
Definition: compat.h:34
static IBackgroundCopyFile * test_file
Definition: file.c:39
static BOOL check_buffer(parse_buffer *buf, ULONG size)
Definition: parsing.c:1119
Definition: parser.c:44
static void reverse(int *pidx, int cch)
Definition: bidi.c:1153
#define WINHTTP_ADDREQ_FLAG_ADD_IF_NEW
Definition: winhttp.h:83
#define WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON
Definition: winhttp.h:86
#define WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
Definition: winhttp.h:62
#define WINHTTP_ADDREQ_FLAG_REPLACE
Definition: winhttp.h:88
#define WINHTTP_ADDREQ_FLAG_COALESCE
Definition: winhttp.h:87
#define INTERNET_DEFAULT_HTTP_PORT
Definition: winhttp.h:36
#define WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA
Definition: winhttp.h:85

Referenced by START_TEST().

◆ test_WinHttpDetectAutoProxyConfigUrl()

static void test_WinHttpDetectAutoProxyConfigUrl ( void  )
static

Definition at line 4562 of file winhttp.c.

4563{
4564 BOOL ret;
4565 WCHAR *url;
4566 DWORD error;
4567
4568 SetLastError(0xdeadbeef);
4570 error = GetLastError();
4571 ok( !ret, "expected failure\n" );
4572 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4573
4574 url = NULL;
4575 SetLastError(0xdeadbeef);
4577 error = GetLastError();
4578 ok( !ret, "expected failure\n" );
4579 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4580
4581 SetLastError(0xdeadbeef);
4583 error = GetLastError();
4584 ok( !ret, "expected failure\n" );
4585 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4586
4587 url = (WCHAR *)0xdeadbeef;
4588 SetLastError(0xdeadbeef);
4590 error = GetLastError();
4591 if (!ret)
4592 {
4594 ok( !url || broken(url == (WCHAR *)0xdeadbeef), "got %p\n", url );
4595 }
4596 else
4597 {
4598 trace("%s\n", wine_dbgstr_w(url));
4599 GlobalFree( url );
4600 }
4601
4602 url = (WCHAR *)0xdeadbeef;
4603 SetLastError(0xdeadbeef);
4605 error = GetLastError();
4606 if (!ret)
4607 {
4609 ok( !url || broken(url == (WCHAR *)0xdeadbeef), "got %p\n", url );
4610 }
4611 else
4612 {
4613 ok( error == ERROR_SUCCESS, "got %u\n", error );
4614 trace("%s\n", wine_dbgstr_w(url));
4615 GlobalFree( url );
4616 }
4617}
BOOL WINAPI WinHttpDetectAutoProxyConfigUrl(DWORD flags, LPWSTR *url)
Definition: session.c:1423
#define WINHTTP_AUTO_DETECT_TYPE_DHCP
Definition: winhttp.h:527
#define WINHTTP_AUTO_DETECT_TYPE_DNS_A
Definition: winhttp.h:528
#define ERROR_WINHTTP_AUTODETECTION_FAILED
Definition: winhttp.h:228

Referenced by START_TEST().

◆ test_WinHttpGetIEProxyConfigForCurrentUser()

static void test_WinHttpGetIEProxyConfigForCurrentUser ( void  )
static

Definition at line 4619 of file winhttp.c.

4620{
4621 BOOL ret;
4622 DWORD error;
4624
4625 memset( &cfg, 0, sizeof(cfg) );
4626
4627 SetLastError(0xdeadbeef);
4629 error = GetLastError();
4630 ok( !ret, "expected failure\n" );
4631 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4632
4633 SetLastError(0xdeadbeef);
4635 error = GetLastError();
4636 ok( ret, "expected success\n" );
4637 ok( error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* < win7 */, "got %u\n", error );
4638
4639 trace("IEProxy.AutoDetect=%d\n", cfg.fAutoDetect);
4640 trace("IEProxy.AutoConfigUrl=%s\n", wine_dbgstr_w(cfg.lpszAutoConfigUrl));
4641 trace("IEProxy.Proxy=%s\n", wine_dbgstr_w(cfg.lpszProxy));
4642 trace("IEProxy.ProxyBypass=%s\n", wine_dbgstr_w(cfg.lpszProxyBypass));
4644 GlobalFree( cfg.lpszProxy );
4646}
BOOL WINAPI WinHttpGetIEProxyConfigForCurrentUser(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG *config)
Definition: session.c:1664
#define ERROR_NO_TOKEN
Definition: winerror.h:587

Referenced by START_TEST().

◆ test_WinHttpGetProxyForUrl()

static void test_WinHttpGetProxyForUrl ( void  )
static

Definition at line 4648 of file winhttp.c.

4649{
4650 static const WCHAR urlW[] = {'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0};
4651 static const WCHAR wpadW[] = {'h','t','t','p',':','/','/','w','p','a','d','/','w','p','a','d','.','d','a','t',0};
4652 static const WCHAR emptyW[] = {0};
4653 BOOL ret;
4654 DWORD error;
4658
4659 memset( &options, 0, sizeof(options) );
4660
4661 SetLastError(0xdeadbeef);
4663 error = GetLastError();
4664 ok( !ret, "expected failure\n" );
4665 ok( error == ERROR_INVALID_HANDLE, "got %u\n", error );
4666
4668 ok( session != NULL, "failed to open session %u\n", GetLastError() );
4669
4670 SetLastError(0xdeadbeef);
4672 error = GetLastError();
4673 ok( !ret, "expected failure\n" );
4674 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4675
4676 SetLastError(0xdeadbeef);
4678 error = GetLastError();
4679 ok( !ret, "expected failure\n" );
4680 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4681
4682 SetLastError(0xdeadbeef);
4684 error = GetLastError();
4685 ok( !ret, "expected failure\n" );
4686 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4687
4688 SetLastError(0xdeadbeef);
4690 error = GetLastError();
4691 ok( !ret, "expected failure\n" );
4692 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4693
4695 options.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DNS_A;
4696
4697 SetLastError(0xdeadbeef);
4699 error = GetLastError();
4700 ok( !ret, "expected failure\n" );
4701 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4702
4704 options.dwAutoDetectFlags = 0;
4705
4706 SetLastError(0xdeadbeef);
4708 error = GetLastError();
4709 ok( !ret, "expected failure\n" );
4710 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4711
4713 options.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DNS_A;
4714
4715 SetLastError(0xdeadbeef);
4717 error = GetLastError();
4718 ok( !ret, "expected failure\n" );
4719 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
4720
4722 options.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DNS_A;
4723
4724 memset( &info, 0, sizeof(info) );
4725 SetLastError(0xdeadbeef);
4727 error = GetLastError();
4728 if (ret)
4729 {
4730 ok( error == ERROR_SUCCESS, "got %u\n", error );
4731 trace("Proxy.AccessType=%u\n", info.dwAccessType);
4732 trace("Proxy.Proxy=%s\n", wine_dbgstr_w(info.lpszProxy));
4733 trace("Proxy.ProxyBypass=%s\n", wine_dbgstr_w(info.lpszProxyBypass));
4734 GlobalFree( info.lpszProxy );
4735 GlobalFree( info.lpszProxyBypass );
4736 }
4737
4739 options.dwAutoDetectFlags = 0;
4740 options.lpszAutoConfigUrl = wpadW;
4741
4742 memset( &info, 0, sizeof(info) );
4744 if (ret)
4745 {
4746 trace("Proxy.AccessType=%u\n", info.dwAccessType);
4747 trace("Proxy.Proxy=%s\n", wine_dbgstr_w(info.lpszProxy));
4748 trace("Proxy.ProxyBypass=%s\n", wine_dbgstr_w(info.lpszProxyBypass));
4749 GlobalFree( info.lpszProxy );
4750 GlobalFree( info.lpszProxyBypass );
4751 }
4753}
BOOL WINAPI WinHttpGetProxyForUrl(HINTERNET hsession, LPCWSTR url, WINHTTP_AUTOPROXY_OPTIONS *options, WINHTTP_PROXY_INFO *info)
Definition: session.c:1892
static const WCHAR emptyW[]
Definition: navigate.c:40
#define WINHTTP_AUTOPROXY_AUTO_DETECT
Definition: winhttp.h:530
#define WINHTTP_AUTOPROXY_CONFIG_URL
Definition: winhttp.h:531

Referenced by START_TEST().

◆ test_WinHttpOpenRequest()

static void test_WinHttpOpenRequest ( void  )
static

Definition at line 270 of file winhttp.c.

271{
272 BOOL ret;
273 HINTERNET session, request, connection;
274 DWORD err;
275
276 SetLastError(0xdeadbeef);
279 err = GetLastError();
280 ok(session != NULL, "WinHttpOpen failed to open session.\n");
281 ok(err == ERROR_SUCCESS, "got %u\n", err);
282
283 /* Test with a bad server name */
284 SetLastError(0xdeadbeef);
286 err = GetLastError();
287 ok (connection == NULL, "WinHttpConnect succeeded in opening connection to NULL server argument.\n");
288 ok(err == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u.\n", err);
289
290 /* Test with a valid server name */
291 SetLastError(0xdeadbeef);
293 err = GetLastError();
294 ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", err);
295 ok(err == ERROR_SUCCESS || broken(err == WSAEINVAL) /* < win7 */, "got %u\n", err);
296
297 SetLastError(0xdeadbeef);
300 err = GetLastError();
302 {
303 skip("Network unreachable, skipping.\n");
304 goto done;
305 }
306 ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", err);
307 ok(err == ERROR_SUCCESS, "got %u\n", err);
308
309 SetLastError(0xdeadbeef);
311 err = GetLastError();
313 {
314 skip("Connection failed, skipping.\n");
315 goto done;
316 }
317 ok(ret, "WinHttpSendRequest failed: %u\n", err);
318 ok(err == ERROR_SUCCESS, "got %u\n", err);
319
320 SetLastError(0xdeadbeef);
322 err = GetLastError();
323 ok(ret, "WinHttpCloseHandle failed on closing request, got %u.\n", err);
324 ok(err == ERROR_SUCCESS, "got %u\n", err);
325
326 done:
327 ret = WinHttpCloseHandle(connection);
328 ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
330 ok(ret == TRUE, "WinHttpCloseHandle failed on closing session, got %d.\n", ret);
331
332}
#define WSAEINVAL
Definition: winerror.h:1946

Referenced by START_TEST().

◆ test_WinHttpQueryOption()

static void test_WinHttpQueryOption ( void  )
static

Definition at line 84 of file winhttp.c.

85{
86 BOOL ret;
87 HINTERNET session, request, connection;
89
90 SetLastError(0xdeadbeef);
91 session = WinHttpOpen(test_useragent, 0, 0, 0, 0);
92 ok(session != NULL, "WinHttpOpen failed to open session, error %u\n", GetLastError());
93
94 SetLastError(0xdeadbeef);
96 ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
98 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
99
100 size = 0xdeadbeef;
101 SetLastError(0xdeadbeef);
103 ok(!ret, "should fail to query option\n");
105 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
106 ok(size == 4, "expected 4, got %u\n", size);
107
108 feature = 0xdeadbeef;
109 size = sizeof(feature) - 1;
110 SetLastError(0xdeadbeef);
112 ok(!ret, "should fail to query option\n");
114 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
115 ok(size == 4, "expected 4, got %u\n", size);
116
117 feature = 0xdeadbeef;
118 size = sizeof(feature) + 1;
119 SetLastError(0xdeadbeef);
121 ok(ret, "failed to query option %u\n", GetLastError());
122 ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == 0xdeadbeef) /* < win7 */,
123 "got %u\n", GetLastError());
124 ok(size == sizeof(feature), "WinHttpQueryOption should set the size: %u\n", size);
126 "expected WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, got %#x\n", feature);
127
128 SetLastError(0xdeadbeef);
130 ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
132 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
133
135 SetLastError(0xdeadbeef);
137 ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
139 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
140
142 SetLastError(0xdeadbeef);
144 ok(!ret, "should fail to set redirect policy %u\n", GetLastError());
146 "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError());
147
149 SetLastError(0xdeadbeef);
151 ok(ret, "failed to set redirect policy %u\n", GetLastError());
152
153 feature = 0xdeadbeef;
154 size = sizeof(feature);
155 SetLastError(0xdeadbeef);
157 ok(ret, "failed to query option %u\n", GetLastError());
159 "expected WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS, got %#x\n", feature);
160
162 SetLastError(0xdeadbeef);
164 ok(!ret, "should fail to set disable feature for a session\n");
166 "expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError());
167
168 SetLastError(0xdeadbeef);
170 ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u\n", GetLastError());
171
173 SetLastError(0xdeadbeef);
175 ok(!ret, "should fail to set disable feature for a connection\n");
177 "expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError());
178
179 SetLastError(0xdeadbeef);
183 {
184 skip("Network unreachable, skipping the test\n");
185 goto done;
186 }
187
188 feature = 0xdeadbeef;
189 size = sizeof(feature);
190 SetLastError(0xdeadbeef);
192 ok(!ret, "should fail to query disable feature for a request\n");
194 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
195
196 feature = 0;
197 size = sizeof(feature);
198 SetLastError(0xdeadbeef);
200 ok(ret, "failed to set feature %u\n", GetLastError());
201
202 feature = 0xffffffff;
203 size = sizeof(feature);
204 SetLastError(0xdeadbeef);
206 ok(ret, "failed to set feature %u\n", GetLastError());
207
209 size = sizeof(feature);
210 SetLastError(0xdeadbeef);
212 ok(ret, "failed to set feature %u\n", GetLastError());
213
214 size = 0;
215 SetLastError(0xdeadbeef);
217 ok(!ret, "should fail to query disable feature for a request\n");
219 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
220
221 feature = 0xdeadbeef;
222 size = sizeof(feature);
223 SetLastError(0xdeadbeef);
225 ok(!ret, "should fail to query enabled features for a request\n");
226 ok(feature == 0xdeadbeef, "expect feature 0xdeadbeef, got %u\n", feature);
227 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
228
230 SetLastError(0xdeadbeef);
232 ok(!ret, "should fail to enable WINHTTP_ENABLE_SSL_REVOCATION with invalid parameters\n");
233 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
234
235 SetLastError(0xdeadbeef);
237 ok(!ret, "should fail to enable WINHTTP_ENABLE_SSL_REVOCATION with invalid parameters\n");
238 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
239
240 SetLastError(0xdeadbeef);
242 ok(ret, "failed to set feature\n");
243 ok(GetLastError() == NO_ERROR || broken(GetLastError() == 0xdeadbeef), /* Doesn't set error code on Vista or older */
244 "expected NO_ERROR, got %u\n", GetLastError());
245
246 feature = 0xdeadbeef;
247 SetLastError(0xdeadbeef);
249 ok(!ret, "should fail to enable WINHTTP_ENABLE_SSL_REVOCATION with invalid parameters\n");
250 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
251
252 feature = 6;
253 size = sizeof(feature);
255 ok(ret, "failed to set WINHTTP_OPTION_CONNECT_RETRIES %u\n", GetLastError());
256
257 SetLastError(0xdeadbeef);
259 ok(ret, "WinHttpCloseHandle failed on closing request: %u\n", GetLastError());
260
261done:
262 SetLastError(0xdeadbeef);
263 ret = WinHttpCloseHandle(connection);
264 ok(ret, "WinHttpCloseHandle failed on closing connection: %u\n", GetLastError());
265 SetLastError(0xdeadbeef);
267 ok(ret, "WinHttpCloseHandle failed on closing session: %u\n", GetLastError());
268}
#define NO_ERROR
Definition: dderror.h:5
INTERNETFEATURELIST feature
Definition: misc.c:1719
#define WINHTTP_OPTION_ENABLE_FEATURE
Definition: winhttp.h:122
#define WINHTTP_OPTION_DISABLE_FEATURE
Definition: winhttp.h:116
#define WINHTTP_ENABLE_SSL_REVOCATION
Definition: winhttp.h:172
#define WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP
Definition: winhttp.h:158
#define WINHTTP_OPTION_CONNECT_RETRIES
Definition: winhttp.h:97
#define WINHTTP_DISABLE_COOKIES
Definition: winhttp.h:168

Referenced by START_TEST().

◆ test_WinHttpSendRequest()

static void test_WinHttpSendRequest ( void  )
static

Definition at line 365 of file winhttp.c.

366{
367 static const WCHAR content_type[] =
368 {'C','o','n','t','e','n','t','-','T','y','p','e',':',' ','a','p','p','l','i','c','a','t','i','o','n',
369 '/','x','-','w','w','w','-','f','o','r','m','-','u','r','l','e','n','c','o','d','e','d',0};
370 static const WCHAR test_file[] = {'t','e','s','t','s','/','p','o','s','t','.','p','h','p',0};
371 static const WCHAR postW[] = {'P','O','S','T',0};
372 static CHAR post_data[] = "mode=Test";
373 static const char test_post[] = "mode => Test\0\n";
374 HINTERNET session, request, connection;
375 DWORD header_len, optional_len, total_len, bytes_rw, size, err, disable, len;
377 BOOL ret;
378 CHAR buffer[256];
379 WCHAR method[8];
380 int i;
381
382 header_len = -1L;
383 total_len = optional_len = sizeof(post_data);
384 memset(buffer, 0xff, sizeof(buffer));
385
388 ok(session != NULL, "WinHttpOpen failed to open session.\n");
389
391 ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
392
396 {
397 skip("Network unreachable, skipping.\n");
398 goto done;
399 }
400 ok(request != NULL, "WinHttpOpenrequest failed to open a request, error: %u.\n", GetLastError());
401 if (!request) goto done;
402
403 method[0] = 0;
404 len = sizeof(method);
406 ok(ret, "got %u\n", GetLastError());
407 ok(len == lstrlenW(postW) * sizeof(WCHAR), "got %u\n", len);
408 ok(!lstrcmpW(method, postW), "got %s\n", wine_dbgstr_w(method));
409
410 context = 0xdeadbeef;
412 ok(ret, "WinHttpSetOption failed: %u\n", GetLastError());
413
414 /* writing more data than promised by the content-length header causes an error when the connection
415 is resued, so disable keep-alive */
418 ok(ret, "WinHttpSetOption failed: %u\n", GetLastError());
419
420 context++;
421 ret = WinHttpSendRequest(request, content_type, header_len, post_data, optional_len, total_len, context);
422 err = GetLastError();
424 {
425 skip("connection failed, skipping\n");
426 goto done;
427 }
428 ok(ret == TRUE, "WinHttpSendRequest failed: %u\n", GetLastError());
429
430 context = 0;
431 size = sizeof(context);
433 ok(ret, "WinHttpQueryOption failed: %u\n", GetLastError());
434 ok(context == 0xdeadbef0, "expected 0xdeadbef0, got %lx\n", context);
435
436 for (i = 3; post_data[i]; i++)
437 {
438 bytes_rw = -1;
439 SetLastError(0xdeadbeef);
440 ret = WinHttpWriteData(request, &post_data[i], 1, &bytes_rw);
441 if (ret)
442 {
443 ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %u.\n", GetLastError());
444 ok(bytes_rw == 1, "WinHttpWriteData failed, wrote %u bytes instead of 1 byte.\n", bytes_rw);
445 }
446 else /* Since we already passed all optional data in WinHttpSendRequest Win7 fails our WinHttpWriteData call */
447 {
448 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER got %u.\n", GetLastError());
449 ok(bytes_rw == -1, "Expected bytes_rw to remain unchanged.\n");
450 }
451 }
452
453 SetLastError(0xdeadbeef);
456 "Expected ERROR_SUCCESS got %u.\n", GetLastError());
457 ok(ret == TRUE, "WinHttpReceiveResponse failed: %u.\n", GetLastError());
458
459 SetLastError(0xdeadbeef);
462
463 SetLastError(0xdeadbeef);
465 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got %u\n", GetLastError());
466
467 bytes_rw = -1;
468 ret = WinHttpReadData(request, buffer, sizeof(buffer) - 1, &bytes_rw);
469 ok(ret == TRUE, "WinHttpReadData failed: %u.\n", GetLastError());
470
471 ok(bytes_rw == sizeof(test_post) - 1, "Read %u bytes\n", bytes_rw);
472 ok(!memcmp(buffer, test_post, sizeof(test_post) - 1), "Data read did not match.\n");
473
474 done:
476 ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
477 ret = WinHttpCloseHandle(connection);
478 ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
480 ok(ret == TRUE, "WinHttpCloseHandle failed on closing session, got %d.\n", ret);
481}
static BSTR content_type
static const CHAR post_data[]
Definition: protocol.c:217
int disable
Definition: msacm.c:1365
BOOL WINAPI WinHttpWriteData(HINTERNET hrequest, LPCVOID buffer, DWORD to_write, LPDWORD written)
Definition: request.c:3125
Definition: http.c:7252
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define WINHTTP_OPTION_CONTEXT_VALUE
Definition: winhttp.h:112
#define WINHTTP_DISABLE_KEEP_ALIVE
Definition: winhttp.h:171
#define WINHTTP_QUERY_ORIG_URI
Definition: winhttp.h:332
#define WINHTTP_QUERY_MAX
Definition: winhttp.h:373
#define WINHTTP_QUERY_REQUEST_METHOD
Definition: winhttp.h:343
static const WCHAR postW[]
char CHAR
Definition: xmlstorage.h:175

Referenced by START_TEST().

◆ test_WinHttpTimeFromSystemTime()

static void test_WinHttpTimeFromSystemTime ( void  )
static

Definition at line 483 of file winhttp.c.

484{
485 BOOL ret;
486 static const SYSTEMTIME time = {2008, 7, 1, 28, 10, 5, 52, 0};
487 static const WCHAR expected_string[] =
488 {'M','o','n',',',' ','2','8',' ','J','u','l',' ','2','0','0','8',' ',
489 '1','0',':','0','5',':','5','2',' ','G','M','T',0};
490 WCHAR time_string[WINHTTP_TIME_FORMAT_BUFSIZE+1];
491 DWORD err;
492
493 SetLastError(0xdeadbeef);
495 err = GetLastError();
496 ok(!ret, "WinHttpTimeFromSystemTime succeeded\n");
497 ok(err == ERROR_INVALID_PARAMETER, "got %u\n", err);
498
499 SetLastError(0xdeadbeef);
500 ret = WinHttpTimeFromSystemTime(NULL, time_string);
501 err = GetLastError();
502 ok(!ret, "WinHttpTimeFromSystemTime succeeded\n");
503 ok(err == ERROR_INVALID_PARAMETER, "got %u\n", err);
504
505 SetLastError(0xdeadbeef);
506 ret = WinHttpTimeFromSystemTime(&time, time_string);
507 err = GetLastError();
508 ok(ret, "WinHttpTimeFromSystemTime failed: %u\n", err);
509 ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
510 ok(memcmp(time_string, expected_string, sizeof(expected_string)) == 0,
511 "Time string returned did not match expected time string.\n");
512}
__u16 time
Definition: mkdosfs.c:8

Referenced by START_TEST().

◆ test_WinHttpTimeToSystemTime()

static void test_WinHttpTimeToSystemTime ( void  )
static

Definition at line 514 of file winhttp.c.

515{
516 BOOL ret;
518 static const SYSTEMTIME expected_time = {2008, 7, 1, 28, 10, 5, 52, 0};
519 static const WCHAR time_string1[] =
520 {'M','o','n',',',' ','2','8',' ','J','u','l',' ','2','0','0','8',' ',
521 + '1','0',':','0','5',':','5','2',' ','G','M','T','\n',0};
522 static const WCHAR time_string2[] =
523 {' ','m','o','n',' ','2','8',' ','j','u','l',' ','2','0','0','8',' ',
524 '1','0',' ','0','5',' ','5','2','\n',0};
525 DWORD err;
526
527 SetLastError(0xdeadbeef);
528 ret = WinHttpTimeToSystemTime(time_string1, NULL);
529 err = GetLastError();
530 ok(!ret, "WinHttpTimeToSystemTime succeeded\n");
531 ok(err == ERROR_INVALID_PARAMETER, "got %u\n", err);
532
533 SetLastError(0xdeadbeef);
535 err = GetLastError();
536 ok(!ret, "WinHttpTimeToSystemTime succeeded\n");
537 ok(err == ERROR_INVALID_PARAMETER, "got %u\n", err);
538
539 SetLastError(0xdeadbeef);
540 ret = WinHttpTimeToSystemTime(time_string1, &time);
541 err = GetLastError();
542 ok(ret, "WinHttpTimeToSystemTime failed: %u\n", err);
543 ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
544 ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0,
545 "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n");
546
547 SetLastError(0xdeadbeef);
548 ret = WinHttpTimeToSystemTime(time_string2, &time);
549 err = GetLastError();
550 ok(ret, "WinHttpTimeToSystemTime failed: %u\n", err);
551 ok(err == ERROR_SUCCESS || broken(err == 0xdeadbeef) /* < win7 */, "got %u\n", err);
552 ok(memcmp(&time, &expected_time, sizeof(SYSTEMTIME)) == 0,
553 "Returned SYSTEMTIME structure did not match expected SYSTEMTIME structure.\n");
554}
BOOL WINAPI WinHttpTimeToSystemTime(LPCWSTR string, SYSTEMTIME *time)
Definition: session.c:2188

Referenced by START_TEST().

Variable Documentation

◆ auth_unseen

const char auth_unseen[] = "Auth Unseen"
static

Definition at line 2261 of file winhttp.c.

Referenced by server_thread().

◆ Connections

const WCHAR Connections[]
static
Initial value:
= {
'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 }

Definition at line 1299 of file winhttp.c.

Referenced by get_default_proxy_reg_value(), and set_proxy().

◆ cookiemsg

const char cookiemsg[]
static
Initial value:
=
"HTTP/1.1 200 OK\r\n"
"Set-Cookie: name = value \r\n"
"Set-Cookie: NAME = value \r\n"
"\r\n"

Definition at line 2191 of file winhttp.c.

Referenced by server_thread().

◆ cookiemsg2

const char cookiemsg2[]
static
Initial value:
=
"HTTP/1.1 200 OK\r\n"
"Set-Cookie: name2=value; Domain = localhost; Path=/cookie5;Expires=Wed, 13 Jan 2021 22:23:01 GMT; HttpOnly; \r\n"
"\r\n"

Definition at line 2197 of file winhttp.c.

Referenced by server_thread().

◆ headmsg

const char headmsg[]
static
Initial value:
=
"HTTP/1.1 200 OK\r\n"
"Content-Length: 100\r\n"
"\r\n"

Definition at line 2228 of file winhttp.c.

Referenced by server_thread().

◆ hello_world

const char hello_world[] = "Hello World"
static

Definition at line 2260 of file winhttp.c.

Referenced by server_thread(), and test_basic_authentication().

◆ largeauth

const char largeauth[]
static
Initial value:
=
"HTTP/1.1 401 Unauthorized\r\n"
"Server: winetest\r\n"
"WWW-Authenticate: Basic realm=\"placebo\"\r\n"
"WWW-Authenticate: NTLM\r\n"
"Content-Length: 10240\r\n"
"Content-Type: text/plain\r\n"
"\r\n"

Definition at line 2243 of file winhttp.c.

Referenced by server_thread().

◆ localhostW

◆ multiauth

const char multiauth[]
static
Initial value:
=
"HTTP/1.1 401 Unauthorized\r\n"
"Server: winetest\r\n"
"WWW-Authenticate: Bearer\r\n"
"WWW-Authenticate: Basic realm=\"placebo\"\r\n"
"WWW-Authenticate: NTLM\r\n"
"Content-Length: 10\r\n"
"Content-Type: text/plain\r\n"
"\r\n"

Definition at line 2233 of file winhttp.c.

Referenced by server_thread().

◆ noauthmsg

const char noauthmsg[]
static
Initial value:
=
"HTTP/1.1 401 Unauthorized\r\n"
"Server: winetest\r\n"
"Connection: close\r\n"
"WWW-Authenticate: Basic realm=\"placebo\"\r\n"
"Content-Length: 12\r\n"
"Content-Type: text/plain\r\n"
"\r\n"

Definition at line 2211 of file winhttp.c.

Referenced by server_thread().

◆ nocontentmsg

const char nocontentmsg[]
static
Initial value:
=
"HTTP/1.1 204 No Content\r\n"
"Server: winetest\r\n"
"\r\n"

Definition at line 2202 of file winhttp.c.

Referenced by server_thread().

◆ notmodified

const char notmodified[]
static
Initial value:
=
"HTTP/1.1 304 Not Modified\r\n"
"\r\n"

Definition at line 2207 of file winhttp.c.

Referenced by server_thread().

◆ notokmsg

const char notokmsg[]
static
Initial value:
=
"HTTP/1.1 400 Bad Request\r\n"
"\r\n"

Definition at line 2187 of file winhttp.c.

Referenced by server_thread().

◆ okauthmsg

const char okauthmsg[]
static
Initial value:
=
"HTTP/1.1 200 OK\r\n"
"Server: winetest\r\n"
"Connection: close\r\n"
"Content-Length: 11\r\n"
"Content-Type: text/plain\r\n"
"\r\n"

Definition at line 2220 of file winhttp.c.

Referenced by server_thread().

◆ okmsg

const char okmsg[]
static
Initial value:
=
"HTTP/1.1 200 OK\r\n"
"Server: winetest\r\n"
"\r\n"

Definition at line 2182 of file winhttp.c.

Referenced by server_thread().

◆ page1

const char page1[]
static
Initial value:
=
"<HTML>\r\n"
"<HEAD><TITLE>winhttp test page</TITLE></HEAD>\r\n"
"<BODY>The quick brown fox jumped over the lazy dog<P></BODY>\r\n"
"</HTML>\r\n\r\n"

Definition at line 2176 of file winhttp.c.

Referenced by server_thread(), and test_basic_request().

◆ passportauth

const char passportauth[]
static
Initial value:
=
"HTTP/1.1 302 Found\r\n"
"Content-Length: 0\r\n"
"Location: /\r\n"
"WWW-Authenticate: Passport1.4\r\n"
"\r\n"

Definition at line 2252 of file winhttp.c.

Referenced by server_thread().

◆ test_useragent

◆ test_winehq

◆ test_winehq_https

const WCHAR test_winehq_https[] = {'h','t','t','p','s',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',':','4','4','3',0}
static

Definition at line 43 of file winhttp.c.

Referenced by test_IWinHttpRequest().

◆ unauthorized

const char unauthorized[] = "Unauthorized"
static

Definition at line 2259 of file winhttp.c.

Referenced by server_thread(), and test_basic_authentication().

◆ WinHttpSettings

const WCHAR WinHttpSettings[]
static
Initial value:
= {
'W','i','n','H','t','t','p','S','e','t','t','i','n','g','s',0 }

Definition at line 1306 of file winhttp.c.

Referenced by get_default_proxy_reg_value(), and set_proxy().