From ade8728d7154e3d9c81020b319f0cf3b5d095176 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Mon, 26 Apr 2021 23:06:29 -0700 Subject: [PATCH 1/2] Fix CGI Handling of POST on Windows. --- Lib/http/server.py | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/Lib/http/server.py b/Lib/http/server.py index 94f730ed3445bef..9976ca022e1566a 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1192,20 +1192,41 @@ def run_cgi(self): nbytes = int(length) except (TypeError, ValueError): nbytes = 0 + + data = None + rfile = None + + if self.command.lower() == "post" and nbytes > 0: + data = self.rfile.read(nbytes) + if len(data) < nbytes: + import tempfile + rfile = tempfile.TemporaryFile("wb+") + rfile.write(data) + bufsize = 2 << 16 + while True: + buf = self.rfile.read(bufsize) + if not buf: + break + rfile.write(buf) + if rfile.tell() == nbytes: + break + rfile.seek(0) + data = None + + while select.select([self.rfile._sock], [], [], 0)[0]: + if not self.rfile._sock.recv(1): + break + + stdin = subprocess.PIPE + if rfile is not None: + stdin = rfile p = subprocess.Popen(cmdline, - stdin=subprocess.PIPE, + stdin=stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env = env ) - if self.command.lower() == "post" and nbytes > 0: - data = self.rfile.read(nbytes) - else: - data = None - # throw away additional data [see bug #427345] - while select.select([self.rfile._sock], [], [], 0)[0]: - if not self.rfile._sock.recv(1): - break + stdout, stderr = p.communicate(data) self.wfile.write(stdout) if stderr: From 488d18cf72852f03386bebe018f011b9aab500ce Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Tue, 27 Apr 2021 05:25:26 -0700 Subject: [PATCH 2/2] Preserve the comment for the select call. --- Lib/http/server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/http/server.py b/Lib/http/server.py index 9976ca022e1566a..f27ccf1f7547385 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1213,6 +1213,7 @@ def run_cgi(self): rfile.seek(0) data = None + # throw away additional data [see bug #427345] while select.select([self.rfile._sock], [], [], 0)[0]: if not self.rfile._sock.recv(1): break