Packages
nova
0.6.1
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, StatusCode, StatusHeaders, StatusBody, _} ->
{[{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, StatusCode, StatusHeaders, StatusBody, _} ->
{response, StatusCode, StatusHeaders, StatusBody};
_ ->
cowboy_stream:early_error(StreamID, Reason, PartialReq, Resp, Opts)
end.