From dev-return-6523-apmail-couchdb-dev-archive=couchdb.apache.org@couchdb.apache.org Thu Sep 17 12:31:21 2009 Return-Path: Delivered-To: apmail-couchdb-dev-archive@www.apache.org Received: (qmail 36536 invoked from network); 17 Sep 2009 12:31:21 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 17 Sep 2009 12:31:21 -0000 Received: (qmail 23350 invoked by uid 500); 17 Sep 2009 12:31:20 -0000 Delivered-To: apmail-couchdb-dev-archive@couchdb.apache.org Received: (qmail 23232 invoked by uid 500); 17 Sep 2009 12:31:20 -0000 Mailing-List: contact dev-help@couchdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@couchdb.apache.org Delivered-To: mailing list dev@couchdb.apache.org Received: (qmail 23061 invoked by uid 99); 17 Sep 2009 12:31:19 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 17 Sep 2009 12:31:19 +0000 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of cmlenz@gmx.de designates 213.165.64.20 as permitted sender) Received: from [213.165.64.20] (HELO mail.gmx.net) (213.165.64.20) by apache.org (qpsmtpd/0.29) with SMTP; Thu, 17 Sep 2009 12:31:07 +0000 Received: (qmail invoked by alias); 17 Sep 2009 12:30:47 -0000 Received: from vpn.mediatis.de (EHLO [192.168.28.231]) [62.96.5.68] by mail.gmx.net (mp031) with SMTP; 17 Sep 2009 14:30:47 +0200 X-Authenticated: #2618757 X-Provags-ID: V01U2FsdGVkX1/hwsZ0gqHhRrNkhi+7y2n4uIQ4Uj1GnHny1DxcAE 6wnRldTKgSrpRI Content-Type: text/plain; charset=us-ascii; format=flowed; delsp=yes Mime-Version: 1.0 (Apple Message framework v1076) Subject: Re: svn commit: r816033 - /couchdb/trunk/src/couchdb/couch_httpd.erl From: Christopher Lenz In-Reply-To: <20090917031657.F045723888E7@eris.apache.org> Date: Thu, 17 Sep 2009 14:30:46 +0200 Content-Transfer-Encoding: 7bit Message-Id: References: <20090917031657.F045723888E7@eris.apache.org> To: dev@couchdb.apache.org X-Mailer: Apple Mail (2.1076) X-Y-GMX-Trusted: 0 X-FuHaFi: 0.46 X-Virus-Checked: Checked by ClamAV on apache.org On 17.09.2009, at 05:16, davisp@apache.org wrote: > Author: davisp > Date: Thu Sep 17 03:16:54 2009 > New Revision: 816033 > > URL: http://svn.apache.org/viewvc?rev=816033&view=rev > Log: > Fixes COUCHDB-504 > > Thanks to Bob Dionne for figuring out the underlying cause. Thanks > to Benoit for making my initial patch alot cleaner. > > This version is basically Benoit's patch with two extra conditions > for sending the Keep-Alive header. It must be a HTTP/1.0 connection > and there must not be a Connection header already defined. This looks like something that would be nice to patch upstream, no? > Modified: > couchdb/trunk/src/couchdb/couch_httpd.erl > > Modified: couchdb/trunk/src/couchdb/couch_httpd.erl > URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd.erl?rev=816033&r1=816032&r2=816033&view=diff > = > = > = > = > = > = > = > = > ====================================================================== > --- couchdb/trunk/src/couchdb/couch_httpd.erl (original) > +++ couchdb/trunk/src/couchdb/couch_httpd.erl Thu Sep 17 03:16:54 2009 > @@ -377,10 +377,28 @@ > Resp:send(Data), > {ok, Resp}. > > +no_resp_conn_header([]) -> > + true; > +no_resp_conn_header([{Hdr, _}|Rest]) -> > + case string:to_lower(Hdr) of > + "connection" -> false; > + _ -> no_resp_conn_header(Rest) > + end. > + > +http_1_0_keep_alive(Req, Headers) -> > + KeepOpen = Req:should_close() == false, > + IsHttp10 = Req:get(version) == {1, 0}, > + NoRespHeader = no_resp_conn_header(Headers), > + case KeepOpen andalso IsHttp10 andalso NoRespHeader of > + true -> [{"Connection", "Keep-Alive"} | Headers]; > + false -> Headers > + end. > + > start_chunked_response(#httpd{mochi_req=MochiReq}=Req, Code, > Headers) -> > log_request(Req, Code), > couch_stats_collector:increment({httpd_status_codes, Code}), > - Resp = MochiReq:respond({Code, Headers ++ server_header() ++ > couch_httpd_auth:cookie_auth_header(Req, Headers), chunked}), > + Headers2 = http_1_0_keep_alive(MochiReq, Headers), > + Resp = MochiReq:respond({Code, Headers2 ++ server_header() ++ > couch_httpd_auth:cookie_auth_header(Req, Headers2), chunked}), > case MochiReq:get(method) of > 'HEAD' -> throw({http_head_abort, Resp}); > _ -> ok > @@ -394,11 +412,12 @@ > send_response(#httpd{mochi_req=MochiReq}=Req, Code, Headers, Body) -> > log_request(Req, Code), > couch_stats_collector:increment({httpd_status_codes, Code}), > + Headers2 = http_1_0_keep_alive(MochiReq, Headers), > if Code >= 400 -> > ?LOG_DEBUG("httpd ~p error response:~n ~s", [Code, Body]); > true -> ok > end, > - {ok, MochiReq:respond({Code, Headers ++ server_header() ++ > couch_httpd_auth:cookie_auth_header(Req, Headers), Body})}. > + {ok, MochiReq:respond({Code, Headers2 ++ server_header() ++ > couch_httpd_auth:cookie_auth_header(Req, Headers2), Body})}. > > send_method_not_allowed(Req, Methods) -> > send_error(Req, 405, [{"Allow", Methods}], > <<"method_not_allowed">>, ?l2b("Only " ++ Methods ++ " allowed")). -- Christopher Lenz cmlenz at gmx.de http://www.cmlenz.net/