繁体   English   中英

Python扭曲,SSL超时错误

[英]Python Twisted, SSL Timeout Error

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连接时,在两种情况下它都会按预期超时连接。
  • 连接此服务器的扭曲客户端也会影响预期的超时。

超时连接的类是TimeoutMixin类。

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

以某种方式,DefaultOpenSSLFactory使用connection(?),因此lostConnection方法等待传输完成,并且此时它不接受连接上的任何进程。

根据扭曲的文档:

在上面的代码中,写入传输后立即调用lostConnection。 仅当所有数据都已通过Twisted输出到操作系统时,LostConnection调用才会关闭连接,因此在这种情况下可以安全使用,而不必担心丢失传输写操作。 如果将生产者与传输一起使用,则只有在未注册生产者后,lostConnection才会关闭连接。

在某些情况下,等待直到所有数据都被写出并不是我们想要的。 由于网络故障,连接另一端的错误或恶意,写入传输的数据可能无法传递,因此即使调用了LosConnection,连接也不会丢失。 在这些情况下,可以使用abortConnection:无论传输中仍未写入的缓冲数据还是仍在注册的生产者,它都会立即关闭连接。 请注意,abortConnection仅在Twisted 11.1和更高版本中可用。

结果,当我通过重写而在timeoutMixinClass上使用abortConnection()更改了LostConnection()时,情况不再发生。

当我弄清楚为什么lostConnection不足以在特定情况下关闭连接的原因时,我将在此处进行说明。 (对此的任何评论将不胜感激)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM