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