Skip to content

Instantly share code, notes, and snippets.

@perses76
Created November 28, 2011 16:20
Show Gist options
  • Save perses76/1400954 to your computer and use it in GitHub Desktop.
Save perses76/1400954 to your computer and use it in GitHub Desktop.
BaseHttpServerRunner
""" Wrapper for BaseHTTPServer.HTTPServer class. Runs server in other thread and allow
to stop and start server """
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
import socket
import urllib2
from threading import Thread
import time
DEFAULT_SIMPLE_HTTP_SERVER_PORT = 5053
DEFAULT_SERVER_URL = "http://localhost:%s/" % DEFAULT_SIMPLE_HTTP_SERVER_PORT
class BaseHttpServerRunner():
""" Wrapper for BaseHTTPServer.HTTPServer class. Runs server in other thread and allow
to stop and start server """
def __init__(self, handler, port = DEFAULT_SIMPLE_HTTP_SERVER_PORT):
self.port = port
self.handler = handler
self.keep_handler_request = False
self.server = None
def __del__(self):
self.stop()
def start(self):
self.thread = Thread(target=self.__do_run)
print "Try to start web service at the port %s" % self.port
self.thread.start()
while 1:
try:
self.__ping()
break
except urllib2.URLError as ex:
time.sleep(0.1)
except Exception as ex:
break
print "The web service at the port %s started successfully" % self.port
def __ping(self):
"send request to root adrress ('/') and wait replay"
f = urllib2.urlopen(DEFAULT_SERVER_URL)
result = f.read()
def __do_run(self):
server_address = ('', self.port)
self.server = HTTPServer(server_address, self.handler)
self.keep_handler_request = True
while self.keep_handler_request:
self.server.handle_request()
self.server = None
def stop(self):
self.keep_handler_request = False
if self.thread.isAlive():
print "Try to stop web server at the port: %s" % self.port
try:
self.__ping()
except (socket.error, urllib2.URLError) as ex:
print "Warning: final request failed: %s" % ex
finally:
self.thread.join()
print "The web server at the port %s stopped" % self.port
class SimpleHTTPHandler(BaseHTTPRequestHandler):
"""Simpe handler for testing """
def do_GET(request):
"""Respond to a GET request."""
request.send_response(200)
request.send_header("Content-type", "text/html")
request.end_headers()
request.wfile.write("<html><head><title>TestHTTPHandler</title></head>")
request.wfile.write("<body><p>This is a TestHTTPHandler.</p>")
# If someone went to "http://something.somewhere.net/foo/bar/",
# then s.path equals "/foo/bar/".
request.wfile.write("<p>You accessed path: %s</p>" % request.path)
request.wfile.write("</body></html>")
if __name__ == "__main__":
server = BaseHttpServerRunner(SimpleHTTPHandler)
try:
server.start()
print "Press Ctrl+C to stop web server"
except KeyboardInterrupt:
server.stop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment