diff --git a/src/fabric/src/fabric.erl b/src/fabric/src/fabric.erl index 4a0727131b4..3f2866f8249 100644 --- a/src/fabric/src/fabric.erl +++ b/src/fabric/src/fabric.erl @@ -277,7 +277,7 @@ purge_docs(_DbName, _IdsRevs) -> {unknown_transfer_encoding, any()}) -> function() | binary(). att_receiver(Req, Length) -> - fabric_doc_attachments:receiver(Req, Length). + fabric_doc_attachments2:receiver_tuple(Req, Length). %% @equiv all_docs(DbName, [], Callback, Acc0, QueryArgs) all_docs(DbName, Callback, Acc, QueryArgs) -> diff --git a/src/fabric/src/fabric_doc_attachments.erl b/src/fabric/src/fabric_doc_attachments.erl index 7c6ba661067..5afcc891a8d 100644 --- a/src/fabric/src/fabric_doc_attachments.erl +++ b/src/fabric/src/fabric_doc_attachments.erl @@ -15,23 +15,34 @@ -include_lib("fabric/include/fabric.hrl"). -include_lib("couch/include/couch_db.hrl"). -%% couch api calls --export([receiver/2]). +-export([ + receiver_tuple/2, + receiver_callback/2 +]). -receiver(_Req, undefined) -> + +receiver_tuple(_Req, undefined) -> <<"">>; -receiver(_Req, {unknown_transfer_encoding, Unknown}) -> +receiver_tuple(_Req, {unknown_transfer_encoding, Unknown}) -> exit({unknown_transfer_encoding, Unknown}); -receiver(Req, chunked) -> +receiver_tuple(Req, chunked) -> MiddleMan = spawn(fun() -> middleman(Req, chunked) end), - fun(4096, ChunkFun, State) -> - write_chunks(MiddleMan, ChunkFun, State) - end; -receiver(_Req, 0) -> + {fabric_attachment_receiver, MiddleMan, chunked}; +receiver_tuple(_Req, 0) -> <<"">>; -receiver(Req, Length) when is_integer(Length) -> +receiver_tuple(Req, Length) when is_integer(Length) -> maybe_send_continue(Req), Middleman = spawn(fun() -> middleman(Req, Length) end), + {fabric_attachment_receiver, Middleman, Length}; +receiver_tuple(_Req, Length) -> + exit({length_not_integer, Length}). + + +receiver_callback(Middleman, chunked) -> + fun(4096, ChunkFun, State) -> + write_chunks(Middleman, ChunkFun, State) + end; +receiver_callback(Middleman, Length) when is_integer(Length) -> fun() -> Middleman ! {self(), gimme_data}, Timeout = fabric_util:attachments_timeout(), @@ -42,9 +53,8 @@ receiver(Req, Length) when is_integer(Length) -> after Timeout -> exit(timeout) end - end; -receiver(_Req, Length) -> - exit({length_not_integer, Length}). + end. + %% %% internal diff --git a/src/fabric/src/fabric_rpc.erl b/src/fabric/src/fabric_rpc.erl index 913aafe0e28..418c750697d 100644 --- a/src/fabric/src/fabric_rpc.erl +++ b/src/fabric/src/fabric_rpc.erl @@ -440,6 +440,8 @@ make_att_reader({follows, Parser, Ref}) -> throw({mp_parser_died, Reason}) end end; +make_att_reader({fabric_attachment_receiver, Middleman, Length}) -> + fabric_doc_attachments2:receiver_callback(Middleman, Length); make_att_reader(Else) -> Else.