Gambit
gambit at alpenjodel.de
Mon Jul 23 21:57:29 EDT 2007
Thanks for the reply. It's an old cgi script someone else wrote. I rewrote it to use mod_python style req.form parameters and it works now, so this is mostly an academic discussion. Yes, I'm pretty sure I'm under mod_python, I won't post the server configuration here as this server is managed trough the Plesk control panel which means the configuration is split in many complex files all over the place (I didn't modify anything in this server so this is its default mod_python configuration), but this works on the same file: import mod_python def index(req): req.content_type = "text/plain" return "Hello World!" This is the kind of offending code I was talking about: import cgi import os form = cgi.FieldStorage() if form.has_key("dir"): root_dir = form["dir"].value if os.path.commonprefix([document_root, root_dir]) != document_root: print 'Invalid dir' sys.exit(1) else: root_dir = document_root Here the dir parameter comes from a get. Under plain old cgi form.has_key("dir") is true but not so under mod_python. Another test: import cgi cgi.test() If called as http://my.server/script.py?foo=bar I get an empty "Form Contents" section but the QUERY_STRING variable is foo=bar as expected. Under CGI "Form Contents" is: foo: <type 'instance'> MiniFieldStorage('foo', 'bar') I found this to be weird. mod_python makes available both get and post variables from req.form and so does cgi.FieldStorage() unless the latter it's being run under mod_python in which case post variables are available but not get... Of course one can rewrite the script to use req.form or util.FieldStorage() but an unmodified python cgi script won't work as expected... I always thought one of the goals of mod_python was to provide an upgrade path for cgi scripts but it seems many cgi scripts won't work out of the box with it. Thanks,
|