You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
#!/usr/bin/env python
|
|
|
|
import BaseHTTPServer, CGIHTTPServer
|
|
import cgitb; cgitb.enable() ## This line enables CGI error reporting
|
|
import sys, argparse, socket
|
|
from time import sleep
|
|
|
|
parser = argparse.ArgumentParser(description='Happy to serve you')
|
|
parser.add_argument('--port', type=int, default=8000, help='the port number to listen to')
|
|
parser.add_argument('-t', '--notryports', default=True, action="store_false", help='if a port is busy, automatically try other ones')
|
|
parser.add_argument('--share', default=False, action="store_true", help='Run as server accessible via your local network')
|
|
args = parser.parse_args()
|
|
server = BaseHTTPServer.HTTPServer
|
|
handler = CGIHTTPServer.CGIHTTPRequestHandler
|
|
handler.cgi_directories = ["/cgi-bin"]
|
|
tryports = args.notryports
|
|
port = args.port
|
|
ipaddr = None
|
|
|
|
if args.share:
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
s.connect(("wikipedia.org",80))
|
|
ipaddr = s.getsockname()[0]
|
|
s.close()
|
|
|
|
while True:
|
|
try:
|
|
if ipaddr:
|
|
server_address = (ipaddr, port)
|
|
servername = ipaddr
|
|
else:
|
|
server_address = ("localhost", port)
|
|
servername = "localhost"
|
|
httpd = server(server_address, handler)
|
|
print "Serving at --> http://{0}:{1}".format(servername, port)
|
|
httpd.serve_forever()
|
|
except socket.error, e:
|
|
if e.errno == 98:
|
|
if tryports:
|
|
if port < 2000:
|
|
port = 2000
|
|
else:
|
|
port += 1
|
|
sleep(.01)
|
|
else:
|
|
print """
|
|
====================================
|
|
Error: port ({0}) is already in use
|
|
====================================
|
|
|
|
You can pick another port number
|
|
(for example 9999) with:
|
|
|
|
serve --port 9999
|
|
""".format(port)
|
|
break
|
|
else:
|
|
raise(e)
|
|
|