From 8a6210d28fcea9b6b16a5b35b679dcf0623ea3f2 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Tue, 26 Oct 2010 23:27:59 +0200 Subject: [PATCH] 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 8045a27524..93493a8e3a 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 9f78e288e9..77d14cdb14 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; -- 2.32.0.93.g670b81a890