[Python-checkins] CVS: python/dist/src/Lib CGIHTTPServer.py,1.20,1.21

Guido van Rossum gvanrossum@users.sourceforge.net
Fri, 01 Feb 2002 08:28:01 -0800


Update of /cvsroot/python/python/dist/src/Lib
In directory usw-pr-cvs1:/tmp/cvs-serv9084

Modified Files:
	CGIHTTPServer.py 
Log Message:
Wesley Chun's SF patch 511380: add CGIHTTPServer error supt for Win32

This uses os.popen3 (if it exists) to ensure that errors from a
non-Python CGI script are logged.

Bugfix candidate.


Index: CGIHTTPServer.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/CGIHTTPServer.py,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** CGIHTTPServer.py	2001/10/26 03:38:14	1.20
--- CGIHTTPServer.py	2002/02/01 16:27:59	1.21
***************
*** 42,45 ****
--- 42,46 ----
      have_fork = hasattr(os, 'fork')
      have_popen2 = hasattr(os, 'popen2')
+     have_popen3 = hasattr(os, 'popen3')
  
      # Make rfile unbuffered -- we need to read one line and then pass
***************
*** 124,128 ****
          ispy = self.is_python(scriptname)
          if not ispy:
!             if not (self.have_fork or self.have_popen2):
                  self.send_error(403, "CGI script is not a Python script (%s)" %
                                  `scriptname`)
--- 125,129 ----
          ispy = self.is_python(scriptname)
          if not ispy:
!             if not (self.have_fork or self.have_popen2 or self.have_popen3):
                  self.send_error(403, "CGI script is not a Python script (%s)" %
                                  `scriptname`)
***************
*** 215,221 ****
                  os._exit(127)
  
!         elif self.have_popen2:
!             # Windows -- use popen2 to create a subprocess
              import shutil
              os.environ.update(env)
              cmdline = scriptfile
--- 216,226 ----
                  os._exit(127)
  
!         elif self.have_popen2 or self.have_popen3:
!             # Windows -- use popen2 or popen3 to create a subprocess
              import shutil
+             if self.have_popen3:
+                 popenx = os.popen3
+             else:
+                 popenx = os.popen2
              os.environ.update(env)
              cmdline = scriptfile
***************
*** 233,237 ****
              except:
                  nbytes = 0
!             fi, fo = os.popen2(cmdline, 'b')
              if self.command.lower() == "post" and nbytes > 0:
                  data = self.rfile.read(nbytes)
--- 238,246 ----
              except:
                  nbytes = 0
!             files = popenx(cmdline, 'b')
!             fi = files[0]
!             fo = files[1]
!             if self.have_popen3:
!                 fe = files[2]
              if self.command.lower() == "post" and nbytes > 0:
                  data = self.rfile.read(nbytes)
***************
*** 239,242 ****
--- 248,256 ----
              fi.close()
              shutil.copyfileobj(fo, self.wfile)
+             if self.have_popen3:
+                 errors = fe.read()
+                 fe.close()
+                 if errors:
+                     self.log_error('%s', errors)
              sts = fo.close()
              if sts: