You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by kx...@apache.org on 2015/11/10 00:40:29 UTC

[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 <kx...@apache.org>
Authored: Thu Oct 22 23:21:17 2015 +0300
Committer: Alexander Shorin <kx...@apache.org>
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.