Thomas Mullaly : urlmon: Implemented a path parser for opaque URIs.

Alexandre Julliard julliard at winehq.org
Tue Aug 3 13:10:32 CDT 2010


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

Author: Thomas Mullaly <thomas.mullaly at gmail.com>
Date:   Sun Jul 18 20:50:12 2010 -0400

urlmon: Implemented a path parser for opaque URIs.

---

 dlls/urlmon/tests/uri.c |   33 ++++++++++++++++++++++++++++++++-
 dlls/urlmon/uri.c       |   35 ++++++++++++++++++++++++++++++++++-
 2 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c
index 7cd11ff..acf6905 100644
--- a/dlls/urlmon/tests/uri.c
+++ b/dlls/urlmon/tests/uri.c
@@ -2245,6 +2245,34 @@ static const uri_properties uri_tests[] = {
             {URL_SCHEME_UNKNOWN,S_OK,FALSE},
             {URLZONE_INVALID,E_NOTIMPL,FALSE}
         }
+    },
+    {   "urn:excepts:bad:%XY:encoded", 0, S_OK, FALSE,
+        Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|
+        Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME,
+        TRUE,
+        {
+            {"urn:excepts:bad:%XY:encoded",S_OK,TRUE},
+            {"",S_FALSE,FALSE},
+            {"urn:excepts:bad:%XY:encoded",S_OK,TRUE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,TRUE},
+            {"",S_FALSE,TRUE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE},
+            {"excepts:bad:%XY:encoded",S_OK,TRUE},
+            {"excepts:bad:%XY:encoded",S_OK,TRUE},
+            {"",S_FALSE,TRUE},
+            {"urn:excepts:bad:%XY:encoded",S_OK,FALSE},
+            {"urn",S_OK,FALSE},
+            {"",S_FALSE,FALSE},
+            {"",S_FALSE,FALSE}
+        },
+        {
+            {Uri_HOST_UNKNOWN,S_OK,FALSE},
+            {0,S_FALSE,FALSE},
+            {URL_SCHEME_UNKNOWN,S_OK,FALSE},
+            {URLZONE_INVALID,E_NOTIMPL,FALSE}
+        }
     }
 };
 
@@ -2294,7 +2322,10 @@ static const invalid_uri invalid_uri_tests[] = {
     /* Invalid port with IPv6 address. */
     {"http://[::ffff]:32xy",0,FALSE},
     /* Not allowed to have backslashes with NO_CANONICALIZE. */
-    {"gopher://www.google.com\\test",Uri_CREATE_NO_CANONICALIZE,FALSE}
+    {"gopher://www.google.com\\test",Uri_CREATE_NO_CANONICALIZE,FALSE},
+    /* Not allowed to have invalid % encoded data in opaque URI path. */
+    {"news:test%XX",0,FALSE},
+    {"mailto:wine at winehq%G8.com",0,FALSE}
 };
 
 typedef struct _uri_equality {
diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c
index 9ab1dda..1b98b1a 100644
--- a/dlls/urlmon/uri.c
+++ b/dlls/urlmon/uri.c
@@ -1553,6 +1553,37 @@ static BOOL parse_path_hierarchical(const WCHAR **ptr, parse_data *data, DWORD f
     return TRUE;
 }
 
+/* Parses the path of a opaque URI (much less strict then the parser
+ * for a hierarchical URI).
+ *
+ * NOTE:
+ *  Windows allows invalid % encoded data to appear in opaque URI paths
+ *  for unknown scheme types.
+ */
+static BOOL parse_path_opaque(const WCHAR **ptr, parse_data *data, DWORD flags) {
+    const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN;
+
+    data->path = *ptr;
+
+    while(!is_path_delim(**ptr)) {
+        if(**ptr == '%' && known_scheme) {
+            if(!check_pct_encoded(ptr)) {
+                *ptr = data->path;
+                data->path = NULL;
+                return FALSE;
+            } else
+                continue;
+        }
+
+        ++(*ptr);
+    }
+
+    data->path_len = *ptr - data->path;
+    TRACE("(%p %p %x): Parsed opaque URI path %s len=%d\n", ptr, data, flags,
+        debugstr_wn(data->path, data->path_len), data->path_len);
+    return TRUE;
+}
+
 /* Determines how the URI should be parsed after the scheme information.
  *
  * If the scheme is followed, by "//" then, it is treated as an hierarchical URI
@@ -1615,7 +1646,9 @@ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) {
     TRACE("(%p %p %x): Treating URI as an opaque URI.\n", ptr, data, flags);
 
     data->is_opaque = TRUE;
-    /* TODO: Handle opaque URI's, parse path. */
+    if(!parse_path_opaque(ptr, data, flags))
+        return FALSE;
+
     return TRUE;
 }
 




More information about the wine-cvs mailing list