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 @@
     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()
