shlwapi: Improved UrlCanonicalize implementation.
This commit is contained in:
parent
a1fecdaf07
commit
8b7fae35e4
|
@ -114,6 +114,7 @@ static const TEST_URL_CANONICALIZE TEST_CANONICALIZE[] = {
|
||||||
{"http://www.winehq.org/tests/../", 0, S_OK, "http://www.winehq.org/", FALSE},
|
{"http://www.winehq.org/tests/../", 0, S_OK, "http://www.winehq.org/", FALSE},
|
||||||
{"http://www.winehq.org/tests/..?query=x&return=y", 0, S_OK, "http://www.winehq.org/?query=x&return=y", FALSE},
|
{"http://www.winehq.org/tests/..?query=x&return=y", 0, S_OK, "http://www.winehq.org/?query=x&return=y", FALSE},
|
||||||
{"http://www.winehq.org/tests/../?query=x&return=y", 0, S_OK, "http://www.winehq.org/?query=x&return=y", FALSE},
|
{"http://www.winehq.org/tests/../?query=x&return=y", 0, S_OK, "http://www.winehq.org/?query=x&return=y", FALSE},
|
||||||
|
{"\tht\ttp\t://www\t.w\tineh\t\tq.or\tg\t/\ttests/..\t?\tquer\ty=x\t\t&re\tturn=y\t\t", 0, S_OK, "http://www.winehq.org/?query=x&return=y", FALSE},
|
||||||
{"http://www.winehq.org/tests/..#example", 0, S_OK, "http://www.winehq.org/#example", FALSE},
|
{"http://www.winehq.org/tests/..#example", 0, S_OK, "http://www.winehq.org/#example", FALSE},
|
||||||
{"http://www.winehq.org/tests/../#example", 0, S_OK, "http://www.winehq.org/#example", FALSE},
|
{"http://www.winehq.org/tests/../#example", 0, S_OK, "http://www.winehq.org/#example", FALSE},
|
||||||
{"http://www.winehq.org/tests\\../#example", 0, S_OK, "http://www.winehq.org/#example", FALSE},
|
{"http://www.winehq.org/tests\\../#example", 0, S_OK, "http://www.winehq.org/#example", FALSE},
|
||||||
|
@ -143,6 +144,7 @@ static const TEST_URL_CANONICALIZE TEST_CANONICALIZE[] = {
|
||||||
{"c:dir\\file", 0, S_OK, "file:///c:dir/file", FALSE},
|
{"c:dir\\file", 0, S_OK, "file:///c:dir/file", FALSE},
|
||||||
{"c:\\tests\\foo bar", URL_FILE_USE_PATHURL, S_OK, "file://c:\\tests\\foo bar", FALSE},
|
{"c:\\tests\\foo bar", URL_FILE_USE_PATHURL, S_OK, "file://c:\\tests\\foo bar", FALSE},
|
||||||
{"c:\\tests\\foo bar", 0, S_OK, "file:///c:/tests/foo%20bar", FALSE},
|
{"c:\\tests\\foo bar", 0, S_OK, "file:///c:/tests/foo%20bar", FALSE},
|
||||||
|
{"c\t:\t\\te\tsts\\fo\to \tbar\t", 0, S_OK, "file:///c:/tests/foo%20bar", FALSE},
|
||||||
{"res://file", 0, S_OK, "res://file/", FALSE},
|
{"res://file", 0, S_OK, "res://file/", FALSE},
|
||||||
{"res://file", URL_FILE_USE_PATHURL, S_OK, "res://file/", FALSE},
|
{"res://file", URL_FILE_USE_PATHURL, S_OK, "res://file/", FALSE},
|
||||||
{"res:///c:/tests/foo%20bar", URL_UNESCAPE , S_OK, "res:///c:/tests/foo bar", FALSE},
|
{"res:///c:/tests/foo%20bar", URL_UNESCAPE , S_OK, "res:///c:/tests/foo bar", FALSE},
|
||||||
|
|
|
@ -273,7 +273,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
DWORD EscapeFlags;
|
DWORD EscapeFlags;
|
||||||
LPCWSTR wk1, root;
|
LPCWSTR wk1, root;
|
||||||
LPWSTR lpszUrlCpy, wk2, mp, mp2;
|
LPWSTR lpszUrlCpy, url, wk2, mp, mp2;
|
||||||
INT state;
|
INT state;
|
||||||
DWORD nByteLen, nLen, nWkLen;
|
DWORD nByteLen, nLen, nWkLen;
|
||||||
WCHAR slash = '\0';
|
WCHAR slash = '\0';
|
||||||
|
@ -295,22 +295,40 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remove '\t' characters from URL */
|
||||||
nByteLen = (strlenW(pszUrl) + 1) * sizeof(WCHAR); /* length in bytes */
|
nByteLen = (strlenW(pszUrl) + 1) * sizeof(WCHAR); /* length in bytes */
|
||||||
|
url = HeapAlloc(GetProcessHeap(), 0, nByteLen);
|
||||||
|
if(!url)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
wk1 = pszUrl;
|
||||||
|
wk2 = url;
|
||||||
|
do {
|
||||||
|
while(*wk1 == '\t')
|
||||||
|
wk1++;
|
||||||
|
*wk2++ = *wk1;
|
||||||
|
} while(*wk1++);
|
||||||
|
|
||||||
/* Allocate memory for simplified URL (before escaping) */
|
/* Allocate memory for simplified URL (before escaping) */
|
||||||
|
nByteLen = (wk2-url)*sizeof(WCHAR);
|
||||||
lpszUrlCpy = HeapAlloc(GetProcessHeap(), 0,
|
lpszUrlCpy = HeapAlloc(GetProcessHeap(), 0,
|
||||||
nByteLen+sizeof(wszFilePrefix)+sizeof(WCHAR));
|
nByteLen+sizeof(wszFilePrefix)+sizeof(WCHAR));
|
||||||
|
if(!lpszUrlCpy) {
|
||||||
|
HeapFree(GetProcessHeap(), 0, url);
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
if ((nByteLen >= sizeof(wszHttp) &&
|
if ((nByteLen >= sizeof(wszHttp) &&
|
||||||
!memcmp(wszHttp, pszUrl, sizeof(wszHttp))) ||
|
!memcmp(wszHttp, url, sizeof(wszHttp))) ||
|
||||||
(nByteLen >= sizeof(wszFile) &&
|
(nByteLen >= sizeof(wszFile) &&
|
||||||
!memcmp(wszFile, pszUrl, sizeof(wszFile))))
|
!memcmp(wszFile, url, sizeof(wszFile))))
|
||||||
slash = '/';
|
slash = '/';
|
||||||
|
|
||||||
if((dwFlags & URL_FILE_USE_PATHURL) && nByteLen >= sizeof(wszFile)
|
if((dwFlags & URL_FILE_USE_PATHURL) && nByteLen >= sizeof(wszFile)
|
||||||
&& !memcmp(wszFile, pszUrl, sizeof(wszFile)))
|
&& !memcmp(wszFile, url, sizeof(wszFile)))
|
||||||
slash = '\\';
|
slash = '\\';
|
||||||
|
|
||||||
if(nByteLen >= sizeof(wszRes) && !memcmp(wszRes, pszUrl, sizeof(wszRes))) {
|
if(nByteLen >= sizeof(wszRes) && !memcmp(wszRes, url, sizeof(wszRes))) {
|
||||||
dwFlags &= ~URL_FILE_USE_PATHURL;
|
dwFlags &= ~URL_FILE_USE_PATHURL;
|
||||||
slash = '\0';
|
slash = '\0';
|
||||||
}
|
}
|
||||||
|
@ -326,11 +344,11 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
|
||||||
* 6 have location (found /) save root location
|
* 6 have location (found /) save root location
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wk1 = pszUrl;
|
wk1 = url;
|
||||||
wk2 = lpszUrlCpy;
|
wk2 = lpszUrlCpy;
|
||||||
state = 0;
|
state = 0;
|
||||||
|
|
||||||
if(pszUrl[1] == ':') { /* Assume path */
|
if(url[1] == ':') { /* Assume path */
|
||||||
memcpy(wk2, wszFilePrefix, sizeof(wszFilePrefix));
|
memcpy(wk2, wszFilePrefix, sizeof(wszFilePrefix));
|
||||||
wk2 += sizeof(wszFilePrefix)/sizeof(WCHAR);
|
wk2 += sizeof(wszFilePrefix)/sizeof(WCHAR);
|
||||||
if (dwFlags & URL_FILE_USE_PATHURL)
|
if (dwFlags & URL_FILE_USE_PATHURL)
|
||||||
|
@ -361,7 +379,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
|
||||||
if (*wk1 != '/') {state = 6; break;}
|
if (*wk1 != '/') {state = 6; break;}
|
||||||
*wk2++ = *wk1++;
|
*wk2++ = *wk1++;
|
||||||
if((dwFlags & URL_FILE_USE_PATHURL) && nByteLen >= sizeof(wszLocalhost)
|
if((dwFlags & URL_FILE_USE_PATHURL) && nByteLen >= sizeof(wszLocalhost)
|
||||||
&& !strncmpW(wszFile, pszUrl, sizeof(wszFile)/sizeof(WCHAR))
|
&& !strncmpW(wszFile, url, sizeof(wszFile)/sizeof(WCHAR))
|
||||||
&& !memcmp(wszLocalhost, wk1, sizeof(wszLocalhost))){
|
&& !memcmp(wszLocalhost, wk1, sizeof(wszLocalhost))){
|
||||||
wk1 += sizeof(wszLocalhost)/sizeof(WCHAR);
|
wk1 += sizeof(wszLocalhost)/sizeof(WCHAR);
|
||||||
while(*wk1 == '\\' && (dwFlags & URL_FILE_USE_PATHURL))
|
while(*wk1 == '\\' && (dwFlags & URL_FILE_USE_PATHURL))
|
||||||
|
@ -483,6 +501,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
|
||||||
default:
|
default:
|
||||||
FIXME("how did we get here - state=%d\n", state);
|
FIXME("how did we get here - state=%d\n", state);
|
||||||
HeapFree(GetProcessHeap(), 0, lpszUrlCpy);
|
HeapFree(GetProcessHeap(), 0, lpszUrlCpy);
|
||||||
|
HeapFree(GetProcessHeap(), 0, url);
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
*wk2 = '\0';
|
*wk2 = '\0';
|
||||||
|
@ -495,7 +514,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
|
||||||
|
|
||||||
if((dwFlags & URL_UNESCAPE) ||
|
if((dwFlags & URL_UNESCAPE) ||
|
||||||
((dwFlags & URL_FILE_USE_PATHURL) && nByteLen >= sizeof(wszFile)
|
((dwFlags & URL_FILE_USE_PATHURL) && nByteLen >= sizeof(wszFile)
|
||||||
&& !memcmp(wszFile, pszUrl, sizeof(wszFile))))
|
&& !memcmp(wszFile, url, sizeof(wszFile))))
|
||||||
UrlUnescapeW(lpszUrlCpy, NULL, &nLen, URL_UNESCAPE_INPLACE);
|
UrlUnescapeW(lpszUrlCpy, NULL, &nLen, URL_UNESCAPE_INPLACE);
|
||||||
|
|
||||||
if((EscapeFlags = dwFlags & (URL_ESCAPE_UNSAFE |
|
if((EscapeFlags = dwFlags & (URL_ESCAPE_UNSAFE |
|
||||||
|
@ -518,6 +537,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
|
||||||
}
|
}
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, lpszUrlCpy);
|
HeapFree(GetProcessHeap(), 0, lpszUrlCpy);
|
||||||
|
HeapFree(GetProcessHeap(), 0, url);
|
||||||
|
|
||||||
if (hr == S_OK)
|
if (hr == S_OK)
|
||||||
TRACE("result %s\n", debugstr_w(pszCanonicalized));
|
TRACE("result %s\n", debugstr_w(pszCanonicalized));
|
||||||
|
|
Loading…
Reference in New Issue