Thomas Mullaly : urlmon: Added support for pre-processing URI strings.

Alexandre Julliard julliard at winehq.org
Tue Aug 17 11:31:14 CDT 2010


Module: wine
Branch: master
Commit: b3ad7469d0b94cd3e226063202f8a460174add70
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b3ad7469d0b94cd3e226063202f8a460174add70

Author: Thomas Mullaly <thomas.mullaly at gmail.com>
Date:   Sun Aug  1 16:17:58 2010 -0400

urlmon: Added support for pre-processing URI strings.

---

 dlls/urlmon/tests/uri.c |  121 ++++++++++++++++++++++++++++++++++++++++++++++-
 dlls/urlmon/uri.c       |   47 +++++++++++++++++-
 2 files changed, 165 insertions(+), 3 deletions(-)

diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c
index 98c328a..bae4c33 100644
--- a/dlls/urlmon/tests/uri.c
+++ b/dlls/urlmon/tests/uri.c
@@ -3430,6 +3430,123 @@ static const uri_properties uri_tests[] = {
             {URL_SCHEME_HTTP,S_OK,FALSE},
             {URLZONE_INVALID,E_NOTIMPL,FALSE},
         }
+    },
+    /* Leading/Trailing whitespace is removed. */
+    {   "    http://google.com/     ", 0, S_OK, FALSE,
+        Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
+        Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
+        Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
+        FALSE,
+        {
+            {"http://google.com/",S_OK,FALSE},
+            {"google.com",S_OK,FALSE},
+            {"http://google.com/",S_OK,FALSE},
+            {"google.com",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"google.com",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"/",S_OK,FALSE},
+            {"/",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"http://google.com/",S_OK,FALSE},
+            {"http",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE}
+        },
+        {
+            {Uri_HOST_DNS,S_OK,FALSE},
+            {80,S_OK,FALSE},
+            {URL_SCHEME_HTTP,S_OK,FALSE},
+            {URLZONE_INVALID,E_NOTIMPL,FALSE}
+        }
+    },
+    {   "\t\t\r\nhttp\n://g\noogle.co\rm/\n\n\n", 0, S_OK, FALSE,
+        Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
+        Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
+        Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
+        FALSE,
+        {
+            {"http://google.com/",S_OK,FALSE},
+            {"google.com",S_OK,FALSE},
+            {"http://google.com/",S_OK,FALSE},
+            {"google.com",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"google.com",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"/",S_OK,FALSE},
+            {"/",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"http://google.com/",S_OK,FALSE},
+            {"http",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE}
+        },
+        {
+            {Uri_HOST_DNS,S_OK,FALSE},
+            {80,S_OK,FALSE},
+            {URL_SCHEME_HTTP,S_OK,FALSE},
+            {URLZONE_INVALID,E_NOTIMPL,FALSE}
+        }
+    },
+    {   "http://g\noogle.co\rm/\n\n\n", Uri_CREATE_NO_PRE_PROCESS_HTML_URI, S_OK, FALSE,
+        Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
+        Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
+        Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
+        FALSE,
+        {
+            {"http://g%0aoogle.co%0dm/%0A%0A%0A",S_OK,FALSE},
+            {"g%0aoogle.co%0dm",S_OK,FALSE},
+            {"http://g%0aoogle.co%0dm/%0A%0A%0A",S_OK,FALSE},
+            {"g%0aoogle.co%0dm",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"g%0aoogle.co%0dm",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"/%0A%0A%0A",S_OK,FALSE},
+            {"/%0A%0A%0A",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"http://g\noogle.co\rm/\n\n\n",S_OK,FALSE},
+            {"http",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE}
+        },
+        {
+            {Uri_HOST_DNS,S_OK,FALSE},
+            {80,S_OK,FALSE},
+            {URL_SCHEME_HTTP,S_OK,FALSE},
+            {URLZONE_INVALID,E_NOTIMPL,FALSE}
+        }
+    },
+    {   "zip://g\noogle.co\rm/\n\n\n", Uri_CREATE_NO_PRE_PROCESS_HTML_URI, S_OK, FALSE,
+        Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
+        Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|
+        Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
+        FALSE,
+        {
+            {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE},
+            {"g\noogle.co\rm",S_OK,FALSE},
+            {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE},
+            {"g\noogle.co\rm",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"g\noogle.co\rm",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"/\n\n\n",S_OK,FALSE},
+            {"/\n\n\n",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE},
+            {"zip",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE}
+        },
+        {
+            {Uri_HOST_DNS,S_OK,FALSE},
+            {0,S_FALSE,FALSE},
+            {URL_SCHEME_UNKNOWN,S_OK,FALSE},
+            {URLZONE_INVALID,E_NOTIMPL,FALSE}
+        }
     }
 };
 
