Python扭曲,SSL超时错误

时间:2013-02-22 08:57:54

标签: python ssl https twisted

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浏览器进行尝试时,不会出现这样的问题。

我无法理解为什么会这样。

任何有关理解/解决问题的评论都会受到批评。

额外信息:

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

1 个答案:

答案 0 :(得分:1)

超时连接的类是TimeoutMixin类。

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

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

根据扭曲的文件:

  

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

     

在某些情况下,等到写出所有数据都不是   我们想要。由于网络故障,或者错误或恶意   连接的另一端,写入传输的数据可能不是   即使lostConnection被称为可交付的,也是如此   连接不会丢失。在这些情况下,abortConnection可以   used:无论是否缓冲,它都会立即关闭连接   传输中仍未写入的数据,或者是生产者   还是注册了。请注意,abortConnection仅适用于   扭曲了11.1和更新。

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

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