~ read.

Simple HTTP Server that will give serve simple files and can emulate delay before giving response

On one of my projects i had a task where i needed to make a  simple http server that would give one xml file for our service (Trying to emulate and verify sync between two services). But besides that i had also to check that application behaves properly when you get timeout from the server on the other end. So, i've started googling and found really nice and fast solution with python SimpleHTTPServer. I found it here and modified it a little bit for my purposes with delay emulation. Here's the code :

#!/usr/bin/env python
 
import SimpleHTTPServer, BaseHTTPServer, SocketServer, socket, time, sys
 
class ThreadedHTTPServer(SocketServer.ThreadingMixIn,
                         BaseHTTPServer.HTTPServer) :
    """
    New features w/r to BaseHTTPServer.HTTPServer:
    - serves multiple requests simultaneously
    - catches socket.timeout and socket.error exceptions (raised from
      RequestHandler)
    """
    def setDelay(self):
        try:
            delay = sys.argv[2]
        except IndexError:
            delay = 0.0
        return delay
    
    def __init__(self, *args):
        BaseHTTPServer.HTTPServer.__init__(self,*args)
 
    def process_request_thread(self, request, client_address):
        """
        Overrides SocketServer.ThreadingMixIn.process_request_thread
        in order to catch socket.timeout
        """
        try:
            time.sleep(self.setDelay())
            self.finish_request(request, client_address)
            self.close_request(request)
        except socket.timeout:
            print 'Timeout during processing of request from',
            print client_address
        except socket.error, e:
            print e, 'during processing of request from',
            print client_address
        except:
            self.handle_error(request, client_address)
            self.close_request(request)
 
 
class TimeoutHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    """
    Abandon request handling when client has not responded for a
    certain time. This raises a socket.timeout exception.
    """
 
    # Class-wide value for socket timeout
    timeout = 3 * 60 
 
    def setup(self):
        "Sets a timeout on the socket"
        self.request.settimeout(self.timeout)
        SimpleHTTPServer.SimpleHTTPRequestHandler.setup(self)
 
 
def main():
    try:
        BaseHTTPServer.test(TimeoutHTTPRequestHandler, ThreadedHTTPServer)
        print "Delay time is %s" %self.delay
    except KeyboardInterrupt:
        print '^C received, shutting down server'
 
if __name__ == '__main__':
    main()

You can save it as server.py and they simple run it on your server as: python server.py 8081 It will run this server on 8081 port ( you can change it to any free port you want) . Second value is for delay - 0 if you want server to respond right away, !=0 - set how many seconds you want server to wait before responding.

It's very fast and easy way to check this things, and i'm pretty sure i will use it in the future and maybe will modify and improve it when it will be needed. The beauty of this method is that you don't have to setup any server and launch it. All you need is installed Python ( which is already preinstalled on any Unix machine) and this file.

comments powered by Disqus
comments powered by Disqus