2012-05-12 63 views
1

我從位於這裏的扭曲文檔運行twisted.words MSN協議例如運行twisted.words例如:http://twistedmatrix.com/projects/words/documentation/examples/msn_example.py異常使用MSN協議

然而,當我運行此示例腳本,我得到UnhandledError例外:

2012-05-12 15:39:51-0300 [-] Log opened. 
2012-05-12 15:39:51-0300 [-] Starting factory <twisted.internet.protocol.ClientFactory instance at 0x8c6c18c> 
2012-05-12 15:39:52-0300 [Dispatch,client] Starting factory <twisted.words.protocols.msn.NotificationFactory instance at 0x8c6c2cc> 
2012-05-12 15:39:52-0300 [Dispatch,client] Stopping factory <twisted.internet.protocol.ClientFactory instance at 0x8c6c18c> 
2012-05-12 15:39:53-0300 [Notification,client] Starting factory <twisted.internet.protocol.ClientFactory instance at 0x8c710ec> 
2012-05-12 15:39:53-0300 [Notification,client] Unhandled Error 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 84, in callWithLogger 
    return callWithContext({"system": lp}, func, *args, **kw) 
    File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 69, in callWithContext 
    return context.call({ILogContext: newCtx}, func, *args, **kw) 
    File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext 
    return self.currentContext().callWithContext(ctx, func, *args, **kw) 
    File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext 
    return func(*args,**kw) 
--- <exception caught here> --- 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/selectreactor.py", line 146, in _doReadOrWrite 
    why = getattr(selectable, method)() 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 460, in doRead 
    rval = self.protocol.dataReceived(data) 
    File "/usr/lib/python2.7/dist-packages/twisted/protocols/basic.py", line 564, in dataReceived 
    why = self.lineReceived(line) 
    File "/usr/lib/python2.7/dist-packages/twisted/words/protocols/msn.py", line 670, in lineReceived 
    handler(params.split()) 
    File "/usr/lib/python2.7/dist-packages/twisted/words/protocols/msn.py", line 848, in handle_USR 
    authData=params[3]) 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 108, in execute 
    return succeed(result) 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 71, in succeed 
    d.callback(result) 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 360, in callback 
    assert not isinstance(result, Deferred) 
exceptions.AssertionError: 

2012-05-12 15:39:53-0300 [Notification,client] Stopping factory <twisted.words.protocols.msn.NotificationFactory instance at 0x8c6c2cc> 
2012-05-12 15:39:55-0300 [PassportNexus,client] Starting factory <twisted.internet.protocol.ClientFactory instance at 0x8d014cc> 
2012-05-12 15:39:55-0300 [PassportNexus,client] Stopping factory <twisted.internet.protocol.ClientFactory instance at 0x8c710ec> 
2012-05-12 15:39:56-0300 [PassportLogin,client] Stopping factory <twisted.internet.protocol.ClientFactory instance at 0x8d014cc> 
  • 的Python 2.7.2+
  • 扭曲11.0.0
  • pyOpenSSL 0.12

回答

2

我從來沒有使用過t.w.protocols.msn協議,但是在我看來,Twisted的msn.pyline 846上有一個錯誤。這裏是有問題的功能:

def handle_USR(self, params): 
    if len(params) != 4 and len(params) != 6: 
     raise MSNProtocolError, "Invalid Number of Parameters for USR" 

    mechanism = params[1] 
    if mechanism == "OK": 
     self.loggedIn(params[2], unquote(params[3]), int(params[4])) 
    elif params[2].upper() == "S": 
     # we need to obtain auth from a passport server 
     f = self.factory 
     d = execute(             # <------- here 
      _login, f.userHandle, f.password, f.passportServer, 
      authData=params[3]) 
     d.addCallback(self._passportLogin) 
     d.addErrback(self._passportError) 

defer.execute被調用msn._login及其參數,但msn._login應該返回一個延遲。將defer.execute與可能返回延期的函數一起使用defer.execute是不合適的,因爲它將立即通過defer.succeed包裝在另一個延期中,並且延遲不能將其他延期作爲結果。

execute呼叫應該使用defer.maybeDeferred來代替。我期望如果您在文件頂部的twisted.internet.defer導入maybeDeferred,並將此execute調用更改爲maybeDeferred調用,它將開始工作(或至少由於其他錯誤而導致失敗:))。

+0

謝謝,這些改變奏效! :) –