[libsoup] Fix auto-Accept-Language in locales that use ", " for decimals



commit fb280d10fdb05f301141f8a90f72d5c0e34b4497
Author: Dan Winship <danw gnome org>
Date:   Wed Aug 11 11:54:05 2010 -0400

    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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]