[Twisted-Python] Re: How can I disconnect ssl connection from the client side?

Johann Borck johann.borck at densedata.com
Mon Feb 2 06:45:40 MST 2009


Atsuo Ishimoto wrote:

...
> class Client(basic.LineReceiver):
>     def connectionMade(self):
>         class dmyfile:
>             def read(self, n):
>                 if CANCELED:
>                     return
>                 else:
>                     return '1'
>
>         s = basic.FileSender()
>         print "start sending"
>
>         def f1(lastChunk):
>             print "finished"
>
>   
...
> def cancel():
>     print "cancel", conn.state
>     global CANCELED
>     CANCELED = True
>     conn.disconnect()
>
>   
I think the problem is that you call conn.disconnect before the 
FileSender has a chance to call unregisterProducer on the transport (in 
real life before it has sent the whole file). If the producer is not 
unregistered, the doWrite() method called from the reactor doesn't even 
check if the connection is in 'disconnecting' state, assumes there's 
more data to come, and since no further events occur on the channel, the 
connection just remains open. You can check that by manually writing one 
more byte to the transport in f1, after FileSender has unregistered 
itself. The correct way is to call 
conn.disconnect()/transport.loseConnection() in f1 instead of in cancel.

from t.i.abstract.FileDescriptor.loseConnection.__doc__:
"... If you have a producer registered, the connection won't be closed 
until the producer is finished. Therefore, make sure you unregister your 
producer when it's finished, or the connection willnever close ..."

hth, Johann
> reactor.callLater(2, cancel) # disconnect 2 sec later
> reactor.run()
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
>   





More information about the Twisted-Python mailing list