[英]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浏览器中尝试使用该工具时,不会发生此类问题。
我不明白为什么会这样。
关于理解/解决问题的任何评论都将适用。
额外信息:
超时连接的类是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.