diff --git a/apiclient/http.py b/apiclient/http.py index 2132390..f4627bd 100644 --- a/apiclient/http.py +++ b/apiclient/http.py @@ -223,3 +223,42 @@ class HttpMockSequence(object): elif content == 'echo_request_body': content = body return httplib2.Response(resp), content + + +def set_user_agent(http, user_agent): + """ + Args: + http - An instance of httplib2.Http + or something that acts like it. + user_agent: string, the value for the user-agent header. + + Returns: + A modified instance of http that was passed in. + + Example: + + h = httplib2.Http() + h = set_user_agent(h, "my-app-name/6.0") + + Most of the time the user-agent will be set doing auth, this is for the rare + cases where you are accessing an unauthenticated endpoint. + """ + request_orig = http.request + + # The closure that will replace 'httplib2.Http.request'. + def new_request(uri, method='GET', body=None, headers=None, + redirections=httplib2.DEFAULT_MAX_REDIRECTS, + connection_type=None): + """Modify the request headers to add the user-agent.""" + if headers is None: + headers = {} + if 'user-agent' in headers: + headers['user-agent'] = user_agent + ' ' + headers['user-agent'] + else: + headers['user-agent'] = user_agent + resp, content = request_orig(uri, method, body, headers, + redirections, connection_type) + return resp, content + + http.request = new_request + return http diff --git a/tests/test_http.py b/tests/test_http.py new file mode 100644 index 0000000..b9e9f75 --- /dev/null +++ b/tests/test_http.py @@ -0,0 +1,52 @@ +#!/usr/bin/python2.4 +# +# Copyright 2010 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Http tests + +Unit tests for the apiclient.http. +""" + +__author__ = 'jcgregorio@google.com (Joe Gregorio)' + +import unittest + +from apiclient.http import set_user_agent +from apiclient.http import HttpMockSequence + + +class TestUserAgent(unittest.TestCase): + + def test_set_user_agent(self): + http = HttpMockSequence([ + ({'status': '200'}, 'echo_request_headers'), + ]) + + http = set_user_agent(http, "my_app/5.5") + resp, content = http.request("http://example.com") + self.assertEqual(content['user-agent'], 'my_app/5.5') + + def test_set_user_agent_nested(self): + http = HttpMockSequence([ + ({'status': '200'}, 'echo_request_headers'), + ]) + + http = set_user_agent(http, "my_app/5.5") + http = set_user_agent(http, "my_library/0.1") + resp, content = http.request("http://example.com") + self.assertEqual(content['user-agent'], 'my_app/5.5 my_library/0.1') + +if __name__ == '__main__': + unittest.main()