[Python-checkins] r73877 - python/trunk/Lib/SocketServer.py

kristjan.jonsson python-checkins at python.org
Tue Jul 7 11:01:35 CEST 2009


Author: kristjan.jonsson
Date: Tue Jul  7 11:01:34 2009
New Revision: 73877

Log:
http://bugs.python.org/issue6382
added the shutdown_request() which can perform shutdown before calling close.  This is needed for the ForkingMixIn because different close semantics are required for child and parent process.  shutdown_request(), for TCP servers, calls socket.shutdown() and then calls close_request().  Therefore, this is not an backwards incompatible change, since subclasses that continue to override close_request() continue to work.

Modified:
   python/trunk/Lib/SocketServer.py

Modified: python/trunk/Lib/SocketServer.py
==============================================================================
--- python/trunk/Lib/SocketServer.py	(original)
+++ python/trunk/Lib/SocketServer.py	Tue Jul  7 11:01:34 2009
@@ -168,6 +168,7 @@
     - verify_request(request, client_address)
     - server_close()
     - process_request(request, client_address)
+    - shutdown_request(request)
     - close_request(request)
     - handle_error()
 
@@ -281,7 +282,7 @@
                 self.process_request(request, client_address)
             except:
                 self.handle_error(request, client_address)
-                self.close_request(request)
+                self.shutdown_request(request)
 
     def handle_timeout(self):
         """Called if no new request arrives within self.timeout.
@@ -305,7 +306,7 @@
 
         """
         self.finish_request(request, client_address)
-        self.close_request(request)
+        self.shutdown_request(request)
 
     def server_close(self):
         """Called to clean-up the server.
@@ -319,6 +320,10 @@
         """Finish one request by instantiating RequestHandlerClass."""
         self.RequestHandlerClass(request, client_address, self)
 
+    def shutdown_request(self, request):
+        """Called to shutdown and close an individual request."""
+        self.close_request(request)
+
     def close_request(self, request):
         """Called to clean up an individual request."""
         pass
@@ -359,6 +364,7 @@
     - handle_timeout()
     - verify_request(request, client_address)
     - process_request(request, client_address)
+    - shutdown_request(request)
     - close_request(request)
     - handle_error()
 
@@ -443,14 +449,18 @@
         """
         return self.socket.accept()
 
-    def close_request(self, request):
-        """Called to clean up an individual request."""
+    def shutdown_request(self, request):
+        """Called to shutdown and close an individual request."""
         try:
             #explicitly shutdown.  socket.close() merely releases
             #the socket and waits for GC to perform the actual close.
             request.shutdown(socket.SHUT_WR)
         except socket.error:
             pass #some platforms may raise ENOTCONN here
+        self.close_request(request)
+
+    def close_request(self, request):
+        """Called to clean up an individual request."""
         request.close()
 
 
@@ -472,6 +482,10 @@
         # No need to call listen() for UDP.
         pass
 
+    def shutdown_request(self, request):
+        # No need to shutdown anything.
+        self.close_request(request)
+
     def close_request(self, request):
         # No need to close anything.
         pass
@@ -532,19 +546,19 @@
             if self.active_children is None:
                 self.active_children = []
             self.active_children.append(pid)
-            request.close() #close socket handle in parent process
+            self.close_request(request) #close handle in parent process
             return
         else:
             # Child process.
             # This must never return, hence os._exit()!
             try:
                 self.finish_request(request, client_address)
-                self.close_request(request)
+                self.shutdown_request(request)
                 os._exit(0)
             except:
                 try:
                     self.handle_error(request, client_address)
-                    self.close_request(request)
+                    self.shutdown_request(request)
                 finally:
                     os._exit(1)
 
@@ -564,10 +578,10 @@
         """
         try:
             self.finish_request(request, client_address)
-            self.close_request(request)
+            self.shutdown_request(request)
         except:
             self.handle_error(request, client_address)
-            self.close_request(request)
+            self.shutdown_request(request)
 
     def process_request(self, request, client_address):
         """Start a new thread to process the request."""


More information about the Python-checkins mailing list