Add an optimization to the HTTP client protocol so that pieplining begins sooner.
authorCameron Dale <camrdale@gmail.com>
Fri, 25 Apr 2008 21:43:14 +0000 (14:43 -0700)
committerCameron Dale <camrdale@gmail.com>
Fri, 25 Apr 2008 21:43:14 +0000 (14:43 -0700)
Specifically, it begins after the first requests headers are sent, instead of the whole response.

apt_p2p/HTTPDownloader.py

index 55a818f1a135624306494c077db9ced72fca7b95..d1ea0a93cebe1ee9095355d3f6e9eb2edc4eab27 100644 (file)
@@ -95,13 +95,18 @@ class LoggingHTTPClientProtocol(HTTPClientProtocol):
         return chanRequest.responseDefer
 
     def setReadPersistent(self, persist):
         return chanRequest.responseDefer
 
     def setReadPersistent(self, persist):
+        oldPersist = self.readPersistent
         self.readPersistent = persist
         if not persist:
             # Tell all requests but first to abort.
             lostRequests = self.inRequests[1:]
             del self.inRequests[1:]
             for request in lostRequests:
         self.readPersistent = persist
         if not persist:
             # Tell all requests but first to abort.
             lostRequests = self.inRequests[1:]
             del self.inRequests[1:]
             for request in lostRequests:
-                request.connectionLost(PipelineError('The pipelined connection was lost'))
+                request.connectionLost(PipelineError('Pipelined connection was closed.'))
+        elif (oldPersist is PERSIST_NO_PIPELINE and
+              persist is PERSIST_PIPELINE and
+              self.outRequest is None):
+            self.manager.clientPipelining(self)
 
     def connectionLost(self, reason):
         self.readPersistent = False
 
     def connectionLost(self, reason):
         self.readPersistent = False
@@ -115,7 +120,7 @@ class LoggingHTTPClientProtocol(HTTPClientProtocol):
         del self.inRequests[1:]
         for request in lostRequests:
             if request is not None:
         del self.inRequests[1:]
         for request in lostRequests:
             if request is not None:
-                request.connectionLost(reason)
+                request.connectionLost(PipelineError('Pipelined connection was closed.'))
                 
 class Peer(ClientFactory):
     """A manager for all HTTP requests to a single peer.
                 
 class Peer(ClientFactory):
     """A manager for all HTTP requests to a single peer.