From fb280d10fdb05f301141f8a90f72d5c0e34b4497 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Wed, 11 Aug 2010 11:54:05 -0400 Subject: [PATCH] Fix auto-Accept-Language in locales that use "," for decimals noticed in related epiphany code in bug 602547 --- libsoup/soup-session.c | 13 ++++++------ tests/misc-test.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c index 5916771..1dbde5a 100644 --- a/libsoup/soup-session.c +++ b/libsoup/soup-session.c @@ -756,13 +756,14 @@ add_quality_value (const gchar *str, int quality) { g_return_val_if_fail (str != NULL, NULL); - if (quality > 0 && quality < 100) { - double qvalue = quality / 100.0; - return g_strdup_printf ("%s;q=%.2g", str, qvalue); - } else { - /* Just dup the string in this case */ + if (quality >= 0 && quality < 100) { + /* We don't use %.02g because of "." vs "," locale issues */ + if (quality % 10) + return g_strdup_printf ("%s;q=0.%02d", str, quality); + else + return g_strdup_printf ("%s;q=0.%d", str, quality / 10); + } else return g_strdup (str); - } } /* Returns a RFC2616 compliant languages list from system locales */ diff --git a/tests/misc-test.c b/tests/misc-test.c index 8b462c5..b1c9eab 100644 --- a/tests/misc-test.c +++ b/tests/misc-test.c @@ -581,6 +581,59 @@ do_content_length_framing_test (void) soup_test_session_abort_unref (session); } +static void +do_one_accept_language_test (const char *language, const char *expected_header) +{ + SoupSession *session; + SoupMessage *msg; + const char *val; + + debug_printf (1, " LANGUAGE=%s\n", language); + g_setenv ("LANGUAGE", language, TRUE); + session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, + SOUP_SESSION_ACCEPT_LANGUAGE_AUTO, TRUE, + NULL); + msg = soup_message_new_from_uri ("GET", base_uri); + soup_session_send_message (session, msg); + soup_test_session_abort_unref (session); + + if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { + debug_printf (1, " Message failed? %d %s\n", + msg->status_code, msg->reason_phrase); + errors++; + } + val = soup_message_headers_get_list (msg->request_headers, + "Accept-Language"); + if (!val) { + debug_printf (1, " No Accept-Language set!\n"); + errors++; + } else if (strcmp (val, expected_header) != 0) { + debug_printf (1, " Wrong Accept-Language: expected '%s', got '%s'\n", + expected_header, val); + errors++; + } + + g_object_unref (msg); +} + +static void +do_accept_language_test (void) +{ + const char *orig_language; + + debug_printf (1, "\nAutomatic Accept-Language processing\n"); + + orig_language = g_getenv ("LANGUAGE"); + do_one_accept_language_test ("C", "en"); + do_one_accept_language_test ("fr_FR", "fr-fr, fr;q=0.9"); + do_one_accept_language_test ("fr_FR:de:en_US", "fr-fr, fr;q=0.9, de;q=0.8, en-us;q=0.7, en;q=0.6"); + + if (orig_language) + g_setenv ("LANGUAGE", orig_language, TRUE); + else + g_unsetenv ("LANGUAGE"); +} + int main (int argc, char **argv) { @@ -607,6 +660,7 @@ main (int argc, char **argv) do_star_test (); do_early_abort_test (); do_content_length_framing_test (); + do_accept_language_test (); soup_uri_free (base_uri); soup_test_server_quit_unref (server); -- 2.7.4