%%%------------------------------------------------------------------- %%% @author Niclas Axelsson %%% @copyright (C) 2020, Niclas Axelsson %%% @doc %%% Plugins can be run at two different times; either in the beginning or at %% the end of a request. They can modify both the actual request or the nova-state. %% A plugin is implemented with the nova_plugin behaviour %%% and needs to implement three different functions: pre_request/2, %% post_request/2 and plugin_info/0. %%% %%% %%% %%% -module(example_plugin). %%% -behaviour(nova_plugin). %%% -export([pre_request/2, post_request/2, plugin_info/0]). %%% %%% pre_request(Req, State) -> %%% Req0 = cowboy_req:set_resp_header(<<"x-nova-started">>, erlang:system_time(milli_seconds), Req), %%% {ok, Req0, State}. %%% %%% post_request(Req, State) -> %%% Started = cowboy_req:header(<<"x-nova-started">>, Req), %%% Now = erlang:system_time(milli_seconds), %%% ?INFO("Request ran for ~.B milliseconds", [Now-Started]), %%% {ok, Req, State}. %%% %%% plugin_info() -> %%% {<<"Execution time plugin">>, <<"1.0.0">>, <<"Niclas Axelsson ">>, %% <<"Example plugin for nova">>}. %%% %%% %%% %%% To register the plugin above you have to call %% nova_plugin:register_plugin(RequestType, http, example_plugin). in order %%% to run it. RequestType can either be pre_request or %% post_request. %%% @end %%% Created : 12 Feb 2020 by Niclas Axelsson %%%------------------------------------------------------------------- -module(nova_plugin). -type request_type() :: pre_request | post_request. -export_type([request_type/0]). %% Define the callback functions for HTTP-plugins -callback pre_request(State :: nova:state(), Options :: map()) -> {ok, State0 :: nova:state()} | {break, State0 :: nova:state()} | {stop, State0 :: nova:state()} | {error, Reason :: term()}. -optional_callbacks([pre_request/2]). -callback post_request(State :: nova:state(), Options :: map()) -> {ok, State0 :: nova:state()} | {break, State0 :: nova:state()} | {stop, State0 :: nova:state()} | {error, Reason :: term()}. -optional_callbacks([post_request/2]). -callback plugin_info() -> {Title :: binary(), Version :: binary(), Author :: binary(), Description :: binary(), Options :: [{Key :: atom(), OptionDescription :: binary()}]}.