Packages
nova
0.7.0
0.15.1
0.14.3
0.14.1
0.13.7
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.11
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.4.4
0.4.3
0.4.2
0.4.1
0.2.2
0.1.0
0.0.1
0.0.0
Nova is a web application framework
Current section
Files
Jump to
Current section
Files
src/nova_stream_h.erl
-module(nova_stream_h).
-behavior(cowboy_stream).
-export([
init/3,
data/4,
info/3,
terminate/3,
early_error/5
]).
-include_lib("nova/include/nova.hrl").
-record(state, {
next :: any(),
req
}).
-type state() :: #state{}.
-spec init(cowboy_stream:streamid(), cowboy_req:req(), cowboy:opts())
-> {cowboy_stream:commands(), state()}.
init(StreamID, Req, Opts) ->
Req0 =
case nova:get_env(use_sessions, true) of
true ->
Cookies = cowboy_req:parse_cookies(Req),
case lists:keyfind(<<"session_id">>, 1, Cookies) of
{_, _} -> Req;
_ ->
{ok, SessionId} = nova_session:generate_session_id(),
cowboy_req:set_resp_cookie(<<"session_id">>, SessionId, Req)
end;
false ->
Req
end,
{Commands, Next} = cowboy_stream:init(StreamID, Req0, Opts),
{Commands, #state{req = Req0, next = Next}}.
-spec data(cowboy_stream:streamid(), cowboy_stream:fin(), cowboy_req:resp_body(), State)
-> {cowboy_stream:commands(), State} when State::state().
data(StreamID, IsFin, Data, State = #state{next = Next}) ->
{Commands, Next0} = cowboy_stream:data(StreamID, IsFin, Data, Next),
{Commands, State#state{next = Next0}}.
-spec info(cowboy_stream:streamid(), any(), State)
-> {cowboy_stream:commands(), State} when State::state().
info(StreamID, {response, Code, _Headers, _Body} = Info, State = #state{next = Next, req = Req})
when is_integer(Code) ->
case nova_router:status_page(Code, Req) of
{ok, _NovaHttpState = #{req := Req, resp_status := StatusCode}} ->
StatusHeaders = cowboy_req:resp_headers(Req),
StatusBody = maps:get(resp_body, Req, <<"">>),
{[{error_response, StatusCode, StatusHeaders, StatusBody},
stop], State};
_ ->
{Commands, Next0} = cowboy_stream:info(StreamID, Info, Next),
{Commands, State#state{next = Next0}}
end;
info(StreamID, Info, State = #state{next = Next}) ->
{Commands, Next0} = cowboy_stream:info(StreamID, Info, Next),
{Commands, State#state{next = Next0}}.
-spec terminate(cowboy_stream:streamid(), cowboy_stream:reason(), state()) -> any().
terminate(StreamID, Reason, #state{next = Next}) ->
cowboy_stream:terminate(StreamID, Reason, Next).
-spec early_error(cowboy_stream:streamid(), cowboy_stream:reason(),
cowboy_stream:partial_req(), Resp, cowboy:opts())
-> Resp
when Resp::cowboy_stream:resp_command().
early_error(StreamID, Reason, PartialReq, {_, Status, _Headers, _} = Resp, Opts) ->
case nova_router:status_page(Status, PartialReq) of
{ok, _NovaHttpState = #{req := Req, resp_status := StatusCode}} ->
StatusHeaders = cowboy_req:resp_headers(Req),
StatusBody = maps:get(resp_body, Req, <<"">>),
{response, StatusCode, StatusHeaders, StatusBody};
_ ->
cowboy_stream:early_error(StreamID, Reason, PartialReq, Resp, Opts)
end.