Module: wine Branch: master Commit: 5042687d012c351d394b4374ecc25f64059900da URL: https://source.winehq.org/git/wine.git/?a=commit;h=5042687d012c351d394b4374e...
Author: Owen Rudge orudge@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@codeweavers.com Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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 */