import socket
from time import time

class SimpleHttp(object):
        def __init__(self, host='127.0.0.1', port=5984, shared=False):
                self.host = host
                self.port = port
                self.shared = shared
                if shared:
                        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                        self.socket.connect((host, port))

        def getline(self, sock):
                buf = ''
                while buf[-2:] != '\r\n':
                        buf += sock.recv(1)
                return buf[:-2]

        def readheaders(self, sock):
                done = False
                while not done:
                        line = self.getline(sock)
                        if len(line) == 0:
                                done = True

        def chunkeddata(self, sock):
                done = False
                buf = ''
                while not done:
                        line = self.getline(sock)
                        size = int(line, 16)
                        if size == 0:
                                self.getline(sock)
                                done = True
                        else:
                                data = ''
                                while len(data) < size:
                                        data += sock.recv(size - len(data))
                                buf += data
                                self.getline(sock)
                return buf

        def benchmark(self, req='/', n=10):
                for i in xrange(10):
                        if self.shared:
                                s = self.socket
                        else:
                                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                                s.connect((self.host, self.port))

                        start = time()
                        s.send("GET %s HTTP/1.1\r\nHost: %s\r\n\r\n" % (req, self.host))
                        headers = self.readheaders(s)
                        data = self.chunkeddata(s)
                        print ' (%2d):   GET %6.2fms' % (i, (time() - start) * 1000)
                        if not self.shared:
                                s.close()

if __name__ == '__main__':
        bm1 = SimpleHttp()
        print "Simple benchmark:"
        bm1.benchmark()

        bm2 = SimpleHttp(shared=True)
        print "\nShared benchmark:"
        bm2.benchmark()

