Pass library and Python version in x-goog-api-client (#734)
diff --git a/googleapiclient/model.py b/googleapiclient/model.py
index dded04e..7ab80e9 100644
--- a/googleapiclient/model.py
+++ b/googleapiclient/model.py
@@ -26,12 +26,14 @@
import json
import logging
+import platform
from six.moves.urllib.parse import urlencode
from googleapiclient import __version__
from googleapiclient.errors import HttpError
+_PY_VERSION = platform.python_version()
LOGGER = logging.getLogger(__name__)
@@ -144,7 +146,12 @@
headers['user-agent'] += ' '
else:
headers['user-agent'] = ''
- headers['user-agent'] += 'google-api-python-client/%s (gzip)' % __version__
+ headers['user-agent'] += '(gzip)'
+ if 'x-goog-api-client' in headers:
+ headers['x-goog-api-client'] += ' '
+ else:
+ headers['x-goog-api-client'] = ''
+ headers['x-goog-api-client'] += 'gdcl/%s gl-python/%s' % (__version__, _PY_VERSION)
if body_value is not None:
headers['content-type'] = self.content_type
diff --git a/tests/test_http.py b/tests/test_http.py
index 5aaada6..b92e63f 100644
--- a/tests/test_http.py
+++ b/tests/test_http.py
@@ -485,26 +485,22 @@
download = MediaIoBaseDownload(
fd=self.fd, request=self.request, chunksize=3)
- self.assertEqual(download._headers, {'Cache-Control':'no-store'})
+ self.assertEqual(download._headers.get('Cache-Control'), 'no-store')
status, done = download.next_chunk()
- result = self.fd.getvalue().decode('utf-8')
+ result = json.loads(self.fd.getvalue().decode('utf-8'))
- # we abuse the internals of the object we're testing, pay no attention
- # to the actual bytes= values here; we are just asserting that the
- # header we added to the original request is sent up to the server
- # on each call to next_chunk
+ # assert that that the header we added to the original request is
+ # sent up to the server on each call to next_chunk
- self.assertEqual(json.loads(result),
- {"Cache-Control": "no-store", "range": "bytes=0-3"})
+ self.assertEqual(result.get("Cache-Control"), "no-store")
download._fd = self.fd = BytesIO()
status, done = download.next_chunk()
- result = self.fd.getvalue().decode('utf-8')
- self.assertEqual(json.loads(result),
- {"Cache-Control": "no-store", "range": "bytes=51-54"})
+ result = json.loads(self.fd.getvalue().decode('utf-8'))
+ self.assertEqual(result.get("Cache-Control"), "no-store")
def test_media_io_base_download_handle_redirects(self):
self.request.http = HttpMockSequence([
diff --git a/tests/test_json_model.py b/tests/test_json_model.py
index 0d1f283..006eb47 100644
--- a/tests/test_json_model.py
+++ b/tests/test_json_model.py
@@ -26,6 +26,7 @@
import copy
import json
import os
+import platform
import unittest2 as unittest
import httplib2
import googleapiclient.model
@@ -143,8 +144,22 @@
headers, path_params, query_params, body)
self.assertEqual(headers['user-agent'],
- 'my-test-app/1.23.4 google-api-python-client/' + __version__ +
- ' (gzip)')
+ 'my-test-app/1.23.4 (gzip)')
+
+ def test_x_goog_api_client(self):
+ model = JsonModel(data_wrapper=False)
+
+ # test header composition for cloud clients that wrap discovery
+ headers = {'x-goog-api-client': 'gccl/1.23.4'}
+ path_params = {}
+ query_params = {}
+ body = {}
+
+ headers, unused_params, unused_query, body = model.request(
+ headers, path_params, query_params, body)
+
+ self.assertEqual(headers['x-goog-api-client'],
+ 'gccl/1.23.4' + ' gdcl/' + __version__ + ' gl-python/' + platform.python_version())
def test_bad_response(self):
model = JsonModel(data_wrapper=False)