【问题标题】:Handling HTTP/1.1 Upgrade requests in CherryPy在 CherryPy 中处理 HTTP/1.1 升级请求
【发布时间】:2010-10-04 23:11:58
【问题描述】:

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

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

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

我对 CherryPy 还是很陌生,在文档中找不到任何关于如何处理特定客户端请求(例如上述)的内容。如果有人可以向我指出教程或部分 CherryPy 文档甚至是解决方案,那将非常有帮助。

【问题讨论】:

    标签: python cherrypy


    【解决方案1】:

    这在trunk中很容易做到(最终将是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
    

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

    【讨论】:

    • 谢谢!我正在使用 3.1 并最终将 HTTPConnection 和 HTTPRequest 子类化以使其正常工作。它非常丑陋,但很有趣......当 3.2 准备好时,我将重构为上述技术。
    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 2017-07-08
    • 2015-07-13
    • 2014-11-24
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多