Piotr Caban : urlmon: Improved url canonicalize when Uri_CREATE_FILE_USE_DOS_PATH is specified.
Alexandre Julliard
julliard at winehq.org
Wed Oct 27 12:50:58 CDT 2010
Module: wine
Branch: master
Commit: 8a6210d28fcea9b6b16a5b35b679dcf0623ea3f2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8a6210d28fcea9b6b16a5b35b679dcf0623ea3f2
Author: Piotr Caban <piotr at 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;
More information about the wine-cvs
mailing list