【问题标题】:Python Twisted, SSL Timeout ErrorPython Twisted,SSL 超时错误
【发布时间】:2013-02-22 08:57:53
【问题描述】:
from twisted.web.resource import Resource
from twisted.web.server import Site, Session
from twisted.internet import ssl
from twisted.internet import reactor

class Echo(Resource):
    def render_GET(self, request):
        return "GET"

class WebSite(Resource):
    def start(self):
        factory = Site(self, timeout=5)
        factory.sessionFactory = Session
        self.putChild("echo", Echo())
        reactor.listenSSL(443, factory, ssl.DefaultOpenSSLContextFactory('privkey.pem', 'cacert.pem'))
        #reactor.listenTCP(8080, factory)
        self.sessions = factory.sessions

if __name__ == '__main__':
    ws = WebSite()
    ws.start()
    reactor.run()

在上面的代码中,当我从 Web 浏览器输入 URL“https://localhost/echo”时,它会获取页面。 5秒后我尝试重新加载页面,它没有刷新网页,卡在重新加载操作中。在第二次尝试重新加载时,它会立即获取页面。

当我使用 reactor.listenTCP(8080, factory) 运行上面的代码时,不会出现此类问题。 (我可以重新加载页面而不会卡住重新加载并立即获取页面)

Chrome、Firefox 可能会重复出现问题。但是当我用 Ubuntu 的 Epiphany 浏览器尝试时,没有出现这样的问题。

我不明白为什么会这样。

任何关于理解/解决问题的评论都会被采纳。

额外信息:

  • 当我使用listenSSL 时,与连接相关的文件描述符在超时数秒后不会关闭。在重新加载页面时它保持静止,在第二次重新加载操作时,它关闭并打开新的文件描述符。 (我立即得到页面)
  • 当我使用listenTCP时,文件描述符在超时几秒后关闭,当我重新加载页面时,它会打开新的文件描述符并立即返回页面。
  • 还有 Telnet 连接,在这两种情况下都会按预期超时。
  • 连接此服务器的扭曲客户端也会按预期影响超时。

【问题讨论】:

    标签: python ssl https twisted


    【解决方案1】:

    超时连接的类是TimeoutMixin类。

    它使用 transport.loseConneciton() 方法来超时连接。

    不知何故,DefaultOpenSSLFactory 使用了连接(?),因此 lossConnection 方法等待完成传输,此时它不接受连接上的任何进程。

    根据扭曲的文档:

    在上面的代码中,looseConnection 在写入传输后立即被调用。仅当 Twisted 将所有数据写入操作系统时,looseConnection 调用才会关闭连接,因此在这种情况下使用它是安全的,而不必担心传输写入丢失。如果生产者正在与传输一起使用,则只有在取消注册生产者后,looseConnection 才会关闭连接。

    在某些情况下,等到所有数据写完并不是什么 我们想要。由于网络故障,或错误或恶意 连接的另一端,写入传输的数据可能不会 可交付的,所以即使 lostConnection 被称为 连接不会丢失。在这些情况下,abortConnection 可以 used:它立即关闭连接,不管缓冲 传输中仍未写入的数据,或 仍然注册。请注意, abortConnection 仅适用于 Twisted 11.1 及更高版本。

    因此,当我通过覆盖它在 timeoutMixinClass 上使用 abortConnection() 更改 lostConnection() 时,不再发生这种情况。

    当我澄清为什么looseConnection 不足以在特定情况下关闭连接的原因时,我会在此处注明。 (任何关于它的评论将不胜感激)

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 2019-11-01
      • 2012-02-25
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2013-12-07
      • 1970-01-01
      相关资源
      最近更新 更多