Owen Rudge : winhttp: Implement WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS.
Alexandre Julliard
julliard at winehq.org
Fri Jul 3 14:36:17 CDT 2020
Module: wine
Branch: master
Commit: 5042687d012c351d394b4374ecc25f64059900da
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5042687d012c351d394b4374ecc25f64059900da
Author: Owen Rudge <orudge at codeweavers.com>
Date: Fri Jul 3 10:21:40 2020 +0100
winhttp: Implement WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS.
Signed-off-by: Owen Rudge <orudge at codeweavers.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winhttp/request.c | 2 ++
dlls/winhttp/session.c | 17 +++++++++++++++++
dlls/winhttp/tests/winhttp.c | 6 +++---
dlls/winhttp/winhttp_private.h | 2 ++
4 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index e31803ccfe..31296cd02b 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -2720,6 +2720,8 @@ static DWORD receive_response( struct request *request, BOOL async )
if (request->hdr.disable_flags & WINHTTP_DISABLE_REDIRECTS ||
request->hdr.redirect_policy == WINHTTP_OPTION_REDIRECT_POLICY_NEVER) break;
+ if (++request->redirect_count > request->max_redirects) return ERROR_WINHTTP_REDIRECT_FAILED;
+
if ((ret = handle_redirect( request, status ))) break;
/* recurse synchronously */
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index 080837eb1e..319066db55 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -820,6 +820,11 @@ static BOOL request_query_option( struct object_header *hdr, DWORD option, void
str_to_buffer( buffer, request->connect->session->proxy_password, buflen );
return TRUE;
+ case WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS:
+ *(DWORD *)buffer = request->max_redirects;
+ *buflen = sizeof(DWORD);
+ return TRUE;
+
default:
FIXME("unimplemented option %u\n", option);
SetLastError( ERROR_INVALID_PARAMETER );
@@ -1028,6 +1033,17 @@ static BOOL request_set_option( struct object_header *hdr, DWORD option, void *b
FIXME("WINHTTP_OPTION_CONNECT_RETRIES\n");
return TRUE;
+ case WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS:
+ if (buflen == sizeof(DWORD))
+ {
+ request->max_redirects = *(DWORD *)buffer;
+ SetLastError(NO_ERROR);
+ return TRUE;
+ }
+
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+
default:
FIXME("unimplemented option %u\n", option);
SetLastError( ERROR_WINHTTP_INVALID_OPTION );
@@ -1121,6 +1137,7 @@ HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR o
request->send_timeout = connect->session->send_timeout;
request->receive_timeout = connect->session->receive_timeout;
request->receive_response_timeout = connect->session->receive_response_timeout;
+ request->max_redirects = 10;
if (!verb || !verb[0]) verb = L"GET";
if (!(request->verb = strdupW( verb ))) goto end;
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index 79d700d4a1..5379640d5f 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -5102,7 +5102,7 @@ static void test_max_http_automatic_redirects (void)
max_redirects = 2;
ret = WinHttpSetOption(request, WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS, &max_redirects, sizeof(max_redirects));
- todo_wine ok(ret, "WinHttpSetOption failed: %u\n", GetLastError());
+ ok(ret, "WinHttpSetOption failed: %u\n", GetLastError());
ret = WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
err = GetLastError();
@@ -5115,8 +5115,8 @@ static void test_max_http_automatic_redirects (void)
SetLastError(0xdeadbeef);
ret = WinHttpReceiveResponse(request, NULL);
- todo_wine ok(!ret, "WinHttpReceiveResponse succeeded, expected failure\n");
- todo_wine ok(GetLastError() == ERROR_WINHTTP_REDIRECT_FAILED, "Expected ERROR_WINHTTP_REDIRECT_FAILED, got %u.\n", GetLastError());
+ ok(!ret, "WinHttpReceiveResponse succeeded, expected failure\n");
+ ok(GetLastError() == ERROR_WINHTTP_REDIRECT_FAILED, "Expected ERROR_WINHTTP_REDIRECT_FAILED, got %u.\n", GetLastError());
done:
ret = WinHttpCloseHandle(request);
diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h
index 23aba00780..e279e58a5f 100644
--- a/dlls/winhttp/winhttp_private.h
+++ b/dlls/winhttp/winhttp_private.h
@@ -189,6 +189,8 @@ struct request
int send_timeout;
int receive_timeout;
int receive_response_timeout;
+ DWORD max_redirects;
+ DWORD redirect_count; /* total number of redirects during this request */
WCHAR *status_text;
DWORD content_length; /* total number of bytes to be read */
DWORD content_read; /* bytes read so far */
More information about the wine-cvs
mailing list