This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author gjb1002
Recipients docs@python, gjb1002
Date 2012-03-26.20:53:44
SpamBayes Score 5.551115e-17
Marked as misclassified No
Message-id <1332795225.64.0.202093290254.issue14418@psf.upfronthosting.co.za>
In-reply-to
Content
Here I'm referring to the section about RequestHandler objects under the SocketServer page.  

http://docs.python.org/release/2.7.2/library/socketserver.html#requesthandler-objects
 
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:

## server.py

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()

server.serve_forever()

## client.py

import sys, socket

servAddr = sys.argv[1]
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)
History
Date User Action Args
2012-03-26 20:53:45gjb1002setrecipients: + gjb1002, docs@python
2012-03-26 20:53:45gjb1002setmessageid: <1332795225.64.0.202093290254.issue14418@psf.upfronthosting.co.za>
2012-03-26 20:53:45gjb1002linkissue14418 messages
2012-03-26 20:53:44gjb1002create