Packages
nova
0.8.5
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_plugin_handler.erl
-module(nova_plugin_handler).
-behaviour(cowboy_middleware).
-export([
execute/2
]).
-include_lib("nova/include/nova.hrl").
execute(Req = #{plugins := Plugins}, Env = #{plugin_state := pre_request}) ->
%% This is a post plugin
PostPlugins = proplists:get_value(post_request, Plugins, []),
run_plugins(PostPlugins, post_request, Req, Env);
execute(Req = #{plugins := Plugins}, Env) ->
%% Determine which pre-plugin this is
PrePlugins = proplists:get_value(pre_request, Plugins, []),
run_plugins(PrePlugins, pre_request, Req, Env);
execute(Req, Env) ->
%% The router could not find any match for us
{ok, Req, Env}.
run_plugins([], Callback, Req, Env) ->
{ok, Req, Env#{plugin_state => Callback}};
run_plugins([{Module, Options}|Tl], Callback, Req, Env) ->
try Module:Callback(Req, Options) of
{ok, Req0} ->
run_plugins(Tl, Callback, Req0, Env);
{break, Req0} ->
{ok, Req0};
{stop, Req0} ->
{stop, Req0}
catch
Class:Reason:Stacktrace ->
?ERROR("Plugin crashed (~p, ~p), Stacktrace: ~p", [Class, Reason, Stacktrace]),
Req0 = Req#{crash_info => #{class => Class,
reason => Reason,
stacktrace => Stacktrace}},
nova_router:render_status_page('_', 500, #{}, Req0, Env)
end.