Package concurrent_tree_crawler :: Package common :: Module delayed_http_files_server
[hide private]
[frames] | no frames]

Source Code for Module concurrent_tree_crawler.common.delayed_http_files_server

 1  import sys 
 2  import os 
 3  import threading 
 4  import SocketServer 
 5  import time 
 6  import SimpleHTTPServer 
 7   
 8   
9 -class DelayedHTTPFilesServer:
10 """ 11 HTTP Files server with a new thread created for each new connection. 12 Execution of work of each thread is delayed by a given amount of time. 13 """ 14
15 - def __init__(self, directory_to_serve, delay, host="localhost", port_no=0):
16 """ 17 @param directory_to_serve: directory which will be served 18 @param delay: delay time of serving each page in seconds 19 @param host: server's host address 20 @param port_no: number of port to listen on. Port C{0} means that 21 the server will use an arbitrary unused port. 22 """ 23 self.__dir_to_serve = directory_to_serve 24 self.__delay = delay 25 self.__host = host 26 self.__port_no = port_no 27 self.__server = None 28 self.__server_thread = None
29
30 - def start(self):
31 """ 32 Start the server in a new thread. 33 34 @return: server's (IP address, port number) pair 35 """ 36 self.__server = _ThreadedTCPServer( 37 self.__delay, self.__dir_to_serve, 38 (self.__host, self.__port_no), _DelayedFilesServerHandler) 39 40 self.__server_thread = threading.Thread( 41 target=self.__server.serve_forever) 42 self.__server_thread.setDaemon(True) 43 self.__server_thread.start() 44 return self.__server.server_address
45
46 - def stop(self):
47 """ 48 Stop the server and wait until it shuts down 49 """ 50 self.__server.shutdown() 51 self.__server_thread.join() 52 self.__server = None 53 self.__server_thread = None
54
55 - def __enter__(self):
56 return self
57
58 - def __exit__(self, type_, value, traceback):
59 self.stop()
60
61 -class _DelayedFilesServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
62 - def handle(self):
63 time.sleep(self.server.delay) 64 old_wd = os.getcwd() 65 os.chdir(self.server.dir_to_serve) 66 SimpleHTTPServer.SimpleHTTPRequestHandler.handle(self) 67 os.chdir(old_wd)
68 69 ## Override the standard implementation that prints to sys.stderr and 70 ## print to sys.stdout instead
71 - def log_message(self, format_, *args):
72 sys.stdout.write("{} - - [{}] {}\n".format( 73 self.address_string(), self.log_date_time_string(), 74 format_%args))
75
76 -class _ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
77 - def __init__(self, delay, dir_to_serve, (host, port), my_TCP_handler):
78 SocketServer.TCPServer.__init__(self, (host, port), my_TCP_handler) 79 self.delay = delay 80 self.dir_to_serve = dir_to_serve
81