]> spindle.queued.net Git - midori/commitdiff
Implement sokoke_resolve_hostname
authorAndré Stösel <Midori-Plugin@PyIT.de>
Tue, 16 Mar 2010 22:58:34 +0000 (23:58 +0100)
committerChristian Dywan <christian@twotoasts.de>
Wed, 17 Mar 2010 01:20:58 +0000 (02:20 +0100)
sokoke_prefetch_uri is extended take a callback and user data.

sokoke_resolve_hostname is implemented for resolving hostnames
based on a maximum timeout.

sokoke_magic_uri resolves localhost and uris with a / to verify
if there is a local domain, otherwise falls back to search.

Thanks to Andy Kittner <andkit@gmx.de> for input on proceeding
the event loop while resolving asynchronously.

midori/midori-browser.c
midori/midori-view.c
midori/sokoke.c
midori/sokoke.h
tests/magic-uri.c

index 94cf7eceb6cef4b3841d6eee90919dc987e10669..909aced27217e17ecd59ecf83ce843954378a858 100644 (file)
@@ -2806,7 +2806,7 @@ midori_browser_menu_item_select_cb (GtkWidget*     menuitem,
         if (item)
         {
             tooltip = g_strdup (katze_item_get_uri (item));
-            sokoke_prefetch_uri (tooltip);
+            sokoke_prefetch_uri (tooltip, NULL, NULL);
         }
     }
     _midori_browser_set_statusbar_text (browser, tooltip);
index 67cf8c159c48c8b6075fe5a7a90b8af260b13aeb..3f9d21583035a9ca04a8a4c770791319d3130789 100644 (file)
@@ -1386,7 +1386,7 @@ webkit_web_view_hovering_over_link_cb (WebKitWebView* web_view,
                                        MidoriView*    view)
 {
     #if !(WEBKIT_CHECK_VERSION (2, 18, 0) && defined (HAVE_LIBSOUP_2_29_3))
-    sokoke_prefetch_uri (link_uri);
+    sokoke_prefetch_uri (link_uri, NULL, NULL);
     #endif
 
     katze_assign (view->link_uri, g_strdup (link_uri));
index a26078a644374e75c8527c0a375044fdb66d1914..8bcafe6bba137a52ea9ab2695c0d663b8a102f5e 100644 (file)
@@ -640,6 +640,45 @@ gchar* sokoke_search_uri (const gchar* uri,
     return search;
 }
 
+static void
+sokoke_resolve_hostname_cb (SoupAddress *address,
+                            guint        status,
+                            gpointer     data)
+{
+    if (status == SOUP_STATUS_OK)
+        *(gint *)data = 1;
+    else
+        *(gint *)data = 2;
+}
+
+/**
+ * sokoke_resolve_hostname
+ * @hostname: a string typed by a user
+ *
+ * Takes a string that was typed by a user,
+ * resolves the hostname, and returns the status.
+ *
+ * Return value: %TRUE if is a valid host, else %FALSE
+ **/
+gboolean
+sokoke_resolve_hostname (const gchar* hostname)
+{
+    gchar* uri;
+    gint host_resolved = 0;
+
+    uri = g_strconcat ("http://", hostname, NULL);
+    if (sokoke_prefetch_uri (uri, sokoke_resolve_hostname_cb,
+                             &host_resolved))
+    {
+        GTimer* timer = g_timer_new ();
+        while (!host_resolved && g_timer_elapsed (timer, NULL) < 10)
+            g_main_context_iteration (NULL, FALSE);
+        g_timer_destroy (timer);
+    }
+    g_free (uri);
+    return host_resolved == 1 ? TRUE : FALSE;
+}
+
 /**
  * sokoke_magic_uri:
  * @uri: a string typed by a user
@@ -682,7 +721,8 @@ sokoke_magic_uri (const gchar* uri)
         ((search = strchr (uri, ':')) || (search = strchr (uri, '@'))) &&
         search[0] && !g_ascii_isalpha (search[1]))
         return sokoke_idn_to_punycode (g_strconcat ("http://", uri, NULL));
-    if (!strncmp (uri, "localhost", 9) && (uri[9] == '\0' || uri[9] == '/'))
+    if ((!strcmp (uri, "localhost") || strchr (uri, '/'))
+      && sokoke_resolve_hostname (uri))
         return g_strconcat ("http://", uri, NULL);
     if (!search)
     {
@@ -1690,7 +1730,9 @@ sokoke_file_chooser_dialog_new (const gchar*         title,
  * Return value: %TRUE on success
  **/
 gboolean
-sokoke_prefetch_uri (const char* uri)
+sokoke_prefetch_uri (const char*         uri,
+                     SoupAddressCallback callback,
+                     gpointer            user_data)
 {
     #define MAXHOSTS 50
     static gchar* hosts = NULL;
@@ -1727,7 +1769,7 @@ sokoke_prefetch_uri (const char* uri)
         gchar* new_hosts;
 
         address = soup_address_new (s_uri->host, SOUP_ADDRESS_ANY_PORT);
-        soup_address_resolve_async (address, 0, 0, 0, 0);
+        soup_address_resolve_async (address, 0, 0, callback, user_data);
         g_object_unref (address);
 
         if (host_count > MAXHOSTS)
@@ -1739,6 +1781,8 @@ sokoke_prefetch_uri (const char* uri)
         new_hosts = g_strdup_printf ("%s|%s", hosts, s_uri->host);
         katze_assign (hosts, new_hosts);
     }
+    else if (callback)
+        callback (NULL, SOUP_STATUS_OK, user_data);
     soup_uri_free (s_uri);
     return TRUE;
 }
index 927cfee9d9575ee6be510489e90291fd6ed2e8ca..e91bc69261178634a50cf74439b2d199d0f9f00f 100644 (file)
@@ -221,7 +221,12 @@ sokoke_file_chooser_dialog_new          (const gchar*         title,
                                          GtkFileChooserAction action);
 
 gboolean
-sokoke_prefetch_uri                     (const char* uri);
+sokoke_prefetch_uri                     (const char*         uri,
+                                         SoupAddressCallback callback,
+                                         gpointer            user_data);
+
+gboolean
+sokoke_resolve_hostname                 (const gchar*        hostname);
 
 gchar *
 sokoke_accept_languages                 (const gchar* const * lang_names);
index 9886bdbb5cf7fd4306e8d15c7aa27a2f948c452c..07c00cb2de94560450af727a5cdfa03a06c65773 100644 (file)
@@ -95,9 +95,12 @@ magic_uri_uri (void)
     test_input ("example.com", "http://example.com");
     test_input ("www.google..com", "http://www.google..com");
     test_input ("/home/user/midori.html", "file:///home/user/midori.html");
-    test_input ("localhost", "http://localhost");
-    test_input ("localhost:8000", "http://localhost:8000");
-    test_input ("localhost/rss", "http://localhost/rss");
+    if (sokoke_resolve_hostname ("localhost"))
+    {
+        test_input ("localhost", "http://localhost");
+        test_input ("localhost:8000", "http://localhost:8000");
+        test_input ("localhost/rss", "http://localhost/rss");
+    }
     test_input ("10.0.0.1", "http://10.0.0.1");
     test_input ("192.168.1.1", "http://192.168.1.1");
     test_input ("192.168.1.1:8000", "http://192.168.1.1:8000");
@@ -255,18 +258,18 @@ magic_uri_format (void)
 static void
 magic_uri_prefetch (void)
 {
-    g_assert (!sokoke_prefetch_uri (NULL));
-    g_assert (sokoke_prefetch_uri ("http://google.com"));
-    g_assert (sokoke_prefetch_uri ("http://google.com"));
-    g_assert (sokoke_prefetch_uri ("http://googlecom"));
-    g_assert (sokoke_prefetch_uri ("http://1kino.com"));
-    g_assert (sokoke_prefetch_uri ("http://"));
-    g_assert (!sokoke_prefetch_uri ("http:/"));
-    g_assert (!sokoke_prefetch_uri ("http"));
-    g_assert (!sokoke_prefetch_uri ("ftp://ftphost.org"));
-    g_assert (!sokoke_prefetch_uri ("http://10.0.0.1"));
-    g_assert (!sokoke_prefetch_uri ("about:blank"));
-    g_assert (!sokoke_prefetch_uri ("javascript: alert()"));
+    g_assert (!sokoke_prefetch_uri (NULL, NULL, NULL));
+    g_assert (sokoke_prefetch_uri ("http://google.com", NULL, NULL));
+    g_assert (sokoke_prefetch_uri ("http://google.com", NULL, NULL));
+    g_assert (sokoke_prefetch_uri ("http://googlecom", NULL, NULL));
+    g_assert (sokoke_prefetch_uri ("http://1kino.com", NULL, NULL));
+    g_assert (sokoke_prefetch_uri ("http://", NULL, NULL));
+    g_assert (!sokoke_prefetch_uri ("http:/", NULL, NULL));
+    g_assert (!sokoke_prefetch_uri ("http", NULL, NULL));
+    g_assert (!sokoke_prefetch_uri ("ftp://ftphost.org", NULL, NULL));
+    g_assert (!sokoke_prefetch_uri ("http://10.0.0.1", NULL, NULL));
+    g_assert (!sokoke_prefetch_uri ("about:blank", NULL, NULL));
+    g_assert (!sokoke_prefetch_uri ("javascript: alert()", NULL, NULL));
 }
 
 int