#!/usr/bin/env python
# runcgi.py by Bryan Olson
# This Python program is free software. You may use it, distribute it,
# and/or modify it under the same terms as Python itself.
"""
Tests a cgi script, by launching a simple web server and sending the
default browser to the target cgi program. Good for testing. Not secure.
"""
import BaseHTTPServer
import CGIHTTPServer
import thread
import os
import webbrowser
import sys
from optparse import OptionParser
def main():
usage = "runcgi.py [options] target\n" + __doc__
root_opt = "Set the server root directory. Defaults to the current directory."
cgibin_opt = ("Set a cgi script directory, relative to the server root. "
"Option may be given multiple times for multiple script directories. "
"Defaults to the one directory holding target.")
port_opt = "Set the server's port number. By default the system chooses it."
query_opt = "URL query string, without the '?'. The default is no query"
parser = OptionParser(usage=usage)
parser.add_option("-r", "--root", default='.', help=root_opt)
parser.add_option("-c", "--cgi-bin", action="append", dest="cgibin", help=cgibin_opt)
parser.add_option("-p", "--port", type='int', default=0, help=port_opt)
parser.add_option("-q", "--query", default='', help=query_opt)
(options, args) = parser.parse_args()
if len(args) != 1:
print >> sys.stderr, "Error: need exactly one target cgi program."
parser.print_help()
sys.exit(-1)
cgi_target = args[0]
handler = CGIHTTPServer.CGIHTTPRequestHandler
os.chdir(options.root)
cgi_dirs = handler.cgi_directories
if options.cgibin is not None:
cgi_dirs[:] = options.cgibin
else:
cgi_dirs[:] = [os.path.split(cgi_target)[0]]
for i in range(len(cgi_dirs)):
if not cgi_dirs[i].startswith('/'):
cgi_dirs[i] = '/' + cgi_dirs[i]
if len(cgi_dirs[i]) > 1 and cgi_dirs[i].endswith('/'):
cgi_dirs[i] = cgi_dirs[i][:-1]
httpd = BaseHTTPServer.HTTPServer(('localhost', options.port), handler)
thread.start_new_thread(httpd.serve_forever, ())
url = 'http://%s:%d/%s' % ('localhost', httpd.server_port, cgi_target)
if options.query:
url = url + '?' + options.query
try:
webbrowser.open_new(url)
except Exception, e:
print >> sys.stderr, 'Failed automatic web browser launch: %s' % str(e)
print >> sys.stderr, 'Target URL is:', url
raw_input("Hit return to exit server.\n\n")
sys.exit(0)
if __name__ == '__main__':
main()
Diff to Previous Revision
--- revision 2 2010-12-28 17:52:01
+++ revision 3 2016-11-01 02:27:13
@@ -55,7 +55,7 @@
for i in range(len(cgi_dirs)):
if not cgi_dirs[i].startswith('/'):
cgi_dirs[i] = '/' + cgi_dirs[i]
- if cgi_dirs[i].endswith('/'):
+ if len(cgi_dirs[i]) > 1 and cgi_dirs[i].endswith('/'):
cgi_dirs[i] = cgi_dirs[i][:-1]
httpd = BaseHTTPServer.HTTPServer(('localhost', options.port), handler)