Sfoglia il codice sorgente

2008-10-23 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Pool connection when redirection occurs with Content-Length = 0.
	* src/HttpSkipResponseCommand.cc
	* src/HttpSkipResponseCommand.h
Tatsuhiro Tsujikawa 17 anni fa
parent
commit
90c6d5072b
3 ha cambiato i file con 26 aggiunte e 6 eliminazioni
  1. 6 0
      ChangeLog
  2. 18 6
      src/HttpSkipResponseCommand.cc
  3. 2 0
      src/HttpSkipResponseCommand.h

+ 6 - 0
ChangeLog

@@ -1,3 +1,9 @@
+2008-10-23  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Pool connection when redirection occurs with Content-Length = 0.
+	* src/HttpSkipResponseCommand.cc
+	* src/HttpSkipResponseCommand.h
+
 2008-10-22  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Fixed the bug that causes time out when redirection occurs with

+ 18 - 6
src/HttpSkipResponseCommand.cc

@@ -80,6 +80,13 @@ void HttpSkipResponseCommand::setTransferEncodingDecoder
 bool HttpSkipResponseCommand::executeInternal()
 {
   if(_totalLength == 0 && _transferEncodingDecoder.isNull()) {
+    // If content-length header is present and it's value is 0, then
+    // pool socket for reuse.
+    // If content-length header is not present, then EOF is expected in the end.
+    // In this case, the content is thrown away and socket cannot be pooled. 
+    if(_httpResponse->getHttpHeader()->defined(HttpHeader::CONTENT_LENGTH)) {
+      poolConnection();
+    }
     return processResponse();
   }
   const size_t BUFSIZE = 16*1024;
@@ -118,12 +125,7 @@ bool HttpSkipResponseCommand::executeInternal()
     finished = _transferEncodingDecoder->finished();
   }
   if(finished) {
-    if(!e->option->getAsBool(PREF_HTTP_PROXY_ENABLED) &&
-       req->supportsPersistentConnection()) {
-      std::pair<std::string, uint16_t> peerInfo;
-      socket->getPeerInfo(peerInfo);
-      e->poolSocket(peerInfo.first, peerInfo.second, socket);
-    }
+    poolConnection();
     return processResponse();
   } else {
     setWriteCheckSocketIf(socket, socket->wantWrite());
@@ -132,6 +134,16 @@ bool HttpSkipResponseCommand::executeInternal()
   }
 }
 
+void HttpSkipResponseCommand::poolConnection() const
+{
+  if(!e->option->getAsBool(PREF_HTTP_PROXY_ENABLED) &&
+     req->supportsPersistentConnection()) {
+    std::pair<std::string, uint16_t> peerInfo;
+    socket->getPeerInfo(peerInfo);
+    e->poolSocket(peerInfo.first, peerInfo.second, socket);
+  }
+}
+
 bool HttpSkipResponseCommand::processResponse()
 {
   if(_httpResponse->isRedirect()) {

+ 2 - 0
src/HttpSkipResponseCommand.h

@@ -56,6 +56,8 @@ private:
   uint64_t _receivedBytes;
 
   bool processResponse();
+
+  void poolConnection() const;
 protected:
   virtual bool executeInternal();
 public: