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@gmx.de> for input on proceeding the event loop while resolving asynchronously.
This commit is contained in:
parent
65785d3d80
commit
555f7a57e4
5 changed files with 73 additions and 21 deletions
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue