2013-02-22 87 views
2
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秒後,我嘗試重新加載頁面,它不刷新網頁,停留在重新加載操作。在重新加載的第二次嘗試中,它立即獲取頁面。Python扭曲,SSL超時錯誤

當我運行上面的代碼與reactor.listenTCP(8080,工廠),沒有這樣的問題發生。 (我可以重新加載頁面,無需重新加載並立即獲取頁面)

問題可以通過Chrome,Firefox重複。但是當我用Ubuntu的Epiphany瀏覽器嘗試它時,不會出現這樣的問題。

我不明白爲什麼會出現這種情況。

關於理解/解決問題的任何評論將被評價。

額外的信息:

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

回答

1

超時連接類爲TimeoutMixin類的類。

它使用transport.loseConneciton()方法來超時連接。

不知何故,DefaultOpenSSLFactory使用連接(?),因此loseConnection方法等待完成傳輸並且當時它不接受連接上的任何進程。

根據扭曲文檔:

在上面的代碼,loseConnection被寫入傳輸後立即調用。只有當所有的數據都被Twisted寫入操作系統時,lostConnection調用纔會關閉連接,所以在這種情況下使用它是安全的,不用擔心傳輸寫入丟失。如果生產者與交通工具一起使用,lostConnection只會在生產者未註冊後關閉連接。

在某些情況下,等到所有數據被寫出來,並不是我們想要的 。由於網絡故障或連接另一端的錯誤或惡意,寫入傳輸的數據可能不是 可交付成果,因此儘管lostConnection被稱爲 連接也不會丟失。在這些情況下,abortConnection可以使用: 用於:立即關閉連接,無論緩衝區中的 數據是否仍然未在傳輸中寫入,或者生產者仍在 仍然註冊。請注意,abortConnection僅在 Twisted 11.1和更新版本中可用。

因此,當我更改loseConnection()與timeoutMixinClass上的abortConnection()時,通過重寫它,情況不再發生。

當我澄清爲什麼loseConnection不足以關閉特定情況下的連接的原因時,我會在此處記下它。 (有關它的任何評論將不勝感激)