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