import httplib from eventlet import api from eventlet import httpc from eventlet import wsgi from eventlet import util util.wrap_socket_with_coroutine_socket() from eventlet.hubs import selects api.use_hub(selects) def upgrade_app(env, start_response): start_response( '101 Switching Protocols', [('Content-type', 'text-plain'), ('Upgrade', 'PTTH/1.0')]) return [''] def app(env, start_response): start_response('200 OK', [('Content-type', 'text-plain')]) return ['Hello, world\r\n'] def reverse_app(env, start_response): start_response('200 OK', [('Content-type', 'text-plain')]) return ['rdlrow ,olleH\r\n'] CONNECTIONS = [] class PtthProtocol(wsgi.HttpProtocol): def handle_one_response(self): upgrade = self.headers.getheader('upgrade') if upgrade and 'PTTH/1.0' in upgrade: self.application = upgrade_app wsgi.HttpProtocol.handle_one_response(self) ## Now the socket is ours forever CONNECTIONS.append(self.connection) return wsgi.HttpProtocol.handle_one_response(self) class PtthConnection(httplib.HTTPConnection): def __init__(self, socket): host, port = socket.getpeername() httplib.HTTPConnection.__init__(self, host, port) self.sock = socket def connect(self): pass api.spawn( wsgi.server, api.tcp_listener(('127.0.0.1', 9999)), app, protocol=PtthProtocol) print httpc.post('http://localhost:9999/') connection = httpc.connect('http://localhost:9999/') connection.request("POST", '/', '', {'Upgrade': 'PTTH/1.0'}) response = connection.getresponse() assert response.msg.getheader('upgrade') == 'PTTH/1.0' serv = wsgi.Server(None, None, reverse_app) api.spawn(serv.process_request, (response.fp.sock, (0, 0))) conn = PtthConnection(CONNECTIONS[0]) print httpc.get('/', connection=conn)