Moved httpMsgIsPersistent(version, headers) to HttpMsg::persistent(void). This move makes it clear that the logic applies only to the message being examined and not some irrelevant information such as HTTP version supported by Squid. Side-effects: - In trunk, Squid stops using persistent connections with HTTP/1.0 clients that do not send "Connection: keep-alive". - In v3.1, Squid starts using persistent connections with HTTP/1.1 clients that do not send "Connection: close". This patch is not recommended for v3.1 though because it is too intrusive. Use take1 instead. - HttpReply now sets HttpMsg::http_ver member. It is not clear whether that member was ever used for HttpReplies though. === modified file 'src/HttpHeader.h' --- src/HttpHeader.h 2010-03-05 07:10:40 +0000 +++ src/HttpHeader.h 2010-08-14 15:13:40 +0000 @@ -40,7 +40,6 @@ /* class forward declarations */ -class HttpVersion; class HttpHdrContRange; class HttpHdrCc; class HttpHdrSc; @@ -278,8 +277,6 @@ extern int httpHeaderParseQuotedString (const char *start, String *val); SQUIDCEXTERN int httpHeaderHasByNameListMember(const HttpHeader * hdr, const char *name, const char *member, const char separator); SQUIDCEXTERN void httpHeaderUpdate(HttpHeader * old, const HttpHeader * fresh, const HttpHeaderMask * denied_mask); -int httpMsgIsPersistent(HttpVersion const &http_ver, const HttpHeader * hdr); - SQUIDCEXTERN void httpHeaderCalcMask(HttpHeaderMask * mask, http_hdr_type http_hdr_type_enums[], size_t count); #endif /* SQUID_HTTPHEADER_H */ === modified file 'src/HttpMsg.cc' --- src/HttpMsg.cc 2010-03-10 12:50:39 +0000 +++ src/HttpMsg.cc 2010-08-14 15:18:07 +0000 @@ -316,11 +316,10 @@ content_length = clen; } -/* returns true if connection should be "persistent" - * after processing this message */ -int -httpMsgIsPersistent(HttpVersion const &http_ver, const HttpHeader * hdr) +bool +HttpMsg::persistent() const { + const HttpHeader *hdr = &header; // XXX: diff-minimizer; remove on commit if ((http_ver.major >= 1) && (http_ver.minor >= 1)) { /* * for modern versions of HTTP: persistent unless there is === modified file 'src/HttpMsg.h' --- src/HttpMsg.h 2010-01-01 21:16:57 +0000 +++ src/HttpMsg.h 2010-08-14 15:13:40 +0000 @@ -61,6 +61,14 @@ /// [re]sets Content-Length header and cached value void setContentLength(int64_t clen); + /** + * \retval true the message sender asks to keep the connection open. + * \retval false the message sender will close the connection. + * + * Factors other than the headers may result in connection closure. + */ + bool persistent() const; + public: HttpVersion http_ver; === modified file 'src/HttpReply.cc' --- src/HttpReply.cc 2010-07-13 16:43:00 +0000 +++ src/HttpReply.cc 2010-08-14 15:13:40 +0000 @@ -377,12 +377,13 @@ { HttpMsg::hdrCacheInit(); + http_ver = sline.version; content_length = header.getInt64(HDR_CONTENT_LENGTH); date = header.getTime(HDR_DATE); last_modified = header.getTime(HDR_LAST_MODIFIED); surrogate_control = header.getSc(); content_range = header.getContRange(); - keep_alive = httpMsgIsPersistent(sline.version, &header); + keep_alive = persistent() ? 1 : 0; const char *str = header.getStr(HDR_CONTENT_TYPE); if (str) === modified file 'src/client_side.cc' --- src/client_side.cc 2010-08-07 14:22:54 +0000 +++ src/client_side.cc 2010-08-14 15:16:18 +0000 @@ -735,18 +735,14 @@ clientSetKeepaliveFlag(ClientHttpRequest * http) { HttpRequest *request = http->request; - const HttpHeader *req_hdr = &request->header; debugs(33, 3, "clientSetKeepaliveFlag: http_ver = " << request->http_ver.major << "." << request->http_ver.minor); debugs(33, 3, "clientSetKeepaliveFlag: method = " << RequestMethodStr(request->method)); - /* We are HTTP/1.1 facing clients now*/ - HttpVersion http_ver(1,1); - - if (httpMsgIsPersistent(http_ver, req_hdr)) - request->flags.proxy_keepalive = 1; + // TODO: move to HttpRequest::hdrCacheInit, just like HttpReply. + request->flags.proxy_keepalive = request->persistent() ? 1 : 0; } static int