urlmon: Properly handle relative URIs with specified host in combine_uri.
This commit is contained in:
parent
1aa9389eaf
commit
051cb8e625
|
@ -121,6 +121,7 @@ typedef struct _uri_dword_property {
|
||||||
DWORD value;
|
DWORD value;
|
||||||
HRESULT expected;
|
HRESULT expected;
|
||||||
BOOL todo;
|
BOOL todo;
|
||||||
|
BOOL broken_combine_hres;
|
||||||
} uri_dword_property;
|
} uri_dword_property;
|
||||||
|
|
||||||
typedef struct _uri_properties {
|
typedef struct _uri_properties {
|
||||||
|
@ -6693,6 +6694,60 @@ static const uri_combine_test uri_combine_tests[] = {
|
||||||
{URL_SCHEME_MK,S_OK},
|
{URL_SCHEME_MK,S_OK},
|
||||||
{URLZONE_INVALID,E_NOTIMPL}
|
{URLZONE_INVALID,E_NOTIMPL}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{ "http://winehq.org/dir/test?querystring",0,
|
||||||
|
"//winehq.com/#hash",Uri_CREATE_ALLOW_RELATIVE,
|
||||||
|
0,S_OK,FALSE,
|
||||||
|
{
|
||||||
|
{"http://winehq.com/#hash",S_OK},
|
||||||
|
{"winehq.com",S_OK},
|
||||||
|
{"http://winehq.com/#hash",S_OK},
|
||||||
|
{"winehq.com",S_OK},
|
||||||
|
{"",S_FALSE},
|
||||||
|
{"#hash",S_OK},
|
||||||
|
{"winehq.com",S_OK},
|
||||||
|
{"",S_FALSE},
|
||||||
|
{"/",S_OK},
|
||||||
|
{"/",S_OK},
|
||||||
|
{"",S_FALSE},
|
||||||
|
{"http://winehq.com/#hash",S_OK},
|
||||||
|
{"http",S_OK},
|
||||||
|
{"",S_FALSE},
|
||||||
|
{"",S_FALSE}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{Uri_HOST_DNS,S_OK},
|
||||||
|
{80,S_OK,FALSE,TRUE},
|
||||||
|
{URL_SCHEME_HTTP,S_OK},
|
||||||
|
{URLZONE_INVALID,E_NOTIMPL}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "http://winehq.org/dir/test?querystring",0,
|
||||||
|
"//winehq.com/dir2/../dir/file.txt?query#hash",Uri_CREATE_ALLOW_RELATIVE,
|
||||||
|
0,S_OK,FALSE,
|
||||||
|
{
|
||||||
|
{"http://winehq.com/dir/file.txt?query#hash",S_OK},
|
||||||
|
{"winehq.com",S_OK},
|
||||||
|
{"http://winehq.com/dir/file.txt?query#hash",S_OK},
|
||||||
|
{"winehq.com",S_OK},
|
||||||
|
{".txt",S_OK},
|
||||||
|
{"#hash",S_OK},
|
||||||
|
{"winehq.com",S_OK},
|
||||||
|
{"",S_FALSE},
|
||||||
|
{"/dir/file.txt",S_OK},
|
||||||
|
{"/dir/file.txt?query",S_OK},
|
||||||
|
{"?query",S_OK},
|
||||||
|
{"http://winehq.com/dir/file.txt?query#hash",S_OK},
|
||||||
|
{"http",S_OK},
|
||||||
|
{"",S_FALSE},
|
||||||
|
{"",S_FALSE}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{Uri_HOST_DNS,S_OK},
|
||||||
|
{80,S_OK,FALSE,TRUE},
|
||||||
|
{URL_SCHEME_HTTP,S_OK},
|
||||||
|
{URLZONE_INVALID,E_NOTIMPL}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -10035,9 +10090,10 @@ static void test_CoInternetCombineIUri(void) {
|
||||||
prop.value, received, i, j);
|
prop.value, received, i, j);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ok(hr == prop.expected,
|
ok(hr == prop.expected || broken(prop.broken_combine_hres && hr == S_FALSE),
|
||||||
"Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_combine_tests[%d].dword_props[%d].\n",
|
"Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_combine_tests[%d].dword_props[%d].\n",
|
||||||
hr, prop.expected, i, j);
|
hr, prop.expected, i, j);
|
||||||
|
if(!prop.broken_combine_hres || hr != S_FALSE)
|
||||||
ok(prop.value == received, "Error: Expected %d, but got %d instead on uri_combine_tests[%d].dword_props[%d].\n",
|
ok(prop.value == received, "Error: Expected %d, but got %d instead on uri_combine_tests[%d].dword_props[%d].\n",
|
||||||
prop.value, received, i, j);
|
prop.value, received, i, j);
|
||||||
}
|
}
|
||||||
|
@ -10351,9 +10407,10 @@ static void test_CoInternetCombineUrlEx(void) {
|
||||||
prop.value, received, i, j);
|
prop.value, received, i, j);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ok(hr == prop.expected,
|
ok(hr == prop.expected || broken(prop.broken_combine_hres && hr == S_FALSE),
|
||||||
"Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_combine_tests[%d].dword_props[%d].\n",
|
"Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_combine_tests[%d].dword_props[%d].\n",
|
||||||
hr, prop.expected, i, j);
|
hr, prop.expected, i, j);
|
||||||
|
if(!prop.broken_combine_hres || hr != S_FALSE)
|
||||||
ok(prop.value == received, "Error: Expected %d, but got %d instead on uri_combine_tests[%d].dword_props[%d].\n",
|
ok(prop.value == received, "Error: Expected %d, but got %d instead on uri_combine_tests[%d].dword_props[%d].\n",
|
||||||
prop.value, received, i, j);
|
prop.value, received, i, j);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6427,6 +6427,7 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result,
|
||||||
Uri *ret;
|
Uri *ret;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
parse_data data;
|
parse_data data;
|
||||||
|
Uri *proc_uri = base;
|
||||||
DWORD create_flags = 0, len = 0;
|
DWORD create_flags = 0, len = 0;
|
||||||
|
|
||||||
memset(&data, 0, sizeof(parse_data));
|
memset(&data, 0, sizeof(parse_data));
|
||||||
|
@ -6483,35 +6484,38 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result,
|
||||||
create_flags |= Uri_CREATE_ALLOW_RELATIVE;
|
create_flags |= Uri_CREATE_ALLOW_RELATIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(base->authority_start > -1) {
|
if(relative->authority_start > -1)
|
||||||
if(base->userinfo_start > -1 && base->userinfo_split != 0) {
|
proc_uri = relative;
|
||||||
data.username = base->canon_uri+base->userinfo_start;
|
|
||||||
data.username_len = (base->userinfo_split > -1) ? base->userinfo_split : base->userinfo_len;
|
if(proc_uri->authority_start > -1) {
|
||||||
|
if(proc_uri->userinfo_start > -1 && proc_uri->userinfo_split != 0) {
|
||||||
|
data.username = proc_uri->canon_uri+proc_uri->userinfo_start;
|
||||||
|
data.username_len = (proc_uri->userinfo_split > -1) ? proc_uri->userinfo_split : proc_uri->userinfo_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(base->userinfo_split > -1) {
|
if(proc_uri->userinfo_split > -1) {
|
||||||
data.password = base->canon_uri+base->userinfo_start+base->userinfo_split+1;
|
data.password = proc_uri->canon_uri+proc_uri->userinfo_start+proc_uri->userinfo_split+1;
|
||||||
data.password_len = base->userinfo_len-base->userinfo_split-1;
|
data.password_len = proc_uri->userinfo_len-proc_uri->userinfo_split-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(base->host_start > -1) {
|
if(proc_uri->host_start > -1) {
|
||||||
data.host = base->canon_uri+base->host_start;
|
data.host = proc_uri->canon_uri+proc_uri->host_start;
|
||||||
data.host_len = base->host_len;
|
data.host_len = proc_uri->host_len;
|
||||||
data.host_type = base->host_type;
|
data.host_type = proc_uri->host_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(base->has_port) {
|
if(proc_uri->has_port) {
|
||||||
data.has_port = TRUE;
|
data.has_port = TRUE;
|
||||||
data.port_value = base->port;
|
data.port_value = proc_uri->port;
|
||||||
}
|
}
|
||||||
} else if(base->scheme_type != URL_SCHEME_FILE)
|
} else if(base->scheme_type != URL_SCHEME_FILE)
|
||||||
data.is_opaque = TRUE;
|
data.is_opaque = TRUE;
|
||||||
|
|
||||||
if(relative->path_start == -1 || !relative->path_len) {
|
if(proc_uri == relative || relative->path_start == -1 || !relative->path_len) {
|
||||||
if(base->path_start > -1) {
|
if(proc_uri->path_start > -1) {
|
||||||
data.path = base->canon_uri+base->path_start;
|
data.path = proc_uri->canon_uri+proc_uri->path_start;
|
||||||
data.path_len = base->path_len;
|
data.path_len = proc_uri->path_len;
|
||||||
} else if((base->path_start == -1 || !base->path_len) && !data.is_opaque) {
|
} else if(!data.is_opaque) {
|
||||||
/* Just set the path as a '/' if the base didn't have
|
/* Just set the path as a '/' if the base didn't have
|
||||||
* one and if it's an hierarchical URI.
|
* one and if it's an hierarchical URI.
|
||||||
*/
|
*/
|
||||||
|
@ -6520,12 +6524,12 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result,
|
||||||
data.path_len = 1;
|
data.path_len = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(relative->query_start > -1) {
|
if(relative->query_start > -1)
|
||||||
data.query = relative->canon_uri+relative->query_start;
|
proc_uri = relative;
|
||||||
data.query_len = relative->query_len;
|
|
||||||
} else if(base->query_start > -1) {
|
if(proc_uri->query_start > -1) {
|
||||||
data.query = base->canon_uri+base->query_start;
|
data.query = proc_uri->canon_uri+proc_uri->query_start;
|
||||||
data.query_len = base->query_len;
|
data.query_len = proc_uri->query_len;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const WCHAR *ptr, **pptr;
|
const WCHAR *ptr, **pptr;
|
||||||
|
|
Loading…
Reference in New Issue