diff --git a/rhodecode/lib/middleware/utils/scm_app_http.py b/rhodecode/lib/middleware/utils/scm_app_http.py
--- a/rhodecode/lib/middleware/utils/scm_app_http.py
+++ b/rhodecode/lib/middleware/utils/scm_app_http.py
@@ -93,7 +93,6 @@ class VcsHttpProxy(object):
             'X-RC-Locked-Status-Code': rhodecode.CONFIG.get('lock_ret_code')
         })
 
-        data = environ['wsgi.input'].read()
         method = environ['REQUEST_METHOD']
 
         # Preserve the query string
@@ -104,7 +103,7 @@ class VcsHttpProxy(object):
 
         response = session.request(
             method, url,
-            data=data,
+            data=_maybe_stream_request(environ),
             headers=request_headers,
             stream=True)
 
@@ -120,10 +119,17 @@ class VcsHttpProxy(object):
             reason_phrase=response.reason)
 
         start_response(status, response_headers)
-        return _maybe_stream(response)
+        return _maybe_stream_response(response)
 
 
-def _maybe_stream(response):
+def _maybe_stream_request(environ):
+    if environ.get('HTTP_TRANSFER_ENCODING', '') == 'chunked':
+        return environ['wsgi.input']
+    else:
+        return environ['wsgi.input'].read()
+
+
+def _maybe_stream_response(response):
     """
     Try to generate chunks from the response if it is chunked.
     """