Hans Leidekker : urlmon: Fix handling of mailto URIs in CoInternetCombineUrlEx.
Alexandre Julliard
julliard at winehq.org
Thu Mar 28 15:30:23 CDT 2013
Module: wine
Branch: master
Commit: 9eb140db70b83e1ce5e1b2b701ce299d657f72d1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9eb140db70b83e1ce5e1b2b701ce299d657f72d1
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Mar 27 13:37:06 2013 +0100
urlmon: Fix handling of mailto URIs in CoInternetCombineUrlEx.
---
dlls/urlmon/tests/uri.c | 115 ++++++++++++++++++++++++++++++++++++++++++++---
dlls/urlmon/uri.c | 13 ++++-
2 files changed, 119 insertions(+), 9 deletions(-)
diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c
index e5faa81..ba31583 100644
--- a/dlls/urlmon/tests/uri.c
+++ b/dlls/urlmon/tests/uri.c
@@ -4521,7 +4521,57 @@ static const uri_properties uri_tests[] = {
{URL_SCHEME_UNKNOWN,S_OK},
{URLZONE_INVALID,E_NOTIMPL}
}
- }
+ },
+ { "mailto://", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE,
+ {
+ {"mailto:",S_OK},
+ {"",S_FALSE},
+ {"mailto:",S_OK},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"mailto://",S_OK,FALSE,"mailto:"},
+ {"mailto",S_OK},
+ {"",S_FALSE},
+ {"",S_FALSE}
+ },
+ {
+ {Uri_HOST_UNKNOWN,S_OK},
+ {0,S_FALSE},
+ {URL_SCHEME_MAILTO,S_OK},
+ {URLZONE_INVALID,E_NOTIMPL}
+ }
+ },
+ { "mailto://[email protected]", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE,
+ {
+ {"mailto:a at b.com",S_OK},
+ {"",S_FALSE},
+ {"mailto:a at b.com",S_OK},
+ {"",S_FALSE},
+ {".com",S_OK},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"a at b.com",S_OK},
+ {"a at b.com",S_OK},
+ {"",S_FALSE},
+ {"mailto://[email protected]",S_OK,FALSE,"mailto:a at b.com"},
+ {"mailto",S_OK},
+ {"",S_FALSE},
+ {"",S_FALSE}
+ },
+ {
+ {Uri_HOST_UNKNOWN,S_OK},
+ {0,S_FALSE},
+ {URL_SCHEME_MAILTO,S_OK},
+ {URLZONE_INVALID,E_NOTIMPL}
+ }
+ }
};
typedef struct _invalid_uri {
@@ -7005,8 +7055,61 @@ static const uri_combine_test uri_combine_tests[] = {
{URL_SCHEME_FILE,S_OK},
{URLZONE_INVALID,E_NOTIMPL}
}
+ },
+ { "http://winehq.org",0,
+ "mailto://",Uri_CREATE_NO_CANONICALIZE,
+ 0,S_OK,FALSE,
+ {
+ {"mailto:",S_OK},
+ {"",S_FALSE},
+ {"mailto:",S_OK},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"mailto://",S_OK,FALSE,"mailto:"},
+ {"mailto",S_OK},
+ {"",S_FALSE},
+ {"",S_FALSE}
+ },
+ {
+ {Uri_HOST_UNKNOWN,S_OK},
+ {0,S_FALSE},
+ {URL_SCHEME_MAILTO,S_OK},
+ {URLZONE_INVALID,E_NOTIMPL}
+ }
+ },
+ { "http://winehq.org",0,
+ "mailto://[email protected]",Uri_CREATE_NO_CANONICALIZE,
+ 0,S_OK,FALSE,
+ {
+ {"mailto:a at b.com",S_OK},
+ {"",S_FALSE},
+ {"mailto:a at b.com",S_OK},
+ {"",S_FALSE},
+ {".com",S_OK},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"",S_FALSE},
+ {"a at b.com",S_OK},
+ {"a at b.com",S_OK},
+ {"",S_FALSE},
+ {"mailto://[email protected]",S_OK,FALSE,"mailto:a at b.com"},
+ {"mailto",S_OK},
+ {"",S_FALSE},
+ {"",S_FALSE}
+ },
+ {
+ {Uri_HOST_UNKNOWN,S_OK},
+ {0,S_FALSE},
+ {URL_SCHEME_MAILTO,S_OK},
+ {URLZONE_INVALID,E_NOTIMPL}
+ }
}
-
};
typedef struct _uri_parse_test {
@@ -10317,7 +10420,7 @@ static void test_CoInternetCombineIUri(void) {
todo_wine {
ok(!strcmp_aw(prop.value, received) ||
broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)),
- "Error: Expected %s but got %s instead on uri_combine_tests[%d].str_props[%d].\n",
+ "Error: Expected \"%s\" but got %s instead on uri_combine_tests[%d].str_props[%d].\n",
prop.value, wine_dbgstr_w(received), i, j);
}
} else {
@@ -10326,7 +10429,7 @@ static void test_CoInternetCombineIUri(void) {
hr, prop.expected, i, j);
ok(!strcmp_aw(prop.value, received) ||
broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)),
- "Error: Expected %s but got %s instead on uri_combine_tests[%d].str_props[%d].\n",
+ "Error: Expected \"%s\" but got %s instead on uri_combine_tests[%d].str_props[%d].\n",
prop.value, wine_dbgstr_w(received), i, j);
}
SysFreeString(received);
@@ -10634,7 +10737,7 @@ static void test_CoInternetCombineUrlEx(void) {
todo_wine {
ok(!strcmp_aw(value, received) ||
broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)),
- "Error: Expected %s but got %s instead on uri_combine_tests[%d].str_props[%d].\n",
+ "Error: Expected \"%s\" but got %s instead on uri_combine_tests[%d].str_props[%d].\n",
value, wine_dbgstr_w(received), i, j);
}
} else {
@@ -10643,7 +10746,7 @@ static void test_CoInternetCombineUrlEx(void) {
hr, prop.expected, i, j);
ok(!strcmp_aw(value, received) ||
broken(prop.broken_value && !strcmp_aw(prop.broken_value, received)),
- "Error: Expected %s but got %s instead on uri_combine_tests[%d].str_props[%d].\n",
+ "Error: Expected \"%s\" but got %s instead on uri_combine_tests[%d].str_props[%d].\n",
value, wine_dbgstr_w(received), i, j);
}
SysFreeString(received);
diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c
index 0f6ee31..724d60f 100644
--- a/dlls/urlmon/uri.c
+++ b/dlls/urlmon/uri.c
@@ -422,7 +422,7 @@ static inline BOOL is_hierarchical_uri(const WCHAR **ptr, const parse_data *data
else if(is_hierarchical_scheme(data->scheme_type) && (*ptr)[0] == '\\' && (*ptr)[1] == '\\') {
*ptr += 2;
return TRUE;
- } else if(check_hierarchical(ptr))
+ } else if(data->scheme_type != URL_SCHEME_MAILTO && check_hierarchical(ptr))
return TRUE;
*ptr = start;
@@ -1917,8 +1917,15 @@ static BOOL parse_path_hierarchical(const WCHAR **ptr, parse_data *data, DWORD f
static BOOL parse_path_opaque(const WCHAR **ptr, parse_data *data, DWORD flags) {
const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN;
const BOOL is_file = data->scheme_type == URL_SCHEME_FILE;
+ const BOOL is_mailto = data->scheme_type == URL_SCHEME_MAILTO;
- data->path = *ptr;
+ if (is_mailto && (*ptr)[0] == '/' && (*ptr)[1] == '/')
+ {
+ if ((*ptr)[2]) data->path = *ptr + 2;
+ else data->path = NULL;
+ }
+ else
+ data->path = *ptr;
while(!is_path_delim(**ptr)) {
if(**ptr == '%' && known_scheme) {
@@ -1938,7 +1945,7 @@ static BOOL parse_path_opaque(const WCHAR **ptr, parse_data *data, DWORD flags)
++(*ptr);
}
- data->path_len = *ptr - data->path;
+ if (data->path) 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;
More information about the wine-cvs
mailing list