Zebediah Figura : winhttp: Allow custom headers to be separated by any sequence of \r and \n.
Alexandre Julliard
julliard at winehq.org
Wed Aug 10 14:53:20 CDT 2022
Module: wine
Branch: master
Commit: 57955c735bdbb4a58878cca6f399483a32502780
URL: https://gitlab.winehq.org/wine/wine/-/commit/57955c735bdbb4a58878cca6f399483a32502780
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Tue Aug 9 17:53:20 2022 -0500
winhttp: Allow custom headers to be separated by any sequence of \r and \n.
This fixes connecting to multiplayer game servers in Riptide GP: Renegade.
---
dlls/winhttp/request.c | 26 +++++++-------------------
dlls/winhttp/tests/winhttp.c | 15 ++++++---------
2 files changed, 13 insertions(+), 28 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index ece4e34f0b8..2331c30b58c 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -467,26 +467,14 @@ DWORD add_request_headers( struct request *request, const WCHAR *headers, DWORD
p = buffer;
do
{
- q = p;
- while (*q)
- {
- if (q[0] == '\n' && q[1] == '\r')
- {
- q[0] = '\r';
- q[1] = '\n';
- }
- if (q[0] == '\r') break;
- q++;
- }
if (!*p) break;
- if (*q == '\r')
- {
- *q = 0;
- if (q[1] == '\n')
- q += 2; /* jump over \r\n */
- else
- q++; /* jump over \r */
- }
+
+ for (q = p; *q && *q != '\r' && *q != '\n'; ++q)
+ ;
+ *q++ = 0;
+ while (*q == '\r' || *q == '\n')
+ ++q;
+
if ((header = parse_header( p )))
{
ret = process_header( request, header->field, header->value, flags, TRUE );
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index 4e03a3752fd..17720611547 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -2532,8 +2532,8 @@ static DWORD CALLBACK server_thread(LPVOID param)
if (strstr(buffer, "POST /bad_headers"))
{
ok(!!strstr(buffer, "Content-Type: text/html\r\n"), "Header missing from request %s.\n", debugstr_a(buffer));
- todo_wine ok(!!strstr(buffer, "Test1: Value1\r\n"), "Header missing from request %s.\n", debugstr_a(buffer));
- todo_wine ok(!!strstr(buffer, "Test2: Value2\r\n"), "Header missing from request %s.\n", debugstr_a(buffer));
+ ok(!!strstr(buffer, "Test1: Value1\r\n"), "Header missing from request %s.\n", debugstr_a(buffer));
+ ok(!!strstr(buffer, "Test2: Value2\r\n"), "Header missing from request %s.\n", debugstr_a(buffer));
ok(!!strstr(buffer, "Test3: Value3\r\n"), "Header missing from request %s.\n", debugstr_a(buffer));
ok(!!strstr(buffer, "Test4: Value4\r\n"), "Header missing from request %s.\n", debugstr_a(buffer));
ok(!!strstr(buffer, "Test5: Value5\r\n"), "Header missing from request %s.\n", debugstr_a(buffer));
@@ -3654,13 +3654,10 @@ static void test_bad_header( int port )
len = sizeof(buffer);
ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS,
header_tests[i].header, buffer, &len, &index );
- todo_wine_if (i >= 1 && i <= 3)
- {
- ok( ret, "header %s: failed to query headers %lu\n", debugstr_w(header_tests[i].header), GetLastError() );
- ok( !wcscmp( buffer, header_tests[i].value ), "header %s: got %s\n",
- debugstr_w(header_tests[i].header), debugstr_w(buffer) );
- ok( index == 1, "header %s: index = %lu\n", debugstr_w(header_tests[i].header), index );
- }
+ ok( ret, "header %s: failed to query headers %lu\n", debugstr_w(header_tests[i].header), GetLastError() );
+ ok( !wcscmp( buffer, header_tests[i].value ), "header %s: got %s\n",
+ debugstr_w(header_tests[i].header), debugstr_w(buffer) );
+ ok( index == 1, "header %s: index = %lu\n", debugstr_w(header_tests[i].header), index );
}
ret = WinHttpSendRequest( req, L"Test5: Value5\rTest6: Value6", ~0u, NULL, 0, 0, 0 );
More information about the wine-cvs
mailing list