imported patch partial-and-patch
diff --git a/apiclient/http.py b/apiclient/http.py
index f4627bd..206f3e6 100644
--- a/apiclient/http.py
+++ b/apiclient/http.py
@@ -10,6 +10,7 @@
 __author__ = 'jcgregorio@google.com (Joe Gregorio)'
 __all__ = [
     'HttpRequest', 'RequestMockBuilder', 'HttpMock'
+    'set_user_agent', 'tunnel_patch'
     ]
 
 import httplib2
@@ -17,6 +18,7 @@
 
 from model import JsonModel
 from errors import HttpError
+from anyjson import simplejson
 
 
 class HttpRequest(object):
@@ -201,6 +203,7 @@
   behavours that are helpful in testing.
 
   'echo_request_headers' means return the request headers in the response body
+  'echo_request_headers_as_json' means return the request headers in the response body
   'echo_request_body' means return the request body in the response body
   """
 
@@ -220,13 +223,16 @@
     resp, content = self._iterable.pop(0)
     if content == 'echo_request_headers':
       content = headers
+    elif content == 'echo_request_headers_as_json':
+      content = simplejson.dumps(headers)
     elif content == 'echo_request_body':
       content = body
     return httplib2.Response(resp), content
 
 
 def set_user_agent(http, user_agent):
-  """
+  """Set the user-agent on every request.
+
   Args:
      http - An instance of httplib2.Http
          or something that acts like it.
@@ -262,3 +268,43 @@
 
   http.request = new_request
   return http
+
+
+def tunnel_patch(http):
+  """Tunnel PATCH requests over POST.
+  Args:
+     http - An instance of httplib2.Http
+         or something that acts like it.
+
+  Returns:
+     A modified instance of http that was passed in.
+
+  Example:
+
+    h = httplib2.Http()
+    h = tunnel_patch(h, "my-app-name/6.0")
+
+  Useful if you are running on a platform that doesn't support PATCH.
+  Apply this last if you are using OAuth 1.0, as changing the method
+  will result in a different signature.
+  """
+  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 method == 'PATCH':
+      if 'authorization' in headers and 'oauth_token' in headers['authorization']:
+        logging.warning('OAuth 1.0 request made with Credentials applied after tunnel_patch.')
+      headers['x-http-method-override'] = "PATCH"
+      method = 'POST'
+    resp, content = request_orig(uri, method, body, headers,
+                        redirections, connection_type)
+    return resp, content
+
+  http.request = new_request
+  return http