New submission from Geoffrey Bache firstname.lastname@example.org:
Here I'm referring to the section about RequestHandler objects under the SocketServer page.
This appears to be the same in Python 2.6 and Python 2.7. But the objects don't behave the same, in two respects:
1) For finish() "If setup() or handle() raise an exception, this function will not be called." This is true in Python 2.6. It appears to no longer be true in Python 2.7, where finish() is called in a "finally" clause.
2) For handle(). "The default implementation does nothing". This is true up to a point, but using the default implementation has different effects. Specifically, if I try to read from a socket when the server has not written anything, I get an exception in Python 2.6 and an empty string in Python 2.7. Consider this code:
from SocketServer import TCPServer, StreamRequestHandler import sys, socket
server = TCPServer((socket.gethostname(), 0), StreamRequestHandler) host, port = server.socket.getsockname() address = host + ":" + str(port) print "Started server at", address sys.stdout.flush()
import sys, socket
servAddr = sys.argv host, port = servAddr.split(":") serverAddress = (host, int(port)) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(serverAddress) sock.sendall("Some Message") sock.shutdown(1) response = sock.makefile().read() print "Got reply:", response sock.close()
and compare the following:
$ python2.7 server.py & Started server at 127.0.1.1:42759 $ python2.7 client.py 127.0.1.1:42759 Got reply: $ python2.6 server.py & Started server at 127.0.1.1:42758 $ python client.py 127.0.1.1:42758 Traceback (most recent call last): File "client.py", line 12, in <module> response = sock.makefile().read() File "/usr/lib/python2.7/socket.py", line 351, in read data = self._sock.recv(rbufsize) socket.error: [Errno 104] Connection reset by peer
(doesn't matter which Python runs the client in the last case)
I am unsure whether this is a bug in Python 2.6, or really what the reasoning behind the behaviour difference is, but I think this change in behaviour is worth a small note in the documentation (how it will behave if you try to read when nothing has been written)
---------- assignee: docs@python components: Documentation messages: 156869 nosy: docs@python, gjb1002 priority: normal severity: normal status: open title: Document differences in SocketServer between Python 2.6 and 2.7 versions: Python 2.6, Python 2.7
Mark Lawrence added the comment:
@Geoffrey sorry about the delay in getting back to you.
---------- nosy: +BreamoreBoy, pitrou
Martin Panter email@example.com added the comment:
Regarding the first point, “finish” is no longer called after an exception. This was apparently changed in 2.7.4 (see Issue 14574), but Geoffrey was referring to older documentation.
Regarding the second point, about ECONNRESET vs graceful shutdown, this seems to be due to the “shutdown” call added to in “TCPServer.close_request” in Issue 6267.
---------- nosy: +martin.panter
Change by Mark Lawrence firstname.lastname@example.org:
---------- nosy: -BreamoreBoy
Zachary Ware email@example.com added the comment:
Since Python 2.7 is now at end-of-life, I'm closing the issue.
---------- nosy: +zach.ware resolution: -> out of date stage: needs patch -> resolved status: open -> closed