2016-04-22 8 views
0

Ich möchte Ping-Timeout eines Websocket in einem Test simulieren.Python-Patch-Objekt-Methode

Zuerst habe ich versucht, TCP-Socket ruhig zu schließen, aber es ist nicht möglich aufgrund FIN wird trotzdem gesendet. Iptables ist keine Option.

Ich benutze Tornado-Bibliothek, um einen Websocket-Client zu verspotten.

Ich habe gelesen, wie Methode in bereits instanziierten Objekt zu ersetzen. Es funktioniert in einer einfachen Demo, aber Tornado scheint meine Manipulationen zu ignorieren.

Was könnte es sein?

import types 

ws.websocket_connect(url, callback=openCallback, 
      on_message_callback=messageCallback) 

def openCallback(future): 
    ws = future.result() 
    inst = ws.protocol 

    def stub(self, x): 
     print "STUB" 
    inst.write_ping = types.MethodType(stub, inst, inst.__class__) 

Es gibt keinen Fehler, aber Stub wird nicht aufgerufen, und der Client antwortet weiterhin auf Server-Ping-Anforderungen.

Antwort

0

Ich erkannte, dass ich die falsche Methode deaktivieren wollte.

write_ping wird durch Server verwendet Ping-Anfrage zu senden, aber Client schreibt pong, so überwog ich _write_frame Methode (fin, opcode) und Wertsteuerung auf die ursprüngliche Implementierung wenn Opcode! = 0xA.