Browse Source

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.
Loïc Hoguin 12 years ago
parent
commit
58e89e2189
3 changed files with 9 additions and 6 deletions
  1. 4 2
      src/cowboy_req.erl
  2. 4 2
      src/cowboy_static.erl
  3. 1 2
      test/http_handler_stream_body.erl

+ 4 - 2
src/cowboy_req.erl

@@ -123,7 +123,7 @@
 -type cookie_opts() :: [cookie_option()].
 -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, {
 	%% Transport.
@@ -876,6 +876,7 @@ reply(Status, Headers, Req=#http_req{resp_body=Body}) ->
 	iodata() | {non_neg_integer() | resp_body_fun()}, Req)
 	-> {ok, Req} when Req::req().
 reply(Status, Headers, Body, Req=#http_req{
+		socket=Socket, transport=Transport,
 		version=Version, connection=Connection,
 		method=Method, resp_state=waiting, resp_headers=RespHeaders}) ->
 	RespConn = response_connection(Headers, Connection),
@@ -890,7 +891,8 @@ reply(Status, Headers, Body, Req=#http_req{
 					{<<"date">>, cowboy_clock:rfc1123()},
 					{<<"server">>, <<"Cowboy">>}
 				|HTTP11Headers], <<>>, Req),
-			if	RespType =/= hook, Method =/= <<"HEAD">> -> BodyFun();
+			if	RespType =/= hook, Method =/= <<"HEAD">> ->
+					BodyFun(Socket, Transport);
 				true -> ok
 			end;
 		_ ->

+ 4 - 2
src/cowboy_static.erl

@@ -321,8 +321,10 @@ content_types_provided(Req, #state{filepath=Filepath,
 -spec file_contents(cowboy_req:req(), #state{}) -> tuple().
 file_contents(Req, #state{filepath=Filepath,
 		fileinfo={ok, #file_info{size=Filesize}}}=State) ->
-	{ok, Transport, Socket} = cowboy_req:transport(Req),
-	Writefile = fun() -> Transport:sendfile(Socket, Filepath) end,
+	Writefile = fun(Socket, Transport) ->
+		{ok, _} = Transport:sendfile(Socket, Filepath),
+		ok
+	end,
 	{{stream, Filesize, Writefile}, Req, State}.
 
 

+ 1 - 2
test/http_handler_stream_body.erl

@@ -13,8 +13,7 @@ init({_Transport, http}, Req, Opts) ->
 	{ok, Req, #state{headers=Headers, body=Body, reply=Reply}}.
 
 handle(Req, State=#state{headers=_Headers, body=Body, reply=set_resp}) ->
-	{ok, Transport, Socket} = cowboy_req:transport(Req),
-	SFun = fun() -> Transport:send(Socket, Body), sent end,
+	SFun = fun(Socket, Transport) -> Transport:send(Socket, Body) end,
 	SLen = iolist_size(Body),
 	Req2 = cowboy_req:set_resp_body_fun(SLen, SFun, Req),
 	{ok, Req3} = cowboy_req:reply(200, Req2),