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 ブラウザーから「https://localhost/echo」という URL を入力すると、ページが取得されます。5 秒後にページをリロードしようとすると、Web ページが更新されず、リロード操作でスタックします。リロードの 2 回目の試行で、ページが即座に取得されます。
上記のコードを react.listenTCP(8080, factory) で実行すると、そのような問題は発生しません。(リロードをスタックせずにページをリロードして、ページを即座に取得できます)
問題は、Chrome、Firefox で繰り返される可能性があります。しかし、Ubuntu の Epiphany ブラウザで試してみると、そのような問題は発生しません。
なぜこれが起こるのか理解できませんでした。
問題の理解/解決に関するコメントは歓迎されます。
追加情報:
- listenSSL を使用すると、タイムアウト秒後に接続に関連するファイル記述子が閉じられません。ページをリロードしている間、ページは静止したままで、2 回目のリロード操作で閉じられ、新しいファイル記述子が開かれます。(そして私はすぐにページを取得します)
- listenTCP を使用すると、タイムアウト秒後にファイル記述子が閉じ、ページをリロードすると、新しいファイル記述子が開き、すぐにページが返されます。
- また、Telnet 接続では、どちらの場合も期待どおりに接続がタイムアウトします。
- このサーバーに接続する Twisted クライアントも、予想どおりタイムアウトに影響します。