winhttp: Modify index only if query_headers succeeded.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2018-09-19 16:17:46 +02:00 committed by Alexandre Julliard
parent 2da49669f9
commit f76208879e
2 changed files with 39 additions and 3 deletions

View File

@ -766,7 +766,6 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
set_last_error( ERROR_WINHTTP_HEADER_NOT_FOUND );
return FALSE;
}
if (index) *index += 1;
if (level & WINHTTP_QUERY_FLAG_NUMBER)
{
if (!buffer || sizeof(int) > *buflen)
@ -813,6 +812,7 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID
}
*buflen = len;
}
if (ret && index) *index += 1;
return ret;
}
@ -902,7 +902,6 @@ static BOOL query_auth_schemes( request_t *request, DWORD level, LPDWORD support
query_headers( request, level, NULL, NULL, &size, &index );
if (get_last_error() != ERROR_INSUFFICIENT_BUFFER) break;
index--;
if (!(buffer = heap_alloc( size ))) return FALSE;
if (!query_headers( request, level, NULL, buffer, &size, &index ))
{

View File

@ -33,6 +33,7 @@
#include <httprequestid.h>
#include "wine/test.h"
#include "wine/heap.h"
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
@ -42,6 +43,22 @@ static const WCHAR test_winehq[] = {'t','e','s','t','.','w','i','n','e','h','q',
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 WCHAR *a2w(const char *str)
{
int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
WCHAR *ret = heap_alloc(len * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
return ret;
}
static int strcmp_wa(const WCHAR *str1, const char *stra)
{
WCHAR *str2 = a2w(stra);
int r = lstrcmpW(str1, str2);
heap_free(str2);
return r;
}
static BOOL proxy_active(void)
{
WINHTTP_PROXY_INFO proxy_info;
@ -2736,9 +2753,12 @@ static void test_basic_authentication(int port)
static void test_multi_authentication(int port)
{
static const WCHAR multiauthW[] = {'/','m','u','l','t','i','a','u','t','h',0};
static const WCHAR www_authenticateW[] =
{'W','W','W','-','A','u','t','h','e','n','t','i','c','a','t','e',0};
static const WCHAR getW[] = {'G','E','T',0};
HINTERNET ses, con, req;
DWORD supported, first, target;
DWORD supported, first, target, size, index;
WCHAR buf[512];
BOOL ret;
ses = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0);
@ -2764,6 +2784,22 @@ static void test_multi_authentication(int port)
ok(target == WINHTTP_AUTH_TARGET_SERVER, "got %x\n", target);
ok(first == WINHTTP_AUTH_SCHEME_BASIC, "got %x\n", first);
index = 0;
size = sizeof(buf);
ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_CUSTOM, www_authenticateW, buf, &size, &index);
ok(ret, "expected success\n");
ok(!strcmp_wa(buf, "Bearer"), "buf = %s\n", wine_dbgstr_w(buf));
ok(size == lstrlenW(buf) * sizeof(WCHAR), "size = %u\n", size);
ok(index == 1, "index = %u\n", index);
index = 0;
size = 0xdeadbeef;
ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_CUSTOM, www_authenticateW, NULL, &size, &index);
ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"WinHttpQueryHeaders returned %x(%u)\n", ret, GetLastError());
ok(size == (lstrlenW(buf) + 1) * sizeof(WCHAR), "size = %u\n", size);
ok(index == 0, "index = %u\n", index);
WinHttpCloseHandle(req);
WinHttpCloseHandle(con);
WinHttpCloseHandle(ses);
@ -3087,6 +3123,7 @@ static void test_bad_header( int port )
content_typeW, buffer, &len, &index );
ok( ret, "failed to query headers %u\n", GetLastError() );
ok( !lstrcmpW( buffer, text_htmlW ), "got %s\n", wine_dbgstr_w(buffer) );
ok( index == 1, "index = %u\n", index );
WinHttpCloseHandle( req );
WinHttpCloseHandle( con );