Обработка запросов на обновление HTTP / 1.1 в CherryPy - PullRequest
3 голосов
/ 05 октября 2010

Я использую CherryPy для веб-сервера, но хотел бы, чтобы он обрабатывал HTTP/1.1 Upgrade запросы.Таким образом, когда клиент отправляет:

OPTIONS * HTTP/1.1
Upgrade: NEW_PROTOCOL/1.0
Connection: Upgrade

Я бы хотел, чтобы сервер передал соединение некоторому обработчику NEW_PROTOCOL после ответа с необходимым HTTP/1.1 101 Switching Protocols..., как указано в RFC 2817.

Я довольно новичок в CherryPy и не могу найти в документации ничего о том, как обрабатывать определенные клиентские запросы, такие как приведенные выше.Если бы кто-то мог указать мне учебник или части документации CherryPy или даже решение, это было бы очень полезно.

1 Ответ

2 голосов
/ 07 октября 2010

Это довольно легко сделать в транке (который в конечном итоге будет 3.2 финальным).Я уверен, что это возможно в более старых версиях, но гораздо более запутанно.

Все, что вам нужно сделать, - это создать новый подкласс wsgiserver.Gateway, который ищет соответствующие заголовки, а затем либо отложить соединение, либо продолжитьк обычным воротам.Например:

class UpgradeGateway(Gateway):
    def respond(self):
        h = self.req.inheaders
        if h.get("Connection", "") == "Upgrade":
            # Turn off auto-output of HTTP response headers
            self.req.sent_headers = True
            # Not sure exactly what you want to pass or how, here's a start...
            return protocols[h['Upgrade']].handle(self.req.rfile, self.req.wfile)
        else:
            return old_gateway(self.req).respond()

old_gateway = cherrypy.server.httpserver.gateway
cherrypy.server.httpserver.gateway = UpgradeGateway

Может быть пара других тонкостей, но это общая техника.

...