msxml3: Fix status text value parsing

Nikolay Sivov nsivov at codeweavers.com
Mon Jun 11 04:00:11 CDT 2012


The problem is that I can't parse backwards cause status text itself can 
contain spaces. This results in wrong text passed to application like 
"Found" instead of "Not Found".
-------------- next part --------------
>From 34abecd2e825b1933faacd2b600f26bb46059d15 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sun, 10 Jun 2012 00:48:09 +0400
Subject: [PATCH 4/5] Fix status text value parsing

---
 dlls/msxml3/httprequest.c |   35 ++++++++++++++++++-----------------
 1 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c
index 0abe2ff..ea5fb14 100644
--- a/dlls/msxml3/httprequest.c
+++ b/dlls/msxml3/httprequest.c
@@ -540,31 +540,32 @@ static HRESULT WINAPI BSCHttpNegotiate_OnResponse(IHttpNegotiate *iface, DWORD c
     This->request->status_text = NULL;
     if (resp_headers)
     {
-        const WCHAR *ptr, *line;
+        const WCHAR *ptr, *line, *status_text;
 
         ptr = line = resp_headers;
 
-        /* skip status line */
-        while (*ptr)
+        /* skip HTTP-Version */
+        ptr = strchrW(ptr, ' ');
+        if (ptr)
         {
-            if (*ptr == '\r' && *(ptr+1) == '\n')
+            /* skip Status-Code */
+            ptr = strchrW(++ptr, ' ');
+            if (ptr)
             {
-                const WCHAR *end = ptr-1;
-                line = ptr + 2;
-                /* scan back to get status phrase */
-                while (ptr > resp_headers)
+                status_text = ++ptr;
+                /* now it supposed to end with CRLF */
+                while (*ptr)
                 {
-                     if (*ptr == ' ')
-                     {
-                         This->request->status_text = SysAllocStringLen(ptr+1, end-ptr);
-                         TRACE("status text %s\n", debugstr_w(This->request->status_text));
-                         break;
-                     }
-                     ptr--;
+                    if (*ptr == '\r' && *(ptr+1) == '\n')
+                    {
+                        line = ptr + 2;
+                        This->request->status_text = SysAllocStringLen(status_text, ptr-status_text);
+                        TRACE("status text %s\n", debugstr_w(This->request->status_text));
+                        break;
+                    }
+                    ptr++;
                 }
-                break;
             }
-            ptr++;
         }
 
         /* store as unparsed string for now */
-- 
1.5.6.5



More information about the wine-patches mailing list