From: Amos Jeffries Date: Wed, 18 Aug 2010 23:43:22 +0000 (-0600) Subject: Author: Alex Rousskov X-Git-Tag: take1~369 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4a1acc567a540dd1daa135b4bb6d73ac48f06ea3;p=thirdparty%2Fsquid.git Author: Alex Rousskov Bug 3016: HTTP/1.1 compliance: default keep-alive for 1.0/1.1 clients. aka. NTLM Authentication with Java UA + SSL Problem 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 v3.2, 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". - HttpReply now sets HttpMsg::http_ver member. It is not clear whether that member was ever used for HttpReplies though. --- diff --git a/src/HttpHeader.h b/src/HttpHeader.h index c9e3e9696b..6408bb2a57 100644 --- a/src/HttpHeader.h +++ b/src/HttpHeader.h @@ -40,7 +40,6 @@ /* class forward declarations */ -class HttpVersion; class HttpHdrContRange; class HttpHdrCc; class HttpHdrSc; @@ -278,8 +277,6 @@ private: 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 */ diff --git a/src/HttpMsg.cc b/src/HttpMsg.cc index 15466eb7ea..cd5d5cca89 100644 --- a/src/HttpMsg.cc +++ b/src/HttpMsg.cc @@ -316,11 +316,10 @@ HttpMsg::setContentLength(int64_t clen) 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 diff --git a/src/HttpMsg.h b/src/HttpMsg.h index a707b1c57b..525afbdb97 100644 --- a/src/HttpMsg.h +++ b/src/HttpMsg.h @@ -61,6 +61,14 @@ public: /// [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; diff --git a/src/HttpReply.cc b/src/HttpReply.cc index 123c323910..2dc470abe3 100644 --- a/src/HttpReply.cc +++ b/src/HttpReply.cc @@ -377,12 +377,13 @@ HttpReply::hdrCacheInit() { 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) diff --git a/src/client_side.cc b/src/client_side.cc index c722a659c2..dc3306b40b 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -735,18 +735,14 @@ static void 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