Module: wine Branch: master Commit: 8a6210d28fcea9b6b16a5b35b679dcf0623ea3f2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8a6210d28fcea9b6b16a5b35b6...
Author: Piotr Caban piotr@codeweavers.com Date: Tue Oct 26 23:27:59 2010 +0200
urlmon: Improved url canonicalize when Uri_CREATE_FILE_USE_DOS_PATH is specified.
---
dlls/urlmon/tests/uri.c | 29 +++++++++++++++++++++++++++++ dlls/urlmon/uri.c | 6 ++++-- 2 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c index 8045a27..93493a8 100644 --- a/dlls/urlmon/tests/uri.c +++ b/dlls/urlmon/tests/uri.c @@ -3744,6 +3744,35 @@ static const uri_properties uri_tests[] = { {URLZONE_INVALID,E_NOTIMPL,FALSE} } }, + /* Allow more characters when Uri_CREATE_FILE_USE_DOS_PATH is specified */ + { "file:///c:/dir%%61%20%5Fname/file%2A.html", Uri_CREATE_FILE_USE_DOS_PATH, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH + |Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE + |Uri_HAS_SCHEME, FALSE, + { + {"file://c:\dir%a _name\file*.html",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file://c:\dir%a _name\file*.html",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".html",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"c:\dir%a _name\file*.html",S_OK,FALSE}, + {"c:\dir%a _name\file*.html",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///c:/dir%%61%20%5Fname/file%2A.html",S_OK,FALSE}, + {"file",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {0,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_FILE,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, { "file://c|/dir\index.html", Uri_CREATE_FILE_USE_DOS_PATH, S_OK, FALSE, Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH |Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index 9f78e28..77d14cd 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -2870,6 +2870,7 @@ static BOOL canonicalize_authority(const parse_data *data, Uri *uri, DWORD flags * NOTES: * file://c:/test%20test -> file:///c:/test%2520test * file://c:/test%3Etest -> file:///c:/test%253Etest + * if Uri_CREATE_FILE_USE_DOS_PATH is not set: * file:///c:/test%20test -> file:///c:/test%20test * file:///c:/test%test -> file:///c:/test%25test */ @@ -2931,7 +2932,7 @@ static BOOL canonicalize_path_hierarchical(const parse_data *data, Uri *uri, WCHAR val;
/* Check if the % represents a valid encoded char, or if it needs encoded. */ - BOOL force_encode = !check_pct_encoded(&tmp) && is_file; + BOOL force_encode = !check_pct_encoded(&tmp) && is_file && !(flags&Uri_CREATE_FILE_USE_DOS_PATH); val = decode_pct_val(ptr);
if(force_encode || escape_pct) { @@ -2940,7 +2941,8 @@ static BOOL canonicalize_path_hierarchical(const parse_data *data, Uri *uri, pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); uri->canon_len += 3; } else if((is_unreserved(val) && known_scheme) || - (is_file && (is_unreserved(val) || is_reserved(val)))) { + (is_file && (is_unreserved(val) || is_reserved(val) || + (val && flags&Uri_CREATE_FILE_USE_DOS_PATH && !is_forbidden_dos_path_char(val))))) { if(!computeOnly) uri->canon_uri[uri->canon_len] = val; ++uri->canon_len;