Module: wine Branch: master Commit: 8b3152cb5f0610d48827eb3ddb6fc5b4a7097424 URL: https://gitlab.winehq.org/wine/wine/-/commit/8b3152cb5f0610d48827eb3ddb6fc5b...
Author: Paul Gofman pgofman@codeweavers.com Date: Tue Jul 2 14:04:51 2024 -0600
winhttp: Skip trailing spaces in reply header names.
---
dlls/winhttp/request.c | 23 ++++++++++++++++------- dlls/winhttp/tests/winhttp.c | 8 ++++---- 2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index 2b8fa168947..b86ff0beb1e 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -303,9 +303,9 @@ static BOOL valid_token_char( WCHAR c ) } }
-static struct header *parse_header( const WCHAR *string, size_t string_len ) +static struct header *parse_header( const WCHAR *string, size_t string_len, BOOL reply ) { - const WCHAR *p, *q; + const WCHAR *p, *q, *name_end; struct header *header; int len;
@@ -315,12 +315,21 @@ static struct header *parse_header( const WCHAR *string, size_t string_len ) WARN("no ':' in line %s\n", debugstr_w(string)); return NULL; } - if (q == string) + name_end = q; + if (reply) + { + while (name_end != string) + { + if (name_end[-1] != ' ') break; + --name_end; + } + } + if (name_end == string) { WARN("empty field name in line %s\n", debugstr_w(string)); return NULL; } - while (*p != ':') + while (p != name_end) { if (!valid_token_char( *p )) { @@ -329,7 +338,7 @@ static struct header *parse_header( const WCHAR *string, size_t string_len ) } p++; } - len = q - string; + len = name_end - string; if (!(header = calloc( 1, sizeof(*header) ))) return NULL; if (!(header->field = malloc( (len + 1) * sizeof(WCHAR) ))) { @@ -491,7 +500,7 @@ DWORD add_request_headers( struct request *request, const WCHAR *headers, DWORD while (*q == '\r' || *q == '\n') ++q;
- if ((header = parse_header( p, end - p ))) + if ((header = parse_header( p, end - p, FALSE ))) { ret = process_header( request, header->field, header->value, flags, TRUE ); free_header( header ); @@ -2691,7 +2700,7 @@ static DWORD read_reply( struct request *request ) } lenW = MultiByteToWideChar( CP_ACP, 0, buffer, buflen, raw_headers + offset, buflen );
- if (!(header = parse_header( raw_headers + offset, lenW - 1 ))) break; + if (!(header = parse_header( raw_headers + offset, lenW - 1, TRUE ))) break; if ((ret = process_header( request, header->field, header->value, WINHTTP_ADDREQ_FLAG_ADD, FALSE ))) { free_header( header ); diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 5ca19aa8c8b..2252551f32c 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -3934,17 +3934,17 @@ static void test_bad_header( int port )
len = sizeof(buffer); ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_CUSTOM, L"OkHdr", buffer, &len, WINHTTP_NO_HEADER_INDEX ); - todo_wine ok( ret, "got error %lu.\n", GetLastError() ); + ok( ret, "got error %lu.\n", GetLastError() );
len = sizeof(buffer); ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, buffer, &len, WINHTTP_NO_HEADER_INDEX ); ok( ret, "got error %lu.\n", GetLastError() ); - todo_wine ok( !wcscmp( buffer, expected_headers ), "got %s.\n", debugstr_w(buffer) ); + ok( !wcscmp( buffer, expected_headers ), "got %s.\n", debugstr_w(buffer) );
len = sizeof(buffer); ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_CUSTOM, L"SpaceAfterHdr", buffer, &len, WINHTTP_NO_HEADER_INDEX ); - todo_wine ok( ret, "got error %lu.\n", GetLastError() ); - todo_wine ok( !wcscmp( buffer, L"bad" ), "got %s.\n", debugstr_w(buffer) ); + ok( ret, "got error %lu.\n", GetLastError() ); + ok( !wcscmp( buffer, L"bad" ), "got %s.\n", debugstr_w(buffer) );
WinHttpCloseHandle( req ); WinHttpCloseHandle( con );