From: Christian Dywan Date: Thu, 23 Aug 2012 19:25:44 +0000 (+0200) Subject: Handle and cache Accept-Language in WebSettings X-Git-Url: https://spindle.queued.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f6595ea15e7ce10e3e5382ef288308d70e5cc3a5;p=midori Handle and cache Accept-Language in WebSettings --- diff --git a/midori/main.c b/midori/main.c index 874421cc..84219524 100644 --- a/midori/main.c +++ b/midori/main.c @@ -900,49 +900,33 @@ midori_soup_session_settings_accept_language_cb (SoupSession* session, SoupMessage* msg, MidoriWebSettings* settings) { - gchar* languages = katze_object_get_string (settings, "preferred-languages"); - gchar* accpt; - - /* Empty, use the system locales */ - if (!(languages && *languages)) - accpt = sokoke_accept_languages (g_get_language_names ()); - /* No =, no ., looks like a list of language names */ - else if (!(strchr (languages, '=') && strchr (languages, '.'))) - { - gchar ** lang_names = g_strsplit_set (languages, ",; ", -1); - accpt = sokoke_accept_languages ((const gchar* const *)lang_names); - g_strfreev (lang_names); - } - /* Presumably a well formatted list including priorities */ - else - accpt = languages; - - if (accpt != languages) - g_free (languages); - soup_message_headers_append (msg->request_headers, "Accept-Language", accpt); - g_free (accpt); + const gchar* accept = midori_web_settings_get_accept_language (settings); + if (midori_debug ("soup")) + g_message ("Accept-Language set to '%s'", accept); + soup_message_headers_append (msg->request_headers, "Accept-Language", accept); if (katze_object_get_boolean (settings, "strip-referer")) { const gchar* referer = soup_message_headers_get_one (msg->request_headers, "Referer"); SoupURI* destination = soup_message_get_uri (msg); - if (referer && destination && !strstr (referer, destination->host)) + SoupURI* stripped_uri; + if (referer && destination && !strstr (referer, destination->host) + && (stripped_uri = soup_uri_new (referer))) { - SoupURI* stripped_uri = soup_uri_new (referer); - if (stripped_uri != NULL) + gchar* stripped_referer; + soup_uri_set_path (stripped_uri, ""); + soup_uri_set_query (stripped_uri, NULL); + stripped_referer = soup_uri_to_string (stripped_uri, FALSE); + soup_uri_free (stripped_uri); + if (strcmp (stripped_referer, referer)) { - gchar* stripped_referer; - soup_uri_set_path (stripped_uri, ""); - soup_uri_set_query (stripped_uri, NULL); - stripped_referer = soup_uri_to_string (stripped_uri, FALSE); - soup_uri_free (stripped_uri); if (midori_debug ("soup")) - g_message ("Referer %s stripped to %s", referer, stripped_referer); + g_message ("Referer '%s' stripped to '%s'", referer, stripped_referer); soup_message_headers_replace (msg->request_headers, "Referer", stripped_referer); - g_free (stripped_referer); } + g_free (stripped_referer); } } } diff --git a/midori/midori-websettings.c b/midori/midori-websettings.c index b9dea7f2..1397e82c 100644 --- a/midori/midori-websettings.c +++ b/midori/midori-websettings.c @@ -87,6 +87,7 @@ struct _MidoriWebSettings gint maximum_cache_size; #endif gchar* http_accept_language; + gchar* accept; gchar* ident_string; gint clear_private_data; @@ -1281,6 +1282,8 @@ midori_web_settings_finalize (GObject* object) katze_assign (web_settings->news_aggregator, NULL); katze_assign (web_settings->location_entry_search, NULL); katze_assign (web_settings->http_proxy, NULL); + katze_assign (web_settings->http_accept_language, NULL); + katze_assign (web_settings->accept, NULL); katze_assign (web_settings->ident_string, NULL); katze_assign (web_settings->user_stylesheet_uri, NULL); katze_assign (web_settings->user_stylesheet_uri_cached, NULL); @@ -1481,6 +1484,121 @@ generate_ident_string (MidoriWebSettings* web_settings, } } +/* Provide a new way for SoupSession to assume an 'Accept-Language' + string automatically from the return value of g_get_language_names(), + properly formatted according to RFC2616. + Copyright (C) 2009 Mario Sanchez Prada + Copyright (C) 2009 Dan Winship + Mostly copied from libSoup 2.29, coding style adjusted */ + +/* Converts a language in POSIX format and to be RFC2616 compliant */ +/* Based on code from epiphany-webkit (ephy_langs_append_languages()) */ + +static gchar * +sokoke_posix_lang_to_rfc2616 (const gchar *language) +{ + if (!strchr (language, '.') && !strchr (language, '@') && language[0] != 'C') + /* change to lowercase and '_' to '-' */ + return g_strdelimit (g_ascii_strdown (language, -1), "_", '-'); + + return NULL; +} + +/* Adds a quality value to a string (any value between 0 and 1). */ +static gchar * +sokoke_add_quality_value (const gchar *str, + float qvalue) +{ + if ((qvalue >= 0.0) && (qvalue <= 1.0)) + { + int qv_int = (qvalue * 1000 + 0.5); + return g_strdup_printf ("%s;q=%d.%d", + str, (int) (qv_int / 1000), qv_int % 1000); + } + + return g_strdup (str); +} + +/* Returns a RFC2616 compliant languages list from system locales */ +static gchar * +sokoke_accept_languages (const gchar* const * lang_names) +{ + GArray *langs_garray = NULL; + char *cur_lang = NULL; + char *prev_lang = NULL; + char **langs_array; + char *langs_str; + float delta; + int i, n_lang_names; + + /* Calculate delta for setting the quality values */ + n_lang_names = g_strv_length ((gchar **)lang_names); + delta = 0.999 / (n_lang_names - 1); + + /* Build the array of languages */ + langs_garray = g_array_new (TRUE, FALSE, sizeof (char*)); + for (i = 0; lang_names[i] != NULL; i++) + { + cur_lang = sokoke_posix_lang_to_rfc2616 (lang_names[i]); + + /* Apart from getting a valid RFC2616 compliant + language, also get rid of extra variants */ + if (cur_lang && (!prev_lang || + (!strcmp (prev_lang, cur_lang) || !strstr (prev_lang, cur_lang)))) + { + + gchar *qv_lang = NULL; + + /* Save reference for further comparison */ + prev_lang = cur_lang; + + /* Add the quality value and append it */ + qv_lang = sokoke_add_quality_value (cur_lang, 1 - i * delta); + g_array_append_val (langs_garray, qv_lang); + } + } + + /* Fallback: add "en" if list is empty */ + if (langs_garray->len == 0) + { + gchar* fallback = g_strdup ("en"); + g_array_append_val (langs_garray, fallback); + } + + langs_array = (char **) g_array_free (langs_garray, FALSE); + langs_str = g_strjoinv (", ", langs_array); + + return langs_str; +} + + +static void +midori_web_settings_update_accept_language (MidoriWebSettings* settings) +{ + gchar* languages = settings->http_accept_language; + /* Empty, use the system locales */ + if (!(languages && *languages)) + katze_assign (settings->accept, sokoke_accept_languages (g_get_language_names ())); + /* No =, no ., looks like a list of language names */ + else if (!(strchr (languages, '=') && strchr (languages, '.'))) + { + gchar ** lang_names = g_strsplit_set (languages, ",; ", -1); + katze_assign (settings->accept, sokoke_accept_languages ((const gchar* const *)lang_names)); + g_strfreev (lang_names); + } + /* Presumably a well formatted list including priorities */ + else + katze_assign (settings->accept, g_strdup (languages)); +} + +const gchar* +midori_web_settings_get_accept_language (MidoriWebSettings* settings) +{ + if (!settings->accept) + midori_web_settings_update_accept_language (settings); + return settings->accept; +} + static void midori_web_settings_process_stylesheets (MidoriWebSettings* settings, gint delta_len); @@ -1724,6 +1842,7 @@ midori_web_settings_set_property (GObject* object, katze_assign (web_settings->http_accept_language, g_value_dup_string (value)); g_object_set (web_settings, "spell-checking-languages", web_settings->http_accept_language, NULL); + midori_web_settings_update_accept_language (web_settings); break; case PROP_CLEAR_PRIVATE_DATA: web_settings->clear_private_data = g_value_get_int (value); diff --git a/midori/midori-websettings.h b/midori/midori-websettings.h index 05db9710..6a1f25cd 100644 --- a/midori/midori-websettings.h +++ b/midori/midori-websettings.h @@ -190,6 +190,9 @@ MidoriSiteDataPolicy midori_web_settings_get_site_data_policy (MidoriWebSettings* settings, const gchar* uri); +const gchar* +midori_web_settings_get_accept_language (MidoriWebSettings* settings); + G_END_DECLS #endif /* __MIDORI_WEB_SETTINGS_H__ */ diff --git a/midori/sokoke.c b/midori/sokoke.c index 34d2b098..abccfd3d 100644 --- a/midori/sokoke.c +++ b/midori/sokoke.c @@ -1353,92 +1353,6 @@ sokoke_recursive_fork_protection (const gchar* uri, return g_strcmp0 (fork_uri, uri) == 0 ? FALSE : TRUE; } -/* Provide a new way for SoupSession to assume an 'Accept-Language' - string automatically from the return value of g_get_language_names(), - properly formatted according to RFC2616. - Copyright (C) 2009 Mario Sanchez Prada - Copyright (C) 2009 Dan Winship - Mostly copied from libSoup 2.29, coding style adjusted */ - -/* Converts a language in POSIX format and to be RFC2616 compliant */ -/* Based on code from epiphany-webkit (ephy_langs_append_languages()) */ -static gchar * -sokoke_posix_lang_to_rfc2616 (const gchar *language) -{ - if (!strchr (language, '.') && !strchr (language, '@') && language[0] != 'C') - /* change to lowercase and '_' to '-' */ - return g_strdelimit (g_ascii_strdown (language, -1), "_", '-'); - - return NULL; -} - -/* Adds a quality value to a string (any value between 0 and 1). */ -static gchar * -sokoke_add_quality_value (const gchar *str, - float qvalue) -{ - if ((qvalue >= 0.0) && (qvalue <= 1.0)) - { - int qv_int = (qvalue * 1000 + 0.5); - return g_strdup_printf ("%s;q=%d.%d", - str, (int) (qv_int / 1000), qv_int % 1000); - } - - return g_strdup (str); -} - -/* Returns a RFC2616 compliant languages list from system locales */ -gchar * -sokoke_accept_languages (const gchar* const * lang_names) -{ - GArray *langs_garray = NULL; - char *cur_lang = NULL; - char *prev_lang = NULL; - char **langs_array; - char *langs_str; - float delta; - int i, n_lang_names; - - /* Calculate delta for setting the quality values */ - n_lang_names = g_strv_length ((gchar **)lang_names); - delta = 0.999 / (n_lang_names - 1); - - /* Build the array of languages */ - langs_garray = g_array_new (TRUE, FALSE, sizeof (char*)); - for (i = 0; lang_names[i] != NULL; i++) - { - cur_lang = sokoke_posix_lang_to_rfc2616 (lang_names[i]); - - /* Apart from getting a valid RFC2616 compliant - language, also get rid of extra variants */ - if (cur_lang && (!prev_lang || - (!strcmp (prev_lang, cur_lang) || !strstr (prev_lang, cur_lang)))) - { - - gchar *qv_lang = NULL; - - /* Save reference for further comparison */ - prev_lang = cur_lang; - - /* Add the quality value and append it */ - qv_lang = sokoke_add_quality_value (cur_lang, 1 - i * delta); - g_array_append_val (langs_garray, qv_lang); - } - } - - /* Fallback: add "en" if list is empty */ - if (langs_garray->len == 0) - { - gchar* fallback = g_strdup ("en"); - g_array_append_val (langs_garray, fallback); - } - - langs_array = (char **) g_array_free (langs_garray, FALSE); - langs_str = g_strjoinv (", ", langs_array); - - return langs_str; -} - /** * sokoke_register_privacy_item: * @name: the name of the privacy item diff --git a/midori/sokoke.h b/midori/sokoke.h index dcd62325..1bb5fe3f 100644 --- a/midori/sokoke.h +++ b/midori/sokoke.h @@ -175,9 +175,6 @@ sokoke_prefetch_uri (MidoriWebSettings* settings, gboolean sokoke_resolve_hostname (const gchar* hostname); -gchar * -sokoke_accept_languages (const gchar* const * lang_names); - gboolean sokoke_recursive_fork_protection (const gchar* uri, gboolean set_uri);