Code Examples

A couple of very basic examples of what can be done with httpmessage.

Proxy Server

A proxy server. Does the simplest thing, buffering the entire http request or response before handing it off to server or client, respectively.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/evn python
# examples/proxyserv_v1.py

try:
    import httpmessage
except ImportError:
    import sys
    from os.path import dirname, abspath, join
    sys.path.append(abspath(join(dirname(__file__), '..')))

from SocketServer import TCPServer, StreamRequestHandler, ThreadingMixIn
from httpmessage import HttpMessage

class ThreadingProxyServer(ThreadingMixIn, TCPServer):
    allow_reuse_address = True
    daemon_threads = True

class ProxyHandler(StreamRequestHandler):

    """Buffers the entire request before sending it to server. Buffers entire
    response before sending it to client. Doesn't work at all well for large
    resources (like Youtube videos)."""

    def handle(self):
        request = HttpMessage(socket=self.connection)
        response = request.fetch_response()
        response.connection = 'close'
        self.connection.send(str(response))


if __name__ == "__main__":
    server_address = ('', 8000)
    proxyserver = ThreadingProxyServer(server_address, ProxyHandler)
    print 'proxy serving on %r' % (server_address,)
    try:
        proxyserver.serve_forever()
    except KeyboardInterrupt:
        print '\nexiting...'

A slightly more sophisticated proxy server. It buffers an entire HTTP request (which tends to not have an entity body) before relaying it to the server, but sends the response along to the client as it is received.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/evn python
# examples/proxyserv_v2.py

try:
    import httpmessage
except ImportError:
    import sys
    from os.path import dirname, abspath, join
    sys.path.append(abspath(join(dirname(__file__), '..')))

from SocketServer import TCPServer, StreamRequestHandler, ThreadingMixIn
from httpmessage import HttpMessage
import httpmessage.dispatch as dispatch

class ThreadingProxyServer(ThreadingMixIn, TCPServer):
    allow_reuse_address = True
    daemon_threads = True

class ProxyHandlerV2(StreamRequestHandler):

    """Buffers entire request before sending it to server. Returns response
    bytes to client as they are received."""

    def recv_rawdata(self, signal, sender, raw_data):
        assert signal == dispatch.signal.RAW_DATA
        try:
            self.connection.send(raw_data)
        except Exception, e:
            print 'failed to send data because %r' % e
            return dispatch.response.ABORT
        print 'recv [%i] bytes' % len(raw_data)

    def handle(self):
        request = HttpMessage(socket=self.connection)
        response = request.fetch_response()
        response.connection = 'close'
        recv_fn = self.recv_rawdata
        dispatch.connect(
                recv_fn, dispatch.signal.RAW_DATA, response
            )
        self.connection.send(response.str_head())
        response.buffer_all()
        dispatch.disconnect(recv_fn)



if __name__ == "__main__":
    server_address = ('', 8000)
    proxyserver = ThreadingProxyServer(server_address, ProxyHandlerV2)
    print 'proxy serving on %r' % (server_address,)
    try:
        proxyserver.serve_forever()
    except KeyboardInterrupt:
        print '\nexiting...'

Text Chat

A very simple chat program demo. Run the program in two shells on the same computer, and you can talk back and forth between them. The first one to the host/port ('',7777) is the server, the second is a client.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/evn python
# examples/chat.py

try:
    import httpmessage
except ImportError:
    import sys
    from os.path import dirname, abspath, join
    sys.path.append(abspath(join(dirname(__file__), '..')))

from httpmessage import HttpMessage, RequestMessage
import httpmessage.exc as exc
import socket, select, sys

class TextChatRequest(RequestMessage):
    def __init__(self, text):
        super(TextChatRequest,self).__init__()
        self.method = 'POST'
        self.write(text)
        self.content_type = 'text/plain'
        self.content_length = self.tell()
        self.seek(0)

if __name__ == '__main__':
    netloc = ('', 7777)
    try:
        servsock = socket.socket()
        servsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        servsock.bind(netloc)
        servsock.listen(5)
        sock, _ = servsock.accept()
    except socket.error:
        sock = socket.socket()
        sock.connect(netloc)
    
    try:
        while True:
            r_ok, _, _ = select.select([sys.stdin, sock], [], [])
            for fd in r_ok:
                if fd == sys.stdin:
                    text = fd.readline().strip()
                    if text:
                        tcr = TextChatRequest(text)
                        sock.send(str(tcr))
                elif fd == sock:
                    msg = HttpMessage(socket=sock)
                    print msg.read()
    except (KeyboardInterrupt, exc.HttpMessageException):
        pass
    finally:
        print '\nexiting...'

Table Of Contents

Previous topic

message — representation of HTTP messages

This Page