urlmon: Improved support for determining if a URI is hierarchical or not.
This commit is contained in:
parent
6a8b2d88af
commit
948009872d
@ -3771,6 +3771,122 @@ static const uri_properties uri_tests[] = {
|
|||||||
{URL_SCHEME_FILE,S_OK,FALSE},
|
{URL_SCHEME_FILE,S_OK,FALSE},
|
||||||
{URLZONE_INVALID,E_NOTIMPL,FALSE}
|
{URLZONE_INVALID,E_NOTIMPL,FALSE}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
/* The backslashes after the scheme name are converted to forward slashes. */
|
||||||
|
{ "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
|
||||||
|
|Uri_HAS_SCHEME, FALSE,
|
||||||
|
{
|
||||||
|
{"file://c:\\dir\\index.html",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"file://c:\\dir\\index.html",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{".html",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"c:\\dir\\index.html",S_OK,FALSE},
|
||||||
|
{"c:\\dir\\index.html",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"file:\\\\c:\\dir\\index.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", 0, 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/index.html",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"file:///c:/dir/index.html",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{".html",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"/c:/dir/index.html",S_OK,FALSE},
|
||||||
|
{"/c:/dir/index.html",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"file:\\\\c:/dir/index.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}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "http:\\\\google.com", 0, S_OK, FALSE,
|
||||||
|
Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|
|
||||||
|
Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|
|
||||||
|
Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME,
|
||||||
|
FALSE,
|
||||||
|
{
|
||||||
|
{"http://google.com/",S_OK,FALSE},
|
||||||
|
{"google.com",S_OK,FALSE},
|
||||||
|
{"http://google.com/",S_OK,FALSE},
|
||||||
|
{"google.com",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"google.com",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"/",S_OK,FALSE},
|
||||||
|
{"/",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"http:\\\\google.com",S_OK,FALSE},
|
||||||
|
{"http",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"",S_FALSE,FALSE}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{Uri_HOST_DNS,S_OK,FALSE},
|
||||||
|
{80,S_OK,FALSE},
|
||||||
|
{URL_SCHEME_HTTP,S_OK,FALSE},
|
||||||
|
{URLZONE_INVALID,E_NOTIMPL,FALSE}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/* the "\\\\" aren't converted to "//" for unknown scheme types and it's considered opaque. */
|
||||||
|
{ "zip:\\\\google.com", 0, 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_SCHEME|
|
||||||
|
Uri_HAS_HOST_TYPE,
|
||||||
|
FALSE,
|
||||||
|
{
|
||||||
|
{"zip:\\\\google.com",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"zip:\\\\google.com",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{".com",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"\\\\google.com",S_OK,FALSE},
|
||||||
|
{"\\\\google.com",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"zip:\\\\google.com",S_OK,FALSE},
|
||||||
|
{"zip",S_OK,FALSE},
|
||||||
|
{"",S_FALSE,FALSE},
|
||||||
|
{"",S_FALSE,FALSE}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{Uri_HOST_UNKNOWN,S_OK,FALSE},
|
||||||
|
{0,S_FALSE,FALSE},
|
||||||
|
{URL_SCHEME_UNKNOWN,S_OK,FALSE},
|
||||||
|
{URLZONE_INVALID,E_NOTIMPL,FALSE}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -306,6 +306,33 @@ static inline BOOL is_hierarchical_scheme(URL_SCHEME type) {
|
|||||||
type == URL_SCHEME_RES);
|
type == URL_SCHEME_RES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Determines if the URI is hierarchical using the information already parsed into
|
||||||
|
* data and using the current location of parsing in the URI string.
|
||||||
|
*
|
||||||
|
* Windows considers a URI hierarchical if on of the following is true:
|
||||||
|
* A.) It's a wildcard scheme.
|
||||||
|
* B.) It's an implicit file scheme.
|
||||||
|
* C.) It's a known hierarchical scheme and it has two '\\' after the scheme name.
|
||||||
|
* (the '\\' will be converted into "//" during canonicalization).
|
||||||
|
* D.) It's not a relative URI and "//" appears after the scheme name.
|
||||||
|
*/
|
||||||
|
static inline BOOL is_hierarchical_uri(const WCHAR **ptr, const parse_data *data) {
|
||||||
|
const WCHAR *start = *ptr;
|
||||||
|
|
||||||
|
if(data->scheme_type == URL_SCHEME_WILDCARD)
|
||||||
|
return TRUE;
|
||||||
|
else if(data->scheme_type == URL_SCHEME_FILE && data->has_implicit_scheme)
|
||||||
|
return TRUE;
|
||||||
|
else if(is_hierarchical_scheme(data->scheme_type) && (*ptr)[0] == '\\' && (*ptr)[1] == '\\') {
|
||||||
|
*ptr += 2;
|
||||||
|
return TRUE;
|
||||||
|
} else if(!data->is_relative && check_hierarchical(ptr))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
*ptr = start;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Checks if the two Uri's are logically equivalent. It's a simple
|
/* Checks if the two Uri's are logically equivalent. It's a simple
|
||||||
* comparison, since they are both of type Uri, and it can access
|
* comparison, since they are both of type Uri, and it can access
|
||||||
* the properties of each Uri directly without the need to go
|
* the properties of each Uri directly without the need to go
|
||||||
@ -1866,17 +1893,8 @@ static BOOL parse_path_opaque(const WCHAR **ptr, parse_data *data, DWORD flags)
|
|||||||
static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) {
|
static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) {
|
||||||
const WCHAR *start = *ptr;
|
const WCHAR *start = *ptr;
|
||||||
|
|
||||||
/* Checks if the authority information needs to be parsed.
|
/* Checks if the authority information needs to be parsed. */
|
||||||
*
|
if(is_hierarchical_uri(ptr, data)) {
|
||||||
* Relative URI's aren't hierarchical URI's, but, they could trick
|
|
||||||
* "check_hierarchical" into thinking it is, so we need to explicitly
|
|
||||||
* make sure it's not relative. Also, if the URI is an implicit file
|
|
||||||
* scheme it might not contain a "//", but, it's considered hierarchical
|
|
||||||
* anyways. Wildcard Schemes are always considered hierarchical
|
|
||||||
*/
|
|
||||||
if(data->scheme_type == URL_SCHEME_WILDCARD ||
|
|
||||||
(data->scheme_type == URL_SCHEME_FILE && is_implicit_file_path(*ptr)) ||
|
|
||||||
(!data->is_relative && check_hierarchical(ptr))) {
|
|
||||||
/* Only treat it as a hierarchical URI if the scheme_type is known or
|
/* Only treat it as a hierarchical URI if the scheme_type is known or
|
||||||
* the Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES flag is not set.
|
* the Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES flag is not set.
|
||||||
*/
|
*/
|
||||||
@ -1885,10 +1903,6 @@ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) {
|
|||||||
TRACE("(%p %p %x): Treating URI as an hierarchical URI.\n", ptr, data, flags);
|
TRACE("(%p %p %x): Treating URI as an hierarchical URI.\n", ptr, data, flags);
|
||||||
data->is_opaque = FALSE;
|
data->is_opaque = FALSE;
|
||||||
|
|
||||||
if(data->scheme_type == URL_SCHEME_FILE)
|
|
||||||
/* Skip past the "//" after the scheme (if any). */
|
|
||||||
check_hierarchical(ptr);
|
|
||||||
|
|
||||||
/* TODO: Handle hierarchical URI's, parse authority then parse the path. */
|
/* TODO: Handle hierarchical URI's, parse authority then parse the path. */
|
||||||
if(!parse_authority(ptr, data, flags))
|
if(!parse_authority(ptr, data, flags))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user