From 45f6989a13dc92b98194bc0ad204a79f03e684c9 Mon Sep 17 00:00:00 2001 From: Robert Newson Date: Thu, 10 Sep 2020 23:29:48 +0100 Subject: Fix buffer_response=true (#3145) (#3147) We need to call StartFun as it might add headers, etc. --- src/chttpd/src/chttpd.erl | 9 +++++++-- src/chttpd/test/eunit/chttpd_delayed_test.erl | 15 +++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/chttpd/src/chttpd.erl b/src/chttpd/src/chttpd.erl index 5e558ca92..dd67fd589 100644 --- a/src/chttpd/src/chttpd.erl +++ b/src/chttpd/src/chttpd.erl @@ -855,13 +855,18 @@ end_delayed_json_response(#delayed_resp{buffer_response=false}=DelayedResp) -> end_delayed_json_response(#delayed_resp{buffer_response=true}=DelayedResp) -> #delayed_resp{ + start_fun = StartFun, req = Req, code = Code, headers = Headers, chunks = Chunks } = DelayedResp, - {ok, Resp} = start_response_length(Req, Code, Headers, iolist_size(Chunks)), - send(Resp, lists:reverse(Chunks)). + {ok, Resp} = StartFun(Req, Code, Headers), + lists:foreach(fun + ([]) -> ok; + (Chunk) -> send_chunk(Resp, Chunk) + end, lists:reverse(Chunks)), + end_json_response(Resp). get_delayed_req(#delayed_resp{req=#httpd{mochi_req=MochiReq}}) -> diff --git a/src/chttpd/test/eunit/chttpd_delayed_test.erl b/src/chttpd/test/eunit/chttpd_delayed_test.erl index 64232dcf8..63e6cb0e5 100644 --- a/src/chttpd/test/eunit/chttpd_delayed_test.erl +++ b/src/chttpd/test/eunit/chttpd_delayed_test.erl @@ -17,7 +17,7 @@ setup() -> Hashed = couch_passwords:hash_admin_password(?PASS), ok = config:set("admins", ?USER, ?b2l(Hashed), _Persist=false), - ok = config:set("chttpd", "buffer_response", "true"), + ok = config:set("chttpd", "buffer_response", "true", _Persist=false), TmpDb = ?tempdb(), Addr = config:get("chttpd", "bind_address", "127.0.0.1"), Port = mochiweb_socket_server:get(chttpd, port), @@ -57,17 +57,16 @@ all_test_() -> test_buffer_response_all_docs(Url) -> - assert_has_content_length(Url ++ "/_all_docs"). + assert_successful_response(Url ++ "/_all_docs"). test_buffer_response_changes(Url) -> - assert_has_content_length(Url ++ "/_changes"). + assert_successful_response(Url ++ "/_changes"). -assert_has_content_length(Url) -> +assert_successful_response(Url) -> {timeout, ?TIMEOUT, ?_test(begin - {ok, Code, Headers, _Body} = test_request:get(Url, [?AUTH]), - ?assertEqual(200, Code), - ?assert(lists:keymember("Content-Length", 1, Headers)) + {ok, Code, _Headers, _Body} = test_request:get(Url, [?AUTH]), + ?assertEqual(200, Code) end)}. - \ No newline at end of file + -- cgit v1.2.1