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()
在上面的代码中,当我输入url" https:// localhost / echo"从Web浏览器,它获取页面。 5秒后我尝试重新加载页面,它不刷新网页,卡在重装操作上。在第二次重载尝试时,它立即获取页面。
当我使用reactor.listenTCP(8080,factory)运行上面的代码时,不会出现这样的问题。 (我可以重新加载页面而不会重新加载并立即获取页面)
Chrome,Firefox可以重复出现问题。但是,当我使用Ubuntu的Epiphany浏览器进行尝试时,不会出现这样的问题。
我无法理解为什么会这样。
任何有关理解/解决问题的评论都会受到批评。
额外信息:
答案 0 :(得分:1)
超时连接的类是TimeoutMixin类。
并使用transport.loseConneciton()方法来超时连接。
不知何故,DefaultOpenSSLFactory使用连接(?),因此loseConnection方法等待完成传输,此时它不接受连接上的任何进程。
根据扭曲的文件:
在上面的代码中,在写入传输后立即调用loseConnection。只有当所有数据都被Twisted写入操作系统时,loseConnection调用才会关闭连接,因此在这种情况下使用它是安全的,而不必担心传输写入丢失。如果生产者与传输一起使用,则lostConnection只会在生产者未注册后关闭连接。
在某些情况下,等到写出所有数据都不是 我们想要。由于网络故障,或者错误或恶意 连接的另一端,写入传输的数据可能不是 即使lostConnection被称为可交付的,也是如此 连接不会丢失。在这些情况下,abortConnection可以 used:无论是否缓冲,它都会立即关闭连接 传输中仍未写入的数据,或者是生产者 还是注册了。请注意,abortConnection仅适用于 扭曲了11.1和更新。
因此,当我通过覆盖它而在timeoutMixinClass上使用abortConnection()更改loseConnection()时,情况就不再发生了。
当我澄清为什么lostConnection不足以在特定情况下关闭连接的原因时,我会在此处注明。 (任何关于它的评论将不胜感激)