[Xfce4-commits] <midori:master> Implement sokoke_resolve_hostname
Christian Dywan
noreply at xfce.org
Wed Mar 17 02:22:01 CET 2010
Updating branch refs/heads/master
to 555f7a57e44e56049fc48f92c6ba2282780c479c (commit)
from 65785d3d80910e9c7f3f2ecd8d62a45851b57afa (commit)
commit 555f7a57e44e56049fc48f92c6ba2282780c479c
Author: André Stösel <Midori-Plugin at PyIT.de>
Date: Tue Mar 16 23:58:34 2010 +0100
Implement sokoke_resolve_hostname
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 at gmx.de> for input on proceeding
the event loop while resolving asynchronously.
midori/midori-browser.c | 2 +-
midori/midori-view.c | 2 +-
midori/sokoke.c | 50 ++++++++++++++++++++++++++++++++++++++++++++--
midori/sokoke.h | 7 +++++-
tests/magic-uri.c | 33 ++++++++++++++++--------------
5 files changed, 73 insertions(+), 21 deletions(-)
diff --git a/midori/midori-browser.c b/midori/midori-browser.c
index 94cf7ec..909aced 100644
--- a/midori/midori-browser.c
+++ b/midori/midori-browser.c
@@ -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);
diff --git a/midori/midori-view.c b/midori/midori-view.c
index 67cf8c1..3f9d215 100644
--- a/midori/midori-view.c
+++ b/midori/midori-view.c
@@ -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));
diff --git a/midori/sokoke.c b/midori/sokoke.c
index a26078a..8bcafe6 100644
--- a/midori/sokoke.c
+++ b/midori/sokoke.c
@@ -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;
}
diff --git a/midori/sokoke.h b/midori/sokoke.h
index 927cfee..e91bc69 100644
--- a/midori/sokoke.h
+++ b/midori/sokoke.h
@@ -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);
diff --git a/tests/magic-uri.c b/tests/magic-uri.c
index 9886bdb..07c00cb 100644
--- a/tests/magic-uri.c
+++ b/tests/magic-uri.c
@@ -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
More information about the Xfce4-commits
mailing list