Return-Path: X-Original-To: apmail-couchdb-commits-archive@www.apache.org Delivered-To: apmail-couchdb-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 204BC18753 for ; Mon, 9 Nov 2015 23:40:29 +0000 (UTC) Received: (qmail 46593 invoked by uid 500); 9 Nov 2015 23:40:29 -0000 Delivered-To: apmail-couchdb-commits-archive@couchdb.apache.org Received: (qmail 46556 invoked by uid 500); 9 Nov 2015 23:40:28 -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 46545 invoked by uid 99); 9 Nov 2015 23:40:28 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 09 Nov 2015 23:40:28 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id A9C4AE0991; Mon, 9 Nov 2015 23:40:28 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: kxepal@apache.org To: commits@couchdb.apache.org Date: Mon, 09 Nov 2015 23:40:29 -0000 Message-Id: <7dd10c1f16e145e9a0960356d0fedf64@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [2/2] couch-mrview commit: updated refs/heads/master to c3bed46 Merge default update response headers with custom ones COUCHDB-1447 Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch-mrview/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch-mrview/commit/0334f690 Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch-mrview/tree/0334f690 Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch-mrview/diff/0334f690 Branch: refs/heads/master Commit: 0334f690c5ccc16ea0284d9c2f2b58c77f1fc2b9 Parents: 1c8a302 Author: Alexander Shorin Authored: Thu Oct 22 23:21:17 2015 +0300 Committer: Alexander Shorin Committed: Tue Nov 10 02:38:24 2015 +0300 ---------------------------------------------------------------------- src/couch_mrview_show.erl | 78 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-couch-mrview/blob/0334f690/src/couch_mrview_show.erl ---------------------------------------------------------------------- diff --git a/src/couch_mrview_show.erl b/src/couch_mrview_show.erl index dcfe22f..3c38c71 100644 --- a/src/couch_mrview_show.erl +++ b/src/couch_mrview_show.erl @@ -136,13 +136,11 @@ send_doc_update_response(Req, Db, DDoc, UpdateName, Doc, DocId) -> couch_doc:validate_docid(NewDoc#doc.id), {ok, NewRev} = couch_db:update_doc(Db, NewDoc, Options), NewRevStr = couch_doc:rev_to_str(NewRev), - {[ - {<<"code">>, 201}, - {<<"headers">>, {[ - {<<"X-Couch-Update-NewRev">>, NewRevStr}, - {<<"X-Couch-Id">>, NewDoc#doc.id} - ]}} - | JsonResp0]}; + {JsonResp1} = apply_headers(JsonResp0, [ + {<<"X-Couch-Update-NewRev">>, NewRevStr}, + {<<"X-Couch-Id">>, NewDoc#doc.id} + ]), + {[{<<"code">>, 201} | JsonResp1]}; [<<"up">>, _Other, {JsonResp0}] -> {[{<<"code">>, 200} | JsonResp0]} end, @@ -340,6 +338,23 @@ apply_etag({ExternalResponse}, CurrentEtag) -> end || Field <- ExternalResponse]} end. +apply_headers(JsonResp, []) -> + JsonResp; +apply_headers(JsonResp, NewHeaders) -> + case couch_util:get_value(<<"headers">>, JsonResp) of + undefined -> + {[{<<"headers">>, {NewHeaders}}| JsonResp]}; + JsonHeaders -> + Headers = apply_headers1(JsonHeaders, NewHeaders), + NewKV = {<<"headers">>, Headers}, + {lists:keyreplace(<<"headers">>, 1, JsonResp, NewKV)} + end. +apply_headers1(JsonHeaders, [{Key, Value} | Rest]) -> + NewJsonHeaders = json_apply_field({Key, Value}, JsonHeaders), + apply_headers1(NewJsonHeaders, Rest); +apply_headers1(JsonHeaders, []) -> + JsonHeaders. + % Maybe this is in the proplists API % todo move to couch_util @@ -370,3 +385,52 @@ json_req_obj(Req, Db) -> last_chunk(Resp) -> chttpd:send_chunk(Resp, []). + + +-ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). + +apply_headers_test_() -> + [ + should_apply_headers(), + should_apply_headers_with_merge(), + should_apply_headers_with_merge_overwrite() + ]. + +should_apply_headers() -> + ?_test(begin + JsonResp = [{<<"code">>, 201}], + Headers = [{<<"foo">>, <<"bar">>}], + {Props} = apply_headers(JsonResp, Headers), + JsonHeaders = couch_util:get_value(<<"headers">>, Props), + ?assertEqual({Headers}, JsonHeaders) + end). + +should_apply_headers_with_merge() -> + ?_test(begin + BaseHeaders = [{<<"bar">>, <<"baz">>}], + NewHeaders = [{<<"foo">>, <<"bar">>}], + JsonResp = [ + {<<"code">>, 201}, + {<<"headers">>, {BaseHeaders}} + ], + {Props} = apply_headers(JsonResp, NewHeaders), + JsonHeaders = couch_util:get_value(<<"headers">>, Props), + ExpectedHeaders = {NewHeaders ++ BaseHeaders}, + ?assertEqual(ExpectedHeaders, JsonHeaders) + end). + +should_apply_headers_with_merge_overwrite() -> + ?_test(begin + BaseHeaders = [{<<"foo">>, <<"bar">>}], + NewHeaders = [{<<"foo">>, <<"baz">>}], + JsonResp = [ + {<<"code">>, 201}, + {<<"headers">>, {BaseHeaders}} + ], + {Props} = apply_headers(JsonResp, NewHeaders), + JsonHeaders = couch_util:get_value(<<"headers">>, Props), + ?assertEqual({NewHeaders}, JsonHeaders) + end). + +-endif.