Munge \r and \n in UrlCanonicalizeW

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Sun Mar 14 18:43:17 CST 2004


Changelog:
	dlls/shlwapi/url.c: UrlCanonicalizeW
	Munge /r and /n at end of lpszUrlCpy, with test cases
-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
Index: wine/dlls/shlwapi/url.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/url.c,v
retrieving revision 1.29
diff -u -r1.29 url.c
--- wine/dlls/shlwapi/url.c	3 Mar 2004 20:11:46 -0000	1.29
+++ wine/dlls/shlwapi/url.c	15 Mar 2004 00:34:31 -0000
@@ -581,7 +581,12 @@
 	TRACE("Simplified, orig <%s>, simple <%s>\n",
 	      debugstr_w(pszUrl), debugstr_w(lpszUrlCpy));
     }
-
+    nLen = lstrlenW(lpszUrlCpy);
+    while ((lpszUrlCpy[nLen-1] == (WCHAR)'\r')||(lpszUrlCpy[nLen-1] == (WCHAR)'\n'))
+    {
+	nLen--;
+	lpszUrlCpy[nLen]=(WCHAR)0;
+    }
     if(dwFlags & URL_UNESCAPE)
         UrlUnescapeW(lpszUrlCpy, NULL, NULL, URL_UNESCAPE_INPLACE);
 
Index: wine/dlls/shlwapi/tests/path.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/tests/path.c,v
retrieving revision 1.7
diff -u -r1.7 path.c
--- wine/dlls/shlwapi/tests/path.c	3 Mar 2004 20:11:46 -0000	1.7
+++ wine/dlls/shlwapi/tests/path.c	15 Mar 2004 00:34:31 -0000
@@ -43,6 +43,10 @@
 
 const TEST_URL_CANONICALIZE TEST_CANONICALIZE[] = {
     {"http://www.winehq.org/tests/../tests", 0, S_OK, "http://www.winehq.org/tests"},
+    {"http://www.winehq.org/tests\n", URL_WININET_COMPATIBILITY|URL_ESCAPE_SPACES_ONLY|URL_ESCAPE_UNSAFE, S_OK, "http://www.winehq.org/tests"},
+    {"http://www.winehq.org/tests\r", URL_WININET_COMPATIBILITY|URL_ESCAPE_SPACES_ONLY|URL_ESCAPE_UNSAFE, S_OK, "http://www.winehq.org/tests"},
+    {"http://www.winehq.org/tests\r", 0, S_OK, "http://www.winehq.org/tests"},
+    {"http://www.winehq.org/tests\r", URL_DONT_SIMPLIFY, S_OK, "http://www.winehq.org/tests"},
     {"http://www.winehq.org/tests/../tests/", 0, S_OK, "http://www.winehq.org/tests/"},
     {"http://www.winehq.org/tests/../tests/..", 0, S_OK, "http://www.winehq.org/"},
     {"http://www.winehq.org/tests/../tests/../", 0, S_OK, "http://www.winehq.org/"},
@@ -55,6 +59,24 @@
     {"http://www.winehq.org/tests/../#example", URL_DONT_SIMPLIFY, S_OK, "http://www.winehq.org/tests/../#example"},
 };
 