@@ -3486,7 +3603,9 @@ static const invalid_uri invalid_uri_tests[] = {
     /* Known scheme types can't have invalid % encoded data in query string. */
     {"http://google.com/?query=te%xx",0,FALSE},
     /* Invalid % encoded data in fragment of know scheme type. */
-    {"ftp://google.com/#Test%xx",0,FALSE}
+    {"ftp://google.com/#Test%xx",0,FALSE},
+    {"  http://google.com/",Uri_CREATE_NO_PRE_PROCESS_HTML_URI,FALSE},
+    {"\n\nhttp://google.com/",Uri_CREATE_NO_PRE_PROCESS_HTML_URI,FALSE}
 };
 
 typedef struct _uri_equality {
diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c
index c4aa1b0..1c831c7 100644
--- a/dlls/urlmon/uri.c
+++ b/dlls/urlmon/uri.c
@@ -626,6 +626,45 @@ static void compute_elision_location(const ipv6_address *address, const USHORT v
     *count = max_len;
 }
 
+/* Removes all the leading and trailing white spaces or
+ * control characters from the URI and removes all control
+ * characters inside of the URI string.
+ */
+static BSTR pre_process_uri(LPCWSTR uri) {
+    BSTR ret;
+    DWORD len;
+    const WCHAR *start, *end;
+    WCHAR *buf, *ptr;
+
+    len = lstrlenW(uri);
+
+    start = uri;
+    /* Skip leading controls and whitespace. */
+    while(iscntrlW(*start) || isspaceW(*start)) ++start;
+
+    end = uri+len-1;
+    if(start == end)
+        /* URI consisted only of control/whitespace. */
+        ret = SysAllocStringLen(NULL, 0);
+    else {
+        while(iscntrlW(*end) || isspaceW(*end)) --end;
+
+        buf = heap_alloc(((end+1)-start)*sizeof(WCHAR));
+        if(!buf)
+            return NULL;
+
+        for(ptr = buf; start < end+1; ++start) {
+            if(!iscntrlW(*start))
+                *ptr++ = *start;
+        }
+
+        ret = SysAllocStringLen(buf, ptr-buf);
+        heap_free(buf);
+    }
+
+    return ret;
+}
+
 /* Converts the specified IPv4 address into an uint value.
  *
  * This function assumes that the IPv4 address has already been validated.
@@ -3729,8 +3768,12 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU
     ret->lpIUriVtbl = &UriVtbl;
     ret->ref = 1;
 
-    /* Create a copy of pwzURI and store it as the raw_uri. */
-    ret->raw_uri = SysAllocString(pwzURI);
+    /* Pre process the URI, unless told otherwise. */
+    if(!(dwFlags & Uri_CREATE_NO_PRE_PROCESS_HTML_URI))
+        ret->raw_uri = pre_process_uri(pwzURI);
+    else
+        ret->raw_uri = SysAllocString(pwzURI);
+
     if(!ret->raw_uri) {
         heap_free(ret);
         return E_OUTOFMEMORY;




More information about the wine-cvs mailing list