

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)

