summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2014-08-24 17:14:32 +0100
committerPhilip Withnall <philip.withnall@collabora.co.uk>2014-08-24 17:16:05 +0100
commit6e89b033b33fcc8e8316e58f0ee28f3809ca9667 (patch)
treebfaf8a599c7a183a1bc7a1ce38e5159b89ec942a
parentc55465b20f4f3560198894a61b0613b1b72cf4de (diff)
downloadlibgdata-6e89b033b33fcc8e8316e58f0ee28f3809ca9667.tar.gz
core: Add gzip encoding support
libsoup already transparently supported gzip encoding of data from the server, using SoupContentDecoder, which is present by default in a SoupSession. We were correctly sending the Accept-Encoding header, but Google also require that the string ‘gzip’ be present in the User-Agent header to enable gzip support. Add a User-Agent header which supports this. https://bugzilla.gnome.org/show_bug.cgi?id=666623
-rw-r--r--gdata/gdata-service.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/gdata/gdata-service.c b/gdata/gdata-service.c
index 78600e2f..8ac96ed4 100644
--- a/gdata/gdata-service.c
+++ b/gdata/gdata-service.c
@@ -2290,6 +2290,24 @@ _gdata_service_get_log_level (void)
return level;
}
+/* Build a User-Agent value to send to the server.
+ *
+ * If we support gzip, we can request gzip from the server by both including
+ * the appropriate Accept-Encoding header and putting 'gzip' in the User-Agent
+ * header:
+ * - https://developers.google.com/drive/web/performance#gzip
+ * - http://googleappsdeveloper.blogspot.co.uk/2011/12/optimizing-bandwidth-usage-with-gzip.html
+ */
+static gchar *
+build_user_agent (gboolean supports_gzip)
+{
+ if (supports_gzip) {
+ return g_strdup_printf ("libgdata/%s - gzip", VERSION);
+ } else {
+ return g_strdup_printf ("libgdata/%s", VERSION);
+ }
+}
+
/**
* _gdata_service_build_session:
*
@@ -2305,6 +2323,7 @@ _gdata_service_build_session (void)
{
SoupSession *session;
gboolean ssl_strict = TRUE;
+ gchar *user_agent;
/* Iff LIBGDATA_LAX_SSL_CERTIFICATES=1, relax SSL certificate validation to allow using invalid/unsigned certificates for testing. */
if (g_strcmp0 (g_getenv ("LIBGDATA_LAX_SSL_CERTIFICATES"), "1") == 0) {
@@ -2315,6 +2334,10 @@ _gdata_service_build_session (void)
"timeout", 0,
NULL);
+ user_agent = build_user_agent (soup_session_has_feature (session, SOUP_TYPE_CONTENT_DECODER));
+ g_object_set (session, "user-agent", user_agent, NULL);
+ g_free (user_agent);
+
soup_session_add_feature_by_type (session, SOUP_TYPE_PROXY_RESOLVER_DEFAULT);
/* Log all libsoup traffic if debugging's turned on */