Created
November 28, 2011 16:20
-
-
Save perses76/1400954 to your computer and use it in GitHub Desktop.
BaseHttpServerRunner
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" 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