Jacek Caban : urlmon: Skip query and hash part in find_mime_from_url.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Dec 23 15:21:00 CST 2014


Module: wine
Branch: master
Commit: 9351e225bb6d08908f83dd7e491a49a0b0b5b7f8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9351e225bb6d08908f83dd7e491a49a0b0b5b7f8

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Dec 23 12:02:03 2014 +0100

urlmon: Skip query and hash part in find_mime_from_url.

---

 dlls/urlmon/mimefilter.c | 44 +++++++++++++++++++++++++++++++++++++-------
 dlls/urlmon/tests/misc.c | 15 ++++++++++++---
 2 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/dlls/urlmon/mimefilter.c b/dlls/urlmon/mimefilter.c
index 55cd200..1e06fc3 100644
--- a/dlls/urlmon/mimefilter.c
+++ b/dlls/urlmon/mimefilter.c
@@ -422,20 +422,15 @@ static BOOL application_octet_stream_filter(const BYTE *b, DWORD size)
     return TRUE;
 }
 
-static HRESULT find_mime_from_url(const WCHAR *url, WCHAR **ret)
+static HRESULT find_mime_from_ext(const WCHAR *ext, WCHAR **ret)
 {
-    const WCHAR *ptr;
     DWORD res, size;
     WCHAR mime[64];
     HKEY hkey;
 
     static const WCHAR content_typeW[] = {'C','o','n','t','e','n','t',' ','T','y','p','e','\0'};
 
-    ptr = strrchrW(url, '.');
-    if(!ptr)
-        return E_FAIL;
-
-    res = RegOpenKeyW(HKEY_CLASSES_ROOT, ptr, &hkey);
+    res = RegOpenKeyW(HKEY_CLASSES_ROOT, ext, &hkey);
     if(res != ERROR_SUCCESS)
         return HRESULT_FROM_WIN32(res);
 
@@ -452,6 +447,41 @@ static HRESULT find_mime_from_url(const WCHAR *url, WCHAR **ret)
     return S_OK;
 }
 
+static HRESULT find_mime_from_url(const WCHAR *url, WCHAR **ret)
+{
+    const WCHAR *ptr, *end_ptr;
+    WCHAR *ext = NULL;
+    HRESULT hres;
+
+    for(end_ptr = url; *end_ptr; end_ptr++) {
+        if(*end_ptr == '?' || *end_ptr == '#')
+            break;
+    }
+
+    for(ptr = end_ptr; ptr >= url; ptr--) {
+        if(*ptr == '.')
+            break;
+    }
+
+    if(ptr < url)
+        return E_FAIL;
+
+    if(*end_ptr) {
+        unsigned len = end_ptr-ptr;
+
+        ext = heap_alloc((len+1)*sizeof(WCHAR));
+        if(!ext)
+            return E_OUTOFMEMORY;
+
+        memcpy(ext, ptr, len*sizeof(WCHAR));
+        ext[len] = 0;
+    }
+
+    hres = find_mime_from_ext(ext ? ext : ptr, ret);
+    heap_free(ext);
+    return hres;
+}
+
 static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0};
 static const WCHAR text_richtextW[] = {'t','e','x','t','/','r','i','c','h','t','e','x','t',0};
 static const WCHAR text_xmlW[] = {'t','e','x','t','/','x','m','l',0};
diff --git a/dlls/urlmon/tests/misc.c b/dlls/urlmon/tests/misc.c
index b0849a0..ebfef2b 100644
--- a/dlls/urlmon/tests/misc.c
+++ b/dlls/urlmon/tests/misc.c
@@ -466,10 +466,15 @@ static const struct {
     const char *url;
     const char *mime;
     HRESULT hres;
+    BOOL broken_failure;
+    const char *broken_mime;
 } mime_tests[] = {
     {"res://mshtml.dll/blank.htm", "text/html", S_OK},
     {"index.htm", "text/html", S_OK},
     {"file://c:\\Index.htm", "text/html", S_OK},
+    {"file://c:\\Index.htm?q=test", "text/html", S_OK, TRUE},
+    {"file://c:\\Index.htm#hash_part", "text/html", S_OK, TRUE},
+    {"file://c:\\Index.htm#hash_part.txt", "text/html", S_OK, FALSE, "text/plain"},
     {"file://some%20file%2ejpg", NULL, E_FAIL},
     {"http://www.winehq.org", NULL, __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)},
     {"about:blank", NULL, E_FAIL},
@@ -713,9 +718,13 @@ static void test_FindMimeFromData(void)
         url = a2w(mime_tests[i].url);
         hres = pFindMimeFromData(NULL, url, NULL, 0, NULL, 0, &mime, 0);
         if(mime_tests[i].mime) {
-            ok(hres == S_OK, "[%d] FindMimeFromData failed: %08x\n", i, hres);
-            ok(!strcmp_wa(mime, mime_tests[i].mime), "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
-            CoTaskMemFree(mime);
+            ok(hres == S_OK || broken(mime_tests[i].broken_failure), "[%d] FindMimeFromData failed: %08x\n", i, hres);
+            if(hres == S_OK) {
+                ok(!strcmp_wa(mime, mime_tests[i].mime)
+                   || broken(mime_tests[i].broken_mime && !strcmp_wa(mime, mime_tests[i].broken_mime)),
+                   "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
+                CoTaskMemFree(mime);
+            }
         }else {
             ok(hres == E_FAIL || hres == mime_tests[i].hres,
                "[%d] FindMimeFromData failed: %08x, expected %08x\n",




More information about the wine-cvs mailing list