在CherryPy中处理HTTP / 1.1升级请求

时间:2010-10-04 23:11:59

标签: python cherrypy

我正在将CherryPy用于Web服务器,但希望它能够处理HTTP/1.1 Upgrade个请求。因此,当客户发送:

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

我希望服务器在使用RFC 2817中指定的必要NEW_PROTOCOL回复后,将连接移交给某个HTTP/1.1 101 Switching Protocols...处理程序。

我对CherryPy很新,并且在文档中找不到有关如何处理上述特定客户端请求的任何内容。如果有人可以指向我的教程或CherryPy文档的一部分甚至是解决方案,那将非常有用。

1 个答案:

答案 0 :(得分:2)

这在trunk中相当容易(最终将是3.2最终版)。我确信它可以在旧版本中使用,但更复杂。

您需要做的就是创建一个wsgiserver.Gateway的新子类,查找有问题的标题,然后将其移出conn或继续执行常用网关。例如:

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

可能还有其他一些优点,但这是一般技术。