簡體   English   中英

Python扭曲,SSL超時錯誤

[英]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瀏覽器中嘗試使用該工具時,不會發生此類問題。

我不明白為什么會這樣。

關於理解/解決問題的任何評論都將適用。

額外信息:

  • 當我使用listenSSL時,與連接相關的文件描述符在幾秒鍾后超時后不會關閉。 在重新加載頁面時,它保持靜止,在第二次重新加載操作中,它關閉並且打開了新的文件描述符。 (然后我立即獲得頁面)
  • 當我使用listenTCP時,文件描述符在幾秒鍾后超時后關閉,而當我重新加載頁面時,它將打開新的文件描述符並立即返回頁面。
  • 同樣在使用Telnet連接時,在兩種情況下它都會按預期超時連接。
  • 連接此服務器的扭曲客戶端也會影響預期的超時。

超時連接的類是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM