Darryl Miles <darryl.mi...@darrylmiles.org> added the comment:

To explain why you need 2 modes, a client/server would expect to do the 
following pseudo actions for maximum efficiency:

set_socket_timeout(600_SECONDS)  # or useful default
send_data_over_ssl("QUIT\r\n")
shutdown(SSL_SHUTDOWN_MODE_SENT)
flush_data_down_to_socket()   # maybe automatic/implied (OpenSSL users with 
custom BIO layers should be aware of this step)
shutdown(socket, SHUT_WR)   # this is optional, TCP socket level shutdown
recv_data_over_ssl() = "250 Bye bye!\r\n"  # this will take time to arrive
set_socket_io_timeout(5_SECONDS)
shutdown(SSL_SHUTDOWN_MODE_BOTH)  # this is optional!  some clients may choose 
to skip it entirely
close()/unwrap()


A server would:

recv_data_over_ssl() = "QUIT\r\n"  # would be sitting idle waiting for this 
command
send_data_over_ssl("250 Bye bye!\r\n")
shutdown(SSL_SHUTDOWN_MODE_SENT)
flush_data_down_to_socket()   # maybe automatic/implied (OpenSSL users with 
custom BIO layers should be aware of this step)
shutdown(socket, SHUT_WR)   # this is optional, TCP socket level shutdown
set_socket_io_timeout(30_SECONDS)
shutdown(SSL_SHUTDOWN_MODE_BOTH)  # a good server would implement this step
close()/unwrap()


Now if your outbound data is CORKed and flushed, the flush points would cause 
all the SSL data from both the 'last sent data' and the 'send shutdown notify' 
to go out in the same TCP segment and arrive at the other end more or less 
together.

Doing any of the above in a different order introduces some kind of 
inefficiency.  shutdown(fd, SHUT_WR) are often used at the socket level to help 
the manage TIME_WAIT.

The client has to wait for the QUIT response message anyway.  With the above 
sequence there is no additional time delay or cost with both parties performing 
a SSL protocol shutdown at the same time.  Despite the IO timeouts existing (to 
provide a safety net).

If the client is talking to a buggy server the worst case scenario is that it 
receives the quit response but the server never does an SSL shutdown and the 
server doesn't close the socket connection.  In this situation the client will 
have to wait for IO timeout, some clients in other software use blocking 
sockets and don't have a timeout so they end up hooked (forever).

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue8108>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to