Return-Path: Delivered-To: apmail-couchdb-commits-archive@www.apache.org Received: (qmail 56379 invoked from network); 25 Jun 2010 14:20:06 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 25 Jun 2010 14:20:06 -0000 Received: (qmail 67561 invoked by uid 500); 25 Jun 2010 14:20:06 -0000 Delivered-To: apmail-couchdb-commits-archive@couchdb.apache.org Received: (qmail 67534 invoked by uid 500); 25 Jun 2010 14:20:06 -0000 Mailing-List: contact commits-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 commits@couchdb.apache.org Received: (qmail 67527 invoked by uid 99); 25 Jun 2010 14:20:06 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 25 Jun 2010 14:20:06 +0000 X-ASF-Spam-Status: No, hits=-1813.4 required=10.0 tests=ALL_TRUSTED,AWL X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 25 Jun 2010 14:20:05 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 7CB8723889E2; Fri, 25 Jun 2010 14:19:13 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r957970 - in /couchdb/branches/0.11.x: THANKS share/Makefile.am share/www/script/couch_tests.js share/www/script/test/method_override.js src/couchdb/couch_httpd.erl Date: Fri, 25 Jun 2010 14:19:13 -0000 To: commits@couchdb.apache.org From: jan@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100625141913.7CB8723889E2@eris.apache.org> Author: jan Date: Fri Jun 25 14:19:12 2010 New Revision: 957970 URL: http://svn.apache.org/viewvc?rev=957970&view=rev Log: Merge r957610 from trunk: close COUCHDB-795 add X-HTTP-METHOD-OVERRIDE support. Thanks Brian Jenkins Added: couchdb/branches/0.11.x/share/www/script/test/method_override.js Modified: couchdb/branches/0.11.x/THANKS couchdb/branches/0.11.x/share/Makefile.am couchdb/branches/0.11.x/share/www/script/couch_tests.js couchdb/branches/0.11.x/src/couchdb/couch_httpd.erl Modified: couchdb/branches/0.11.x/THANKS URL: http://svn.apache.org/viewvc/couchdb/branches/0.11.x/THANKS?rev=957970&r1=957969&r2=957970&view=diff ============================================================================== --- couchdb/branches/0.11.x/THANKS (original) +++ couchdb/branches/0.11.x/THANKS Fri Jun 25 14:19:12 2010 @@ -58,5 +58,6 @@ suggesting improvements or submitting ch * Jason Smith * Dmitry Unkovsky * Zachary Zolton + * Brian Jenkins For a list of authors see the `AUTHORS` file. Modified: couchdb/branches/0.11.x/share/Makefile.am URL: http://svn.apache.org/viewvc/couchdb/branches/0.11.x/share/Makefile.am?rev=957970&r1=957969&r2=957970&view=diff ============================================================================== --- couchdb/branches/0.11.x/share/Makefile.am (original) +++ couchdb/branches/0.11.x/share/Makefile.am Fri Jun 25 14:19:12 2010 @@ -136,6 +136,7 @@ nobase_dist_localdata_DATA = \ www/script/test/lorem.txt \ www/script/test/lorem_b64.txt \ www/script/test/lots_of_docs.js \ + www/script/test/method_override.js \ www/script/test/multiple_rows.js \ www/script/test/oauth.js \ www/script/test/proxyauth.js \ Modified: couchdb/branches/0.11.x/share/www/script/couch_tests.js URL: http://svn.apache.org/viewvc/couchdb/branches/0.11.x/share/www/script/couch_tests.js?rev=957970&r1=957969&r2=957970&view=diff ============================================================================== --- couchdb/branches/0.11.x/share/www/script/couch_tests.js [utf-8] (original) +++ couchdb/branches/0.11.x/share/www/script/couch_tests.js [utf-8] Fri Jun 25 14:19:12 2010 @@ -58,6 +58,7 @@ loadTest("jsonp.js"); loadTest("large_docs.js"); loadTest("list_views.js"); loadTest("lots_of_docs.js"); +loadTest("method_override.js"); loadTest("multiple_rows.js"); loadScript("script/oauth.js"); loadScript("script/sha1.js"); Added: couchdb/branches/0.11.x/share/www/script/test/method_override.js URL: http://svn.apache.org/viewvc/couchdb/branches/0.11.x/share/www/script/test/method_override.js?rev=957970&view=auto ============================================================================== --- couchdb/branches/0.11.x/share/www/script/test/method_override.js (added) +++ couchdb/branches/0.11.x/share/www/script/test/method_override.js Fri Jun 25 14:19:12 2010 @@ -0,0 +1,40 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +// Allow broken HTTP clients to fake a full method vocabulary with an X-HTTP-METHOD-OVERRIDE header +couchTests.method_override = function(debug) { + var result = JSON.parse(CouchDB.request("GET", "/").responseText); + T(result.couchdb == "Welcome"); + + var db = new CouchDB("test_suite_db", {"X-Couch-Full-Commit":"false"}); + db.deleteDb(); + + db.createDb(); + + var doc = {bob : "connie"}; + xhr = CouchDB.request("POST", "/test_suite_db/fnord", {body: JSON.stringify(doc), headers:{"X-HTTP-Method-Override" : "PUT"}}); + T(xhr.status == 201); + + doc = db.open("fnord"); + T(doc.bob == "connie"); + + xhr = CouchDB.request("POST", "/test_suite_db/fnord?rev=" + doc._rev, {headers:{"X-HTTP-Method-Override" : "DELETE"}}); + T(xhr.status == 200) + + xhr = CouchDB.request("GET", "/test_suite_db/fnord2", {body: JSON.stringify(doc), headers:{"X-HTTP-Method-Override" : "PUT"}}); + // Method Override is ignored when original Method isn't POST + T(xhr.status == 404); + + doc = db.open("fnord"); + T(doc == null); + +}; Modified: couchdb/branches/0.11.x/src/couchdb/couch_httpd.erl URL: http://svn.apache.org/viewvc/couchdb/branches/0.11.x/src/couchdb/couch_httpd.erl?rev=957970&r1=957969&r2=957970&view=diff ============================================================================== --- couchdb/branches/0.11.x/src/couchdb/couch_httpd.erl (original) +++ couchdb/branches/0.11.x/src/couchdb/couch_httpd.erl Fri Jun 25 14:19:12 2010 @@ -218,9 +218,26 @@ handle_request_int(MochiReq, DefaultFun, Meth -> couch_util:to_existing_atom(Meth) end, increment_method_stats(Method1), + + % allow broken HTTP clients to fake a full method vocabulary with an X-HTTP-METHOD-OVERRIDE header + MethodOverride = MochiReq:get_primary_header_value("X-HTTP-Method-Override"), + Method2 = case lists:member(MethodOverride, ["GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "CONNECT", "COPY"]) of + true -> + ?LOG_INFO("MethodOverride: ~s (real method was ~s)", [MethodOverride, Method1]), + case Method1 of + 'POST' -> list_to_atom(MethodOverride); + _ -> + % Ignore X-HTTP-Method-Override when the original verb isn't POST. + % I'd like to send a 406 error to the client, but that'd require a nasty refactor. + % throw({not_acceptable, <<"X-HTTP-Method-Override may only be used with POST requests.">>}) + Method1 + end; + _ -> Method1 + end, + % alias HEAD to GET as mochiweb takes care of stripping the body - Method = case Method1 of - 'HEAD' -> 'GET'; + Method = case Method2 of + 'HEAD' -> 'GET'; Other -> Other end,