Hans Leidekker : winhttp: Implement some more options.
Alexandre Julliard
julliard at winehq.org
Thu Sep 4 08:26:40 CDT 2008
Module: wine
Branch: master
Commit: e078f618eb7c05c3cbec915f69a1d69fd3b35bed
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e078f618eb7c05c3cbec915f69a1d69fd3b35bed
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Sep 3 16:58:06 2008 +0200
winhttp: Implement some more options.
---
dlls/winhttp/request.c | 4 +-
dlls/winhttp/session.c | 72 ++++++++++++++++++++++++++++++++++++++--
dlls/winhttp/tests/winhttp.c | 7 +++-
dlls/winhttp/winhttp_private.h | 3 ++
4 files changed, 80 insertions(+), 6 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 6bcfb87..be951c5 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -768,7 +768,7 @@ static BOOL send_request( request_t *request, LPCWSTR headers, DWORD headers_len
sprintfW( length, length_fmt, total_len );
process_header( request, attr_content_length, length, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW, TRUE );
}
- if (!(request->hdr.flags & WINHTTP_DISABLE_KEEP_ALIVE))
+ if (!(request->hdr.disable_flags & WINHTTP_DISABLE_KEEP_ALIVE))
{
process_header( request, attr_connection, keep_alive, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW, TRUE );
}
@@ -1097,7 +1097,7 @@ BOOL WINAPI WinHttpReceiveResponse( HINTERNET hrequest, LPVOID reserved )
if (status == 200) break;
if (status == 301 || status == 302)
{
- if (request->hdr.flags & WINHTTP_DISABLE_REDIRECTS) break;
+ if (request->hdr.disable_flags & WINHTTP_DISABLE_REDIRECTS) break;
drain_content( request );
if (!(ret = handle_redirect( request ))) break;
}
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index 4d855c3..d429fcb 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -69,11 +69,36 @@ static void session_destroy( object_header_t *hdr )
heap_free( session );
}
+static BOOL session_set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen )
+{
+ switch (option)
+ {
+ case WINHTTP_OPTION_PROXY:
+ {
+ WINHTTP_PROXY_INFO *pi = buffer;
+
+ FIXME("%u %s %s\n", pi->dwAccessType, debugstr_w(pi->lpszProxy), debugstr_w(pi->lpszProxyBypass));
+ return TRUE;
+ }
+ case WINHTTP_OPTION_REDIRECT_POLICY:
+ {
+ DWORD policy = *(DWORD *)buffer;
+
+ TRACE("0x%x\n", policy);
+ hdr->redirect_policy = policy;
+ return TRUE;
+ }
+ default:
+ FIXME("unimplemented option %u\n", option);
+ return TRUE;
+ }
+}
+
static const object_vtbl_t session_vtbl =
{
session_destroy,
NULL,
- NULL
+ session_set_option
};
/***********************************************************************
@@ -220,11 +245,52 @@ static void request_destroy( object_header_t *hdr )
heap_free( request );
}
+static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen )
+{
+ switch (option)
+ {
+ case WINHTTP_OPTION_PROXY:
+ {
+ WINHTTP_PROXY_INFO *pi = buffer;
+
+ FIXME("%u %s %s\n", pi->dwAccessType, debugstr_w(pi->lpszProxy), debugstr_w(pi->lpszProxyBypass));
+ return TRUE;
+ }
+ case WINHTTP_OPTION_DISABLE_FEATURE:
+ {
+ DWORD disable = *(DWORD *)buffer;
+
+ TRACE("0x%x\n", disable);
+ hdr->disable_flags &= disable;
+ return TRUE;
+ }
+ case WINHTTP_OPTION_AUTOLOGON_POLICY:
+ {
+ DWORD policy = *(DWORD *)buffer;
+
+ TRACE("0x%x\n", policy);
+ hdr->logon_policy = policy;
+ return TRUE;
+ }
+ case WINHTTP_OPTION_REDIRECT_POLICY:
+ {
+ DWORD policy = *(DWORD *)buffer;
+
+ TRACE("0x%x\n", policy);
+ hdr->redirect_policy = policy;
+ return TRUE;
+ }
+ default:
+ FIXME("unimplemented option %u\n", option);
+ return TRUE;
+ }
+}
+
static const object_vtbl_t request_vtbl =
{
request_destroy,
NULL,
- NULL
+ request_set_option
};
/***********************************************************************
@@ -350,7 +416,7 @@ BOOL WINAPI WinHttpQueryOption( HINTERNET handle, DWORD option, LPVOID buffer, L
static BOOL set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen )
{
- BOOL ret = FALSE;
+ BOOL ret = TRUE;
switch (option)
{
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index 5b3bd38..012d703 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -532,12 +532,16 @@ static void test_secure_connection(void)
static const WCHAR google[] = {'w','w','w','.','g','o','o','g','l','e','.','c','o','m',0};
HANDLE ses, con, req;
- DWORD size, status;
+ DWORD size, status, policy;
BOOL ret;
ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0);
ok(ses != NULL, "failed to open session %u\n", GetLastError());
+ policy = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS;
+ ret = WinHttpSetOption(ses, WINHTTP_OPTION_REDIRECT_POLICY, &policy, sizeof(policy));
+ ok(ret, "failed to set redirect policy %u\n", GetLastError());
+
con = WinHttpConnect(ses, google, 443, 0);
ok(con != NULL, "failed to open a connection %u\n", GetLastError());
@@ -569,6 +573,7 @@ static void test_secure_connection(void)
size = sizeof(status);
ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL);
ok(ret, "failed unexpectedly %u\n", GetLastError());
+ ok(status == 200, "request failed unexpectedly %u\n", status);
size = 0;
ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_RAW_HEADERS_CRLF, NULL, NULL, &size, NULL);
diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h
index 04dd7dc..9bf48d4 100644
--- a/dlls/winhttp/winhttp_private.h
+++ b/dlls/winhttp/winhttp_private.h
@@ -51,6 +51,9 @@ struct _object_header_t
HINTERNET handle;
const object_vtbl_t *vtbl;
DWORD flags;
+ DWORD disable_flags;
+ DWORD logon_policy;
+ DWORD redirect_policy;
DWORD error;
DWORD_PTR context;
LONG refs;
More information about the wine-cvs
mailing list