Jelmer Vernooij пре 2 година
родитељ
комит
e9faf83ac4
2 измењених фајлова са 20 додато и 5 уклоњено
  1. 3 2
      dulwich/client.py
  2. 17 3
      dulwich/tests/compat/test_client.py

+ 3 - 2
dulwich/client.py

@@ -1970,8 +1970,9 @@ class AbstractHttpGitClient(GitClient):
         headers = {
             "Content-Type": "application/x-%s-request" % service,
             "Accept": result_content_type,
-            "Content-Length": str(len(data)),
         }
+        if isinstance(data, bytes):
+            headers["Content-Length"] = str(len(data))
         resp, read = self._http_request(url, headers, data)
         if resp.content_type != result_content_type:
             raise GitProtocolError(
@@ -2033,7 +2034,7 @@ class AbstractHttpGitClient(GitClient):
                 yield from PackChunkGenerator(pack_data_count, pack_data)
 
         resp, read = self._smart_request(
-            "git-receive-pack", url, data=b"".join(body_generator())
+            "git-receive-pack", url, data=body_generator()
         )
         try:
             resp_proto = Protocol(read, None)

+ 17 - 3
dulwich/tests/compat/test_client.py

@@ -602,9 +602,23 @@ class GitHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
         try:
             nbytes = int(length)
         except (TypeError, ValueError):
-            nbytes = 0
-        if self.command.lower() == "post" and nbytes > 0:
-            data = self.rfile.read(nbytes)
+            nbytes = -1
+        if self.command.lower() == "post":
+            if nbytes > 0:
+                data = self.rfile.read(nbytes)
+            elif self.headers.get('transfer-encoding') == 'chunked':
+                chunks = []
+                while True:
+                    line = self.rfile.readline()
+                    length = int(line.rstrip(), 16)
+                    chunk = self.rfile.read(length + 2)
+                    chunks.append(chunk[:-2])
+                    if length == 0:
+                        break
+                data = b''.join(chunks)
+                env["CONTENT_LENGTH"] = str(len(data))
+            else:
+                raise AssertionError
         else:
             data = None
             env["CONTENT_LENGTH"] = "0"