[英]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.