Module: wine Branch: master Commit: 93d79ee18ee6bd7ebda63dc8c0557fd62c042e1b URL: http://source.winehq.org/git/wine.git/?a=commit;h=93d79ee18ee6bd7ebda63dc8c0...
Author: Thomas Mullaly thomas.mullaly@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://%5B::ffff%5D:32xy%22,0,FALSE%7D, /* 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@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; }