Packages
nova
0.6.2
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_request_plugin.erl
-module(nova_request_plugin).
-behaviour(nova_plugin).
-include_lib("nova/include/nova.hrl").
-export([
pre_http_request/2,
post_http_request/2,
plugin_info/0
]).
%%--------------------------------------------------------------------
%% @doc
%% Pre-request callback
%% @end
%%--------------------------------------------------------------------
-spec pre_http_request(State :: nova_http_handler:nova_http_state(), Options :: map()) ->
{ok, State0 :: nova_http_handler:nova_http_state()} |
{stop, State0 :: nova_http_handler:nova_http_state()} |
{error, Reason :: term()}.
pre_http_request(State, Options) ->
Options0 = [ K || {K, V} <- maps:to_list(Options),
V == true ],
{ok, State0} = modulate_state(State, Options0),
{ok, State0}.
%%--------------------------------------------------------------------
%% @doc
%% Post-request callback
%% @end
%%--------------------------------------------------------------------
-spec post_http_request(State :: nova_http_handler:nova_http_state(), Options :: map()) ->
{ok, State0 :: nova_http_handler:nova_http_state()} |
{stop, State0 :: nova_http_handler:nova_http_state()} |
{error, Reason :: term()}.
post_http_request(State, _Options) ->
{ok, State}.
%%--------------------------------------------------------------------
%% @doc
%% nova_plugin callback. Returns information about the plugin.
%% @end
%%--------------------------------------------------------------------
-spec plugin_info() -> {Title :: binary(),
Version :: binary(),
Author :: binary(),
Description :: binary(),
Options :: [{Key :: atom(), OptionDescription :: binary()}]}.
plugin_info() ->
{<<"Nova body plugin">>,
<<"0.0.1">>,
<<"Nova team <info@novaframework.org">>,
<<"This plugin modulates the body of a request.">>,
[
{parse_bindings, <<"Used to parse bindings and put them in state under `bindings` key">>},
{read_body, <<"Reads the body and put it under the `body`">>},
{decode_json_body, <<"Decodes the body as JSON and puts it under `json`">>}
]}.
modulate_state(State, []) -> {ok, State};
modulate_state(State = #{req := Req, controller_data := ControllerData}, [parse_bindings|Tl]) ->
Bindings = cowboy_req:bindings(Req),
modulate_state(State#{controller_data => ControllerData#{bindings => Bindings}}, Tl);
modulate_state(State = #{req := Req = #{headers := #{<<"content-type">> := <<"application/json">>}},
controller_data := ControllerData},
[decode_json_body|Tl]) ->
case cowboy_req:has_body(Req) of
true ->
%% First read in the body
{ok, Data, Req0} = cowboy_req:read_body(Req),
%% Decode the data
JSON = json:decode(Data, [maps, binary]),
modulate_state(State#{req => Req0, controller_data => ControllerData#{json => JSON}}, Tl);
false ->
modulate_state(State#{controller_data => ControllerData#{json => #{}}}, Tl)
end;
modulate_state(State = #{req := Req,
controller_data := ControllerData}, [read_body|Tl]) ->
%% Fetch the body
{ok, Data, Req0} = cowboy_req:read_body(Req),
modulate_state(State#{req => Req0, controller_data => ControllerData#{body => Data}}, Tl);
modulate_state(State, [_|Tl]) ->
modulate_state(State, Tl).