mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-14 12:20:24 +00:00
Change the response body streaming fun interface
Before we were required to get the socket and transport ourselves, now they're passed to the function.
This commit is contained in:
parent
d8be610d4c
commit
58e89e2189
3 changed files with 9 additions and 6 deletions
|
@ -123,7 +123,7 @@
|
||||||
-type cookie_opts() :: [cookie_option()].
|
-type cookie_opts() :: [cookie_option()].
|
||||||
-export_type([cookie_opts/0]).
|
-export_type([cookie_opts/0]).
|
||||||
|
|
||||||
-type resp_body_fun() :: fun(() -> {sent, non_neg_integer()}).
|
-type resp_body_fun() :: fun((inet:socket(), module()) -> ok).
|
||||||
|
|
||||||
-record(http_req, {
|
-record(http_req, {
|
||||||
%% Transport.
|
%% Transport.
|
||||||
|
@ -876,6 +876,7 @@ reply(Status, Headers, Req=#http_req{resp_body=Body}) ->
|
||||||
iodata() | {non_neg_integer() | resp_body_fun()}, Req)
|
iodata() | {non_neg_integer() | resp_body_fun()}, Req)
|
||||||
-> {ok, Req} when Req::req().
|
-> {ok, Req} when Req::req().
|
||||||
reply(Status, Headers, Body, Req=#http_req{
|
reply(Status, Headers, Body, Req=#http_req{
|
||||||
|
socket=Socket, transport=Transport,
|
||||||
version=Version, connection=Connection,
|
version=Version, connection=Connection,
|
||||||
method=Method, resp_state=waiting, resp_headers=RespHeaders}) ->
|
method=Method, resp_state=waiting, resp_headers=RespHeaders}) ->
|
||||||
RespConn = response_connection(Headers, Connection),
|
RespConn = response_connection(Headers, Connection),
|
||||||
|
@ -890,7 +891,8 @@ reply(Status, Headers, Body, Req=#http_req{
|
||||||
{<<"date">>, cowboy_clock:rfc1123()},
|
{<<"date">>, cowboy_clock:rfc1123()},
|
||||||
{<<"server">>, <<"Cowboy">>}
|
{<<"server">>, <<"Cowboy">>}
|
||||||
|HTTP11Headers], <<>>, Req),
|
|HTTP11Headers], <<>>, Req),
|
||||||
if RespType =/= hook, Method =/= <<"HEAD">> -> BodyFun();
|
if RespType =/= hook, Method =/= <<"HEAD">> ->
|
||||||
|
BodyFun(Socket, Transport);
|
||||||
true -> ok
|
true -> ok
|
||||||
end;
|
end;
|
||||||
_ ->
|
_ ->
|
||||||
|
|
|
@ -321,8 +321,10 @@ content_types_provided(Req, #state{filepath=Filepath,
|
||||||
-spec file_contents(cowboy_req:req(), #state{}) -> tuple().
|
-spec file_contents(cowboy_req:req(), #state{}) -> tuple().
|
||||||
file_contents(Req, #state{filepath=Filepath,
|
file_contents(Req, #state{filepath=Filepath,
|
||||||
fileinfo={ok, #file_info{size=Filesize}}}=State) ->
|
fileinfo={ok, #file_info{size=Filesize}}}=State) ->
|
||||||
{ok, Transport, Socket} = cowboy_req:transport(Req),
|
Writefile = fun(Socket, Transport) ->
|
||||||
Writefile = fun() -> Transport:sendfile(Socket, Filepath) end,
|
{ok, _} = Transport:sendfile(Socket, Filepath),
|
||||||
|
ok
|
||||||
|
end,
|
||||||
{{stream, Filesize, Writefile}, Req, State}.
|
{{stream, Filesize, Writefile}, Req, State}.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,7 @@ init({_Transport, http}, Req, Opts) ->
|
||||||
{ok, Req, #state{headers=Headers, body=Body, reply=Reply}}.
|
{ok, Req, #state{headers=Headers, body=Body, reply=Reply}}.
|
||||||
|
|
||||||
handle(Req, State=#state{headers=_Headers, body=Body, reply=set_resp}) ->
|
handle(Req, State=#state{headers=_Headers, body=Body, reply=set_resp}) ->
|
||||||
{ok, Transport, Socket} = cowboy_req:transport(Req),
|
SFun = fun(Socket, Transport) -> Transport:send(Socket, Body) end,
|
||||||
SFun = fun() -> Transport:send(Socket, Body), sent end,
|
|
||||||
SLen = iolist_size(Body),
|
SLen = iolist_size(Body),
|
||||||
Req2 = cowboy_req:set_resp_body_fun(SLen, SFun, Req),
|
Req2 = cowboy_req:set_resp_body_fun(SLen, SFun, Req),
|
||||||
{ok, Req3} = cowboy_req:reply(200, Req2),
|
{ok, Req3} = cowboy_req:reply(200, Req2),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue