Match old behavior when buffering is disabled If the threshold is set to zero we make sure to send a separate chunk to close the JSON, otherwise we just merge it into the previous chunk.
Project: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/commit/45bb5343 Tree: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/tree/45bb5343 Diff: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/diff/45bb5343 Branch: refs/heads/master Commit: 45bb534361d5f6d4deff88fc3a5a621cb01156f1 Parents: 4278115 Author: Adam Kocoloski <[email protected]> Authored: Wed Jul 22 14:14:48 2015 -0400 Committer: Adam Kocoloski <[email protected]> Committed: Wed Jul 22 16:57:49 2015 -0400 ---------------------------------------------------------------------- src/chttpd.erl | 11 ++++++++++- src/chttpd_db.erl | 19 +++++++++---------- 2 files changed, 19 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/blob/45bb5343/src/chttpd.erl ---------------------------------------------------------------------- diff --git a/src/chttpd.erl b/src/chttpd.erl index 28e15b6..1cbbd04 100644 --- a/src/chttpd.erl +++ b/src/chttpd.erl @@ -35,7 +35,8 @@ get_delayed_req/1]). -export([ - chunked_response_buffer_size/0 + chunked_response_buffer_size/0, + close_delayed_json_object/4 ]). -record(delayed_resp, { @@ -728,6 +729,14 @@ send_delayed_error(#delayed_resp{resp=Resp}, Reason) -> log_error_with_stack_trace(Reason), throw({http_abort, Resp, Reason}). +close_delayed_json_object(Resp, Buffer, Terminator, 0) -> + % Use a separate chunk to close the streamed array to maintain strict + % compatibility with earlier versions. See COUCHDB-2724 + {ok, R1} = chttpd:send_delayed_chunk(Resp, Buffer), + send_delayed_chunk(R1, Terminator); +close_delayed_json_object(Resp, Buffer, Terminator, _Threshold) -> + send_delayed_chunk(Resp, [Buffer | Terminator]). + end_delayed_json_response(#delayed_resp{}=DelayedResp) -> {ok, #delayed_resp{resp=Resp}} = start_delayed_response(DelayedResp), http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/blob/45bb5343/src/chttpd_db.erl ---------------------------------------------------------------------- diff --git a/src/chttpd_db.erl b/src/chttpd_db.erl index b4b4a83..735480c 100644 --- a/src/chttpd_db.erl +++ b/src/chttpd_db.erl @@ -183,16 +183,15 @@ changes_callback({change, Change}, Acc) -> Len = iolist_size(Data), maybe_flush_changes_feed(Acc, Data, Len); changes_callback({stop, EndSeq, Pending}, Acc) -> - #cacc{buffer = Buf, mochi = Resp} = Acc, - {ok, Resp1} = chttpd:send_delayed_chunk(Resp, [ - Buf, - "\n],\n\"last_seq\":", - ?JSON_ENCODE(EndSeq), - ",\"pending\":", - ?JSON_ENCODE(Pending), - "}\n" - ]) - end, + #cacc{buffer = Buf, mochi = Resp, threshold = Max} = Acc, + Terminator = [ + "\n],\n\"last_seq\":", + ?JSON_ENCODE(EndSeq), + ",\"pending\":", + ?JSON_ENCODE(Pending), + "}\n" + ], + {ok, Resp1} = chttpd:close_delayed_json_object(Resp, Buf, Terminator, Max), chttpd:end_delayed_json_response(Resp1); changes_callback(waiting_for_updates, Acc) ->
