emqx/apps/emqx_web_hook/test/http_server.erl

76 lines
2.4 KiB
Erlang

%%--------------------------------------------------------------------
%% A Simple HTTP Server based cowboy
%%
%% It will deliver the http-request params to initialer process
%%--------------------------------------------------------------------
-module(http_server).
-compile(export_all).
-compile(nowarn_export_all).
%%--------------------------------------------------------------------
%% APIs
%%--------------------------------------------------------------------
start() ->
{ok, _} = application:ensure_all_started(cowboy),
cowboy_router:compile([
{'_', [
{"/", ?MODULE, self()}
]}
]).
start_http() ->
{ok, _Pid1} = cowboy:start_clear(http, [{port, 8080}], #{
env => #{dispatch => start()}
}),
io:format("Start http server on 8080 successfully!~n").
start_https() ->
Path = emqx_ct_helpers:deps_path(emqx_web_hook, "test/emqx_web_hook_SUITE_data/"),
SslOpts = [{keyfile, Path ++ "/server-key.pem"},
{cacertfile, Path ++ "/ca.pem"},
{certfile, Path ++ "/server-cert.pem"}],
{ok, _Pid2} = cowboy:start_tls(https, [{port, 8081}] ++ SslOpts,
#{env => #{dispatch => start()}}),
io:format(standard_error, "Start https server on 8081 successfully!~n", []).
stop_http() ->
ok = cowboy:stop_listener(http),
io:format("Stopped http server on 8080").
stop_https() ->
ok = cowboy:stop_listener(https),
io:format("Stopped https server on 8081").
%%--------------------------------------------------------------------
%% Callbacks
%%--------------------------------------------------------------------
init(Req, ReceiverPid) ->
Req1 = handle_request(Req, ReceiverPid),
{ok, Req1, ReceiverPid}.
%% @private
handle_request(Req, ReceiverPid) ->
Method = cowboy_req:method(Req),
Headers = cowboy_req:headers(Req),
Params =
case Method of
<<"GET">> -> cowboy_req:parse_qs(Req);
<<"POST">> ->
{ok, PostVals, _Req2} = cowboy_req:read_urlencoded_body(Req),
PostVals
end,
io:format("Request Data:~p~nHeaders :~p~n", [Params, Headers]),
erlang:send(ReceiverPid, {Params, Headers}),
reply(Req, ok).
%% @private
reply(Req, ok) ->
cowboy_req:reply(200, #{<<"content-type">> => <<"text/plain">>}, <<"hello">>, Req);
reply(Req, error) ->
cowboy_req:reply(404, #{<<"content-type">> => <<"text/plain">>}, <<"deny">>, Req).