+typedef struct _TEST_URL_ESCAPE {
+    char *url;
+    DWORD flags;
+    DWORD expectescaped;
+    HRESULT expectret;
+    char *expecturl;
+} TEST_URL_ESCAPE;
+
+const TEST_URL_ESCAPE TEST_ESCAPE[] = {
+    {"http://www.winehq.org/tests0", 0, 0, S_OK, "http://www.winehq.org/tests0"},
+    {"http://www.winehq.org/tests1\n", 0, 0, S_OK, "http://www.winehq.org/tests1%0A"},
+    {"http://www.winehq.org/tests2\r", 0, 0, S_OK, "http://www.winehq.org/tests2%0D"},
+    {"http://www.winehq.org/tests3\r", URL_ESCAPE_SPACES_ONLY|URL_ESCAPE_UNSAFE, 0, S_OK, "http://www.winehq.org/tests3\r"},
+    {"http://www.winehq.org/tests4\r", URL_ESCAPE_SPACES_ONLY, 0, S_OK, "http://www.winehq.org/tests4\r"},
+    {"http://www.winehq.org/tests5\r", URL_WININET_COMPATIBILITY|URL_ESCAPE_SPACES_ONLY, 0, S_OK, "http://www.winehq.org/tests5\r"},
+    {"/direct/swhelp/series6/6.2i_latestservicepack.dat\r", URL_ESCAPE_SPACES_ONLY, 0, S_OK, "/direct/swhelp/series6/6.2i_latestservicepack.dat\r"},
+};
+
 static LPWSTR GetWideString(const char* szString)
 {
   LPWSTR wszString = (LPWSTR) HeapAlloc(GetProcessHeap(), 0,
@@ -102,7 +124,7 @@
   DWORD dwSize;
 
   dwSize = INTERNET_MAX_URL_LENGTH;
-  ok( UrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags) == S_OK, "UrlGetPartA didn't return S_OK\n" );
+  ok( UrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags) == S_OK, "UrlGetPartA for \"%s\" part 0x%08lx didn't return S_OK but \"%s\"\n", szUrl, dwPart, szPart);
   dwSize = INTERNET_MAX_URL_LENGTH;
   ok( UrlGetPartW(wszUrl, wszPart, &dwSize, dwPart, dwFlags) == S_OK, "UrlGetPartW didn't return S_OK\n" );
 
@@ -129,6 +151,15 @@
   test_url_part(TEST_URL_3, URL_PART_QUERY, 0, "?query=x&return=y");
 }
 
+static void test_url_escape(const char *szUrl, DWORD dwFlags, HRESULT dwExpectReturn, const char *szExpectUrl)
+{
+    CHAR szReturnUrl[INTERNET_MAX_URL_LENGTH];
+    DWORD dwEscaped;
+
+    dwEscaped=INTERNET_MAX_URL_LENGTH;
+    ok(UrlEscapeA(szUrl, szReturnUrl, &dwEscaped, dwFlags) == dwExpectReturn, "UrlEscapeA didn't return 0x%08lx\n", dwExpectReturn);
+    ok(strcmp(szReturnUrl,szExpectUrl)==0, "Expected \"%s\", but got \"%s\"\n", szExpectUrl, szReturnUrl);
+}
 static void test_url_canonicalize(const char *szUrl, DWORD dwFlags, HRESULT dwExpectReturn, const char *szExpectUrl)
 {
     CHAR szReturnUrl[INTERNET_MAX_URL_LENGTH];
@@ -141,20 +172,29 @@
     
     dwSize = INTERNET_MAX_URL_LENGTH;
     ok(UrlCanonicalizeA(szUrl, szReturnUrl, &dwSize, dwFlags) == dwExpectReturn, "UrlCanonicalizeA didn't return 0x%08lx\n", dwExpectReturn);
+    ok(strcmp(szReturnUrl,szExpectUrl)==0, "Expected %s, but got %s\n", szExpectUrl, szReturnUrl);
+
     dwSize = INTERNET_MAX_URL_LENGTH;
     ok(UrlCanonicalizeW(wszUrl, wszReturnUrl, &dwSize, dwFlags) == dwExpectReturn, "UrlCanonicalizeW didn't return 0x%08lx\n", dwExpectReturn);
-
     wszConvertedUrl = GetWideString(szReturnUrl);
     ok(strcmpW(wszReturnUrl, wszConvertedUrl)==0, "Strings didn't match between ascii and unicode UrlCanonicalize!\n");
     FreeWideString(wszConvertedUrl);
     
-    ok(strcmp(szReturnUrl,szExpectUrl)==0, "Expected %s, but got %s\n", szExpectUrl, szReturnUrl);
             
     FreeWideString(wszUrl);
     FreeWideString(wszExpectUrl);
 }
 
 
+static void test_UrlEscape(void)
+{
+    int i;
+    for(i=0; i<sizeof(TEST_ESCAPE)/sizeof(TEST_ESCAPE[0]); i++) {
+        test_url_escape(TEST_ESCAPE[i].url, TEST_ESCAPE[i].flags,
+                              TEST_ESCAPE[i].expectret, TEST_ESCAPE[i].expecturl);
+    }
+}
+
 static void test_UrlCanonicalize(void)
 {
     int i;
@@ -169,4 +209,5 @@
   test_UrlHash();
   test_UrlGetPart();
   test_UrlCanonicalize();
+  test_UrlEscape();
 }



More information about the wine-patches mailing list