Thomas Mullaly : urlmon: Added support for pre-processing URI strings.
Alexandre Julliard
julliard at winehq.org
Tue Aug 17 11:31:14 CDT 2010
Module: wine
Branch: master
Commit: b3ad7469d0b94cd3e226063202f8a460174add70
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b3ad7469d0b94cd3e226063202f8a460174add70
Author: Thomas Mullaly <thomas.mullaly at 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/",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}
+ }
+ },
+ { "\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/",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}
+ }
+ },
+ { "http://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_PORT|Uri_HAS_SCHEME,
+ FALSE,
+ {
+ {"http://g%0aoogle.co%0dm/%0A%0A%0A",S_OK,FALSE},
+ {"g%0aoogle.co%0dm",S_OK,FALSE},
+ {"http://g%0aoogle.co%0dm/%0A%0A%0A",S_OK,FALSE},
+ {"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\noogle.co\rm/\n\n\n",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}
+ }
+ },
+ { "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",0,FALSE},
/* 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/",Uri_CREATE_NO_PRE_PROCESS_HTML_URI,FALSE},
+ {"\n\nhttp://google.com/",Uri_CREATE_NO_PRE_PROCESS_HTML_URI,FALSE}
};
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;
More information about the wine-cvs
mailing list