+ def submitRequest(self, request, closeAfter=True):
+ """
+ @param request: The request to send to a remote server.
+ @type request: L{ClientRequest}
+
+ @param closeAfter: If True the 'Connection: close' header will be sent,
+ otherwise 'Connection: keep-alive'
+ @type closeAfter: C{bool}
+
+ @rtype: L{twisted.internet.defer.Deferred}
+ @return: A Deferred which will be called back with the
+ L{twisted.web2.http.Response} from the server.
+ """
+
+ # Assert we're in a valid state to submit more
+ assert self.outRequest is None
+ assert ((self.readPersistent is PERSIST_NO_PIPELINE
+ and not self.inRequests)
+ or self.readPersistent is PERSIST_PIPELINE)
+
+ self.manager.clientBusy(self)
+ if closeAfter:
+ self.readPersistent = False
+
+ self.outRequest = chanRequest = FixedHTTPClientChannelRequest(self,
+ request, closeAfter)
+ self.inRequests.append(chanRequest)
+
+ chanRequest.submit()
+ 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:
+ 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
+ self.setTimeout(None)
+ self.manager.clientGone(self)
+ # Cancel the current request
+ if self.inRequests and self.inRequests[0] is not None:
+ self.inRequests[0].connectionLost(reason)
+ # Tell all remaining requests to abort.
+ lostRequests = self.inRequests[1:]
+ del self.inRequests[1:]
+ for request in lostRequests:
+ if request is not None:
+ request.connectionLost(PipelineError('Pipelined connection was closed.'))
+