Title: CGIHTTPRequestHandler.run_cgi() does not run on Windows if sys.executable contains blanks
Type: Stage:
Components: Windows Versions: Python 3.1, Python 3.2, Python 2.6, Python 2.5
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: orsenthil Nosy List: brian.curtin, christian.heimes, drukker, orsenthil, schu, stac
Priority: low Keywords: patch

Created on 2007-10-04 10:13 by schu, last changed 2009-11-11 17:26 by orsenthil. This issue is now closed.

File name Uploaded Description Edit stac, 2009-10-22 07:00 Python file
fix.tar stac, 2009-10-22 07:30 Tar file containing fix for 2.x and 3k
issue1235_fix.patch brian.curtin, 2009-11-11 17:11 fix to failures on r76211
Messages (15)
msg56229 - (view) Author: Andy Schumann (schu) Date: 2007-10-04 10:13
On Windows a path can contain spaces (e.g. C:\Program Files\python22
\python.exe). If using popenx each component in a command line has 
therefore to be double quoted as well as the whole command string.
The method run_cgi() of the class CGIHTTPRequestHandler in the module 
CGIHTTPServer does not do this.

Therefore the line 236:
cmdline = "%s -u %s" % (interp, cmdline)
should be replaced by
cmdline = '""%s" -u "%s""' % (interp, cmdline)
msg56238 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2007-10-05 15:05
Please submit a patch -- this was mostly intended as demo code, I didn't
expect anyone to use it, let alone on Windows. :-)
msg59181 - (view) Author: Christian Heimes (christian.heimes) * (Python committer) Date: 2008-01-03 23:49
The quoting issue on Windows can easily be fixed by using subprocess
instead of popen()
msg94312 - (view) Author: Stac (stac) Date: 2009-10-21 15:24

I am new to Python issues tracker. I had the error described above. I
worked on it.

I was not able to solve the issue only using subprocess. The command has
to be correctly formated (with the double quotes).

I corrected the cmdline definition as described first and migrated from
popen2 and popen3 to subprocess. I don't think I have the rights to
commit any code so I send the modified file.

Don't hesitate to tell me if you want me do to more.


PS : For information, the attached file correct the following error :

localhost - - [21/Oct/2009 17:20:52] "POST /cgi/ HTTP/1.1" 200 -
localhost - - [21/Oct/2009 17:20:52] command:
C:\Produits\Python26\python.exe -u C:\Documents and
Settings\stac\workspace\PyToolkit\src\network\cgi\ ""
localhost - - [21/Oct/2009 17:20:53] C:\Produits\Python26\python.exe:
can't open file 'C:\Documents': [Errno 2] No such file or directory

Now you have :
localhost - - [21/Oct/2009 16:48:46] "POST /cgi/ HTTP/1.1" 200 -
localhost - - [21/Oct/2009 16:48:46] command:
C:\Produits\Python26\python.exe -u "C:\Documents and
Settings\stac\workspace\PyToolkit\src\network\cgi\" ""
localhost - - [21/Oct/2009 16:48:47] CGI script exited OK
msg94336 - (view) Author: Derk Drukker (drukker) Date: 2009-10-22 06:37

Note that in py3k, CGIHTTPRequestHandler (Lib/http/ already
switched to using subprocess.

AFAICT, you didn't actually change cmdline, and so the problem remains.
msg94337 - (view) Author: Stac (stac) Date: 2009-10-22 07:00

I really feel sorry.
Well here is a version with the modified cmdline.
I will check how the migration was done in py3k. 

Just a quick question : why the changes done in py3k was not reported to
py2.x ?


msg94338 - (view) Author: Stac (stac) Date: 2009-10-22 07:30

I corrected the two versions.
Now the one for py2.x is closer to the fix for py3k.
You'll find below the fixed code for both version.


msg94339 - (view) Author: Derk Drukker (drukker) Date: 2009-10-22 08:28
The original problem reported concerned spaces in the path of the python
executable.  So interp needs to be in quotes, as well (as Andy already
suggested).  I've created a patch against the latest py3k, which I've
confirmed works and fixes this issue.

I'm not a core developer, so I don't know why it wasn't backported. I
don't know if this will make it into 2.6. Maybe trunk?
msg94454 - (view) Author: Derk Drukker (drukker) Date: 2009-10-25 15:02
More elegant than using quotes in the cmdline string is, IMO, passing a
sequence to subprocess.Popen instead.  I've put a new patch up for

I've also unified the Unix and Windows portions in run_cgi.  Both now
use subprocess.  (Which on Unix still calls fork and exec, as before.)
msg95122 - (view) Author: Senthil Kumaran (orsenthil) * (Python committer) Date: 2009-11-10 17:32
drukker: I verified your patch. Looks fine for changes made to the
subprocess call. 

You mentioned: I've also unified the Unix and Windows portions in
run_cgi.  Both now use subprocess."
I don't see it in the patch. Was it that you assumed changing the
variable to from cmdline to 'args' makes it unified for windows and
linux? But it does not.

Irrespective, this report can be addressed by the changes you suggested.
msg95125 - (view) Author: Derk Drukker (drukker) Date: 2009-11-10 18:26
orsenthil: I reverted the changes that make Windows and Unix use the
same code in Patch Set 3, and briefly mentioned the reason for that in
the Rietveld app.  I should have mentioned it here too.

It was because it actually makes the implementation on Unix worse, since
the Windows implementation reads all data in memory.  (The subprocess
module documentation has this note: "The data read is buffered in
memory, so do not use this method if the data size is large or unlimited.")

I tried replacing subprocess.PIPE with rfile/wfile, but it turns out
that that won't work, because on Windows socket.fileno() cannot be used
where file descriptors can be used, as the socket module documentation
msg95134 - (view) Author: Senthil Kumaran (orsenthil) * (Python committer) Date: 2009-11-11 01:36
Committed revision 76208 in trunk.  Shall look at the output of windows
buildbots and merge the changes to other codelines.
msg95136 - (view) Author: Senthil Kumaran (orsenthil) * (Python committer) Date: 2009-11-11 04:22
Committed revision 76209 - release26-maint
Committed revision 76210 - py3k
Committed revision 76211 - release31-maint

Thanks Derk for the patch.
msg95143 - (view) Author: Brian Curtin (brian.curtin) * (Python committer) Date: 2009-11-11 17:11
This change causes failures in test_httpservers on trunk r76211 on
Windows. I attached a simple patch which fixes the problem (NameError on
msg95144 - (view) Author: Senthil Kumaran (orsenthil) * (Python committer) Date: 2009-11-11 17:26
Thanks for the notification. Seems I over looked it. Fixed it with the
changes in 76212 (trunk) and 76213 (release26-maint). py3k did not have
this issue.
Date User Action Args
2009-11-11 17:26:52orsenthilsetmessages: + msg95144
2009-11-11 17:11:42brian.curtinsetfiles: + issue1235_fix.patch
nosy: + brian.curtin
messages: + msg95143

2009-11-11 04:22:46orsenthilsetstatus: open -> closed
resolution: fixed
messages: + msg95136
2009-11-11 01:36:02orsenthilsetmessages: + msg95134
2009-11-10 18:26:10drukkersetfiles: - fix-issue1235-py3k.patch
2009-11-10 18:26:02drukkersetmessages: + msg95125
2009-11-10 17:32:00orsenthilsetassignee: orsenthil

messages: + msg95122
nosy: + orsenthil
2009-10-25 15:02:46drukkersetmessages: + msg94454
2009-10-22 16:52:19gvanrossumsetnosy: - gvanrossum
2009-10-22 09:57:11stacsetfiles: -
2009-10-22 08:28:48drukkersetfiles: + fix-issue1235-py3k.patch
keywords: + patch
messages: + msg94339
2009-10-22 07:30:10stacsetfiles: + fix.tar

messages: + msg94338
2009-10-22 07:00:41stacsetfiles: +

messages: + msg94337
2009-10-22 06:37:18drukkersetnosy: + drukker

messages: + msg94336
versions: + Python 3.1, Python 3.2
2009-10-21 15:24:53stacsetfiles: +
versions: - Python 3.0
nosy: + stac

messages: + msg94312
2008-01-03 23:49:51christian.heimessetpriority: low
nosy: + christian.heimes
messages: + msg59181
versions: + Python 2.6, Python 2.5, Python 3.0, - Python 2.3
2007-10-05 15:05:53gvanrossumsetnosy: + gvanrossum
messages: + msg56238
2007-10-04 10:13:01schucreate