A couple of very basic examples of what can be done with httpmessage.
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...'
|
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...'
|