]> spindle.queued.net Git - midori/commitdiff
Restrict IDN conversion to hostname
authorChristian Dywan <christian@twotoasts.de>
Mon, 23 Feb 2009 22:44:30 +0000 (23:44 +0100)
committerChristian Dywan <christian@twotoasts.de>
Mon, 23 Feb 2009 22:44:30 +0000 (23:44 +0100)
midori/sokoke.c
tests/magic-uri.c

index 98d9384d0772b078fe83131103315910020b90bc..c179692a6215d0419a18c50813778a644dd9f128 100644 (file)
@@ -132,16 +132,35 @@ static gchar*
 sokoke_idn_to_punycode (gchar* uri)
 {
     #if HAVE_LIBIDN
+    gchar* proto;
     gchar* hostname;
+    gchar* path;
     char *s;
     uint32_t *q;
     int rc;
     gchar *result;
 
-    if (g_str_has_prefix (uri, "http://"))
-        hostname = &uri[7];
-    else if (g_str_has_prefix (uri, "https://"))
-        hostname = &uri[8];
+    if ((proto = g_utf8_strchr (uri, -1, ':')))
+    {
+        gulong offset = g_utf8_pointer_to_offset (uri, proto);
+        gchar* buffer = g_malloc0 (offset + 1);
+        g_utf8_strncpy (buffer, uri, offset);
+        proto = buffer;
+    }
+
+    path = NULL;
+    if ((hostname = g_utf8_strchr (uri, -1, '/')))
+    {
+        if (hostname[1] == '/')
+            hostname += 2;
+        if ((path = g_utf8_strchr (hostname, -1, '/')))
+        {
+            gulong offset = g_utf8_pointer_to_offset (hostname, path);
+            gchar* buffer = g_malloc0 (offset);
+            g_utf8_strncpy (buffer, hostname, offset);
+            hostname = buffer;
+        }
+    }
     else
         hostname = uri;
 
@@ -153,10 +172,13 @@ sokoke_idn_to_punycode (gchar* uri)
     if (rc != IDNA_SUCCESS)
         return uri;
 
-    if (g_str_has_prefix (uri, "http://"))
-        result = g_strdup_printf ("http://%s", s);
-    else if (g_str_has_prefix (uri, "https://"))
-        result = g_strdup_printf ("https://%s", s);
+    if (proto)
+    {
+        result = g_strdup_printf ("%s://%s%s", proto, s, path ? path : "");
+        g_free (proto);
+        if (path)
+            g_free (hostname);
+    }
     else
         result = g_strdup (s);
     g_free (uri);
index ed74c43a4399e0ee793942165166877a08e5a1eb..0ada79c685b1914f721b8d679f6d705a94678311 100644 (file)
@@ -107,6 +107,10 @@ main (int    argc,
     test_input ("http://東京理科大学.jp", "http://東京理科大学.jp");
     test_input ("https://青のネコ.co.jp",  "https://青のネコ.co.jp");
     #endif
+    test_input ("http://en.wikipedia.org/wiki/Kölsch_language",
+                "http://en.wikipedia.org/wiki/Kölsch_language");
+    test_input ("en.wikipedia.org/wiki/Kölsch_language",
+                "http://en.wikipedia.org/wiki/Kölsch_language");
     test_input ("sm Küchenzubehör", SM "Küchenzubehör");
     test_input ("sm 東京理科大学", SM "東京理科大学");