Module: wine Branch: master Commit: b3ad7469d0b94cd3e226063202f8a460174add70 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b3ad7469d0b94cd3e226063202...
Author: Thomas Mullaly thomas.mullaly@gmail.com Date: Sun Aug 1 16:17:58 2010 -0400
urlmon: Added support for pre-processing URI strings.
---
dlls/urlmon/tests/uri.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++- dlls/urlmon/uri.c | 47 +++++++++++++++++- 2 files changed, 165 insertions(+), 3 deletions(-)
diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c index 98c328a..bae4c33 100644 --- a/dlls/urlmon/tests/uri.c +++ b/dlls/urlmon/tests/uri.c @@ -3430,6 +3430,123 @@ static const uri_properties uri_tests[] = { {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE}, } + }, + /* Leading/Trailing whitespace is removed. */ + { " 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/%22,S_OK,FALSE%7D, + {"google.com",S_OK,FALSE}, + {"http://google.com/%22,S_OK,FALSE%7D, + {"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/%22,S_OK,FALSE%7D, + {"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} + } + }, + { "\t\t\r\nhttp\n://g\noogle.co\rm/\n\n\n", 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/%22,S_OK,FALSE%7D, + {"google.com",S_OK,FALSE}, + {"http://google.com/%22,S_OK,FALSE%7D, + {"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/%22,S_OK,FALSE%7D, + {"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} + } + }, + { "http://g%5Cnoogle.co%5Crm/%5Cn%5Cn%5Cn", Uri_CREATE_NO_PRE_PROCESS_HTML_URI, 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://g%0aoogle.co%0dm/%0A%0A%0A%22,S_OK,FALSE%7D, + {"g%0aoogle.co%0dm",S_OK,FALSE}, + {"http://g%0aoogle.co%0dm/%0A%0A%0A%22,S_OK,FALSE%7D, + {"g%0aoogle.co%0dm",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"g%0aoogle.co%0dm",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/%0A%0A%0A",S_OK,FALSE}, + {"/%0A%0A%0A",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://g%5Cnoogle.co%5Crm/%5Cn%5Cn%5Cn%22,S_OK,FALSE%7D, + {"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} + } + }, + { "zip://g\noogle.co\rm/\n\n\n", Uri_CREATE_NO_PRE_PROCESS_HTML_URI, 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_SCHEME, + FALSE, + { + {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE}, + {"g\noogle.co\rm",S_OK,FALSE}, + {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE}, + {"g\noogle.co\rm",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"g\noogle.co\rm",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/\n\n\n",S_OK,FALSE}, + {"/\n\n\n",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE}, + {"zip",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } } };
@@ -3486,7 +3603,9 @@ static const invalid_uri invalid_uri_tests[] = { /* Known scheme types can't have invalid % encoded data in query string. */ {"http://google.com/?query=te%xx%22,0,FALSE%7D, /* Invalid % encoded data in fragment of know scheme type. */ - {"ftp://google.com/#Test%xx",0,FALSE} + {"ftp://google.com/#Test%xx",0,FALSE}, + {" http://google.com/%22,Uri_CREATE_NO_PRE_PROCESS_HTML_URI,FALSE%7D, + {"\n\nhttp://google.com/%22,Uri_CREATE_NO_PRE_PROCESS_HTML_URI,FALSE%7D };
typedef struct _uri_equality { diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index c4aa1b0..1c831c7 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -626,6 +626,45 @@ static void compute_elision_location(const ipv6_address *address, const USHORT v *count = max_len; }
+/* Removes all the leading and trailing white spaces or + * control characters from the URI and removes all control + * characters inside of the URI string. + */ +static BSTR pre_process_uri(LPCWSTR uri) { + BSTR ret; + DWORD len; + const WCHAR *start, *end; + WCHAR *buf, *ptr; + + len = lstrlenW(uri); + + start = uri; + /* Skip leading controls and whitespace. */ + while(iscntrlW(*start) || isspaceW(*start)) ++start; + + end = uri+len-1; + if(start == end) + /* URI consisted only of control/whitespace. */ + ret = SysAllocStringLen(NULL, 0); + else { + while(iscntrlW(*end) || isspaceW(*end)) --end; + + buf = heap_alloc(((end+1)-start)*sizeof(WCHAR)); + if(!buf) + return NULL; + + for(ptr = buf; start < end+1; ++start) { + if(!iscntrlW(*start)) + *ptr++ = *start; + } + + ret = SysAllocStringLen(buf, ptr-buf); + heap_free(buf); + } + + return ret; +} + /* Converts the specified IPv4 address into an uint value. * * This function assumes that the IPv4 address has already been validated. @@ -3729,8 +3768,12 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU ret->lpIUriVtbl = &UriVtbl; ret->ref = 1;
- /* Create a copy of pwzURI and store it as the raw_uri. */ - ret->raw_uri = SysAllocString(pwzURI); + /* Pre process the URI, unless told otherwise. */ + if(!(dwFlags & Uri_CREATE_NO_PRE_PROCESS_HTML_URI)) + ret->raw_uri = pre_process_uri(pwzURI); + else + ret->raw_uri = SysAllocString(pwzURI); + if(!ret->raw_uri) { heap_free(ret); return E_OUTOFMEMORY;