From a29d505690dd17ad2bde5358643381011bbfbe71 Mon Sep 17 00:00:00 2001 From: SisMaker <156736github> Date: Fri, 14 Jan 2022 00:33:35 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/eWSrv.hrl | 3 +- include/wsCom.hrl | 7 ++--- rebar.config | 4 +-- src/test/elli_tests.erl | 42 +++++++++++++------------ src/test/wsTc.erl | 21 +++++++------ src/wsSrv/elli.erl | 13 +++----- src/wsSrv/elli_example_callback.erl | 2 +- src/wsSrv/elli_handler.erl | 2 +- src/wsSrv/elli_http.erl | 40 ++++++++++------------- src/wsSrv/{elli_util.erl => wsUtil.erl} | 5 +-- 10 files changed, 64 insertions(+), 75 deletions(-) rename src/wsSrv/{elli_util.erl => wsUtil.erl} (97%) diff --git a/include/eWSrv.hrl b/include/eWSrv.hrl index a16dba9..e10dd87 100644 --- a/include/eWSrv.hrl +++ b/include/eWSrv.hrl @@ -14,5 +14,4 @@ callback :: elli_handler:callback() }). --define(EXAMPLE_CONF, [{callback, elli_example_callback}, - {callback_args, []}]). +-define(EXAMPLE_CONF, [{callback, elli_example_callback}, {callback_args, []}]). diff --git a/include/wsCom.hrl b/include/wsCom.hrl index b98d798..273a34c 100644 --- a/include/wsCom.hrl +++ b/include/wsCom.hrl @@ -1,10 +1,7 @@ +-define(wsErr(Str), error_logger:error_msg(Str)). -define(wsErr(Format, Args), error_logger:error_msg(Format, Args)). -define(wsWarn(Format, Args), error_logger:warning_msg(Format, Args)). -define(wsInfo(Format, Args), error_logger:info_msg(Format, Args)). --define(wsGLV(Key, List, Default), elli_util:getLValue(Key, List, Default)). - --define(LOG_ERROR(Str), error_logger:error_msg(Str)). --define(LOG_ERROR(Format, Data), error_logger:error_msg(Format, Data)). --define(LOG_INFO(Format, Data), error_logger:info_msg(Format, Data)). +-define(wsGLV(Key, List, Default), wsUtil:gLV(Key, List, Default)). -define(IIF(Cond, Then, That), case Cond of true -> Then; _ -> That end). diff --git a/rebar.config b/rebar.config index 67245ac..df54df1 100644 --- a/rebar.config +++ b/rebar.config @@ -9,10 +9,8 @@ {deps, [ {eNet, ".*", {git, "http://sismaker.tpddns.cn:53000/SisMaker/eNet.git", {branch, "master"}}}, - {eFmt, ".*", {git, "http://sismaker.tpddns.cn:53000/SisMaker/eFmt.git", {branch, "master"}}}, {eGbh, ".*", {git, "http://sismaker.tpddns.cn:53000/SisMaker/eGbh.git", {branch, "master"}}}, - {eSync, ".*", {git, "http://sismaker.tpddns.cn:53000/SisMaker/eSync.git", {branch, "master"}}}, - {jiffy, ".*", {git, "http://sismaker.tpddns.cn:53000/SisMaker/jiffy.git", {branch, "master"}}} + {eSync, ".*", {git, "http://sismaker.tpddns.cn:53000/SisMaker/eSync.git", {branch, "master"}}} ]}. {shell, [ diff --git a/src/test/elli_tests.erl b/src/test/elli_tests.erl index 17909db..f538d29 100644 --- a/src/test/elli_tests.erl +++ b/src/test/elli_tests.erl @@ -1,6 +1,8 @@ -module(elli_tests). -include_lib("eunit/include/eunit.hrl"). -include("eWSrv.hrl"). +-include("wsCom.hrl"). + -include("elli_test.hrl"). -define(README, "README.md"). @@ -10,9 +12,9 @@ -ifdef(OTP_RELEASE). -include_lib("kernel/include/logger.hrl"). -else. --define(LOG_ERROR(Str), error_logger:error_msg(Str)). --define(LOG_ERROR(Format, Data), error_logger:error_msg(Format, Data)). --define(LOG_INFO(Format, Data), error_logger:info_msg(Format, Data)). +-define(wsErr(Str), error_logger:error_msg(Str)). +-define(wsErr(Format, Data), error_logger:error_msg(Format, Data)). +-define(wsInfo(Format, Data), error_logger:info_msg(Format, Data)). -endif. time_diff_to_micro_seconds(T1, T2) -> @@ -474,7 +476,7 @@ sendfile_range() -> {ok, Fd} = file:open(F, [read, raw, binary]), {ok, Expected} = file:pread(Fd, 300, 400), file:close(Fd), - Size = elli_util:file_size(F), + Size = wsUtil:file_size(F), ?assertMatch(206, status(Response)), ?assertHeadersEqual([{<<"connection">>, <<"Keep-Alive">>}, {<<"content-length">>, <<"400">>}, @@ -548,7 +550,7 @@ get_pipeline() -> true -> ok; false -> - ?LOG_INFO("Expected: ~p~nResult: ~p~n", + ?wsInfo("Expected: ~p~nResult: ~p~n", [binary:copy(ExpectedResponse, 2), Res]) end, @@ -613,7 +615,7 @@ send(Socket, B, ChunkSize) -> <> -> {P, R}; P -> {P, <<>>} end, - %%?LOG_INFO("~p~n", [Part]), + %%?wsInfo("~p~n", [Part]), gen_tcp:send(Socket, Part), timer:sleep(1), send(Socket, Rest, ChunkSize). @@ -707,24 +709,24 @@ normalize_range_test_() -> Invalid5 = parse_error, Invalid6 = [{bytes, 0, 100}, {suffix, 42}], - [?_assertMatch({200, 201}, elli_util:normalize_range(Bytes1, Size)), - ?_assertMatch({0, Size}, elli_util:normalize_range(Bytes2, Size)), - ?_assertEqual({Size - 303, 303}, elli_util:normalize_range(Suffix, Size)), - ?_assertEqual({42, Size - 42}, elli_util:normalize_range(Offset, Size)), - ?_assertMatch({200, 400}, elli_util:normalize_range(Normal, Size)), - ?_assertMatch({0, 1000}, elli_util:normalize_range(Set, Size)), - ?_assertMatch(undefined, elli_util:normalize_range(EmptySet, Size)), - ?_assertMatch(invalid_range, elli_util:normalize_range(Invalid1, Size)), - ?_assertMatch(invalid_range, elli_util:normalize_range(Invalid2, Size)), - ?_assertMatch(invalid_range, elli_util:normalize_range(Invalid3, Size)), - ?_assertMatch(invalid_range, elli_util:normalize_range(Invalid4, Size)), - ?_assertMatch(invalid_range, elli_util:normalize_range(Invalid5, Size)), - ?_assertMatch(invalid_range, elli_util:normalize_range(Invalid6, Size))]. + [?_assertMatch({200, 201}, wsUtil:normalize_range(Bytes1, Size)), + ?_assertMatch({0, Size}, wsUtil:normalize_range(Bytes2, Size)), + ?_assertEqual({Size - 303, 303}, wsUtil:normalize_range(Suffix, Size)), + ?_assertEqual({42, Size - 42}, wsUtil:normalize_range(Offset, Size)), + ?_assertMatch({200, 400}, wsUtil:normalize_range(Normal, Size)), + ?_assertMatch({0, 1000}, wsUtil:normalize_range(Set, Size)), + ?_assertMatch(undefined, wsUtil:normalize_range(EmptySet, Size)), + ?_assertMatch(invalid_range, wsUtil:normalize_range(Invalid1, Size)), + ?_assertMatch(invalid_range, wsUtil:normalize_range(Invalid2, Size)), + ?_assertMatch(invalid_range, wsUtil:normalize_range(Invalid3, Size)), + ?_assertMatch(invalid_range, wsUtil:normalize_range(Invalid4, Size)), + ?_assertMatch(invalid_range, wsUtil:normalize_range(Invalid5, Size)), + ?_assertMatch(invalid_range, wsUtil:normalize_range(Invalid6, Size))]. encode_range_test() -> Expected = [<<"bytes ">>, <<"*">>, <<"/">>, <<"42">>], - ?assertMatch(Expected, elli_util:encode_range(invalid_range, 42)). + ?assertMatch(Expected, wsUtil:encode_range(invalid_range, 42)). register_test() -> ?assertMatch(undefined, whereis(elli)), diff --git a/src/test/wsTc.erl b/src/test/wsTc.erl index 66263a5..c94230c 100644 --- a/src/test/wsTc.erl +++ b/src/test/wsTc.erl @@ -47,8 +47,8 @@ cvrTimeUnit(Time, FromUnit, ToUnit) -> case FromUnit of native -> erts_internal:time_unit(); perf_counter -> erts_internal:perf_counter_unit(); - nanosecond -> 1000 * 1000 * 1000; - microsecond -> 1000 * 1000; + nanosecond -> 1000000000; + microsecond -> 1000000; millisecond -> 1000; second -> 1 end, @@ -56,8 +56,8 @@ cvrTimeUnit(Time, FromUnit, ToUnit) -> case ToUnit of native -> erts_internal:time_unit(); perf_counter -> erts_internal:perf_counter_unit(); - nanosecond -> 1000 * 1000 * 1000; - microsecond -> 1000 * 1000; + nanosecond -> 1000000000; + microsecond -> 1000000; millisecond -> 1000; second -> 1 end, @@ -148,12 +148,13 @@ tm(ProcCnt, LoopTime, M, F, A) -> io:format("execute Mod :~p~n", [M]), io:format("execute LoopTime:~p~n", [LoopTime]), io:format("execute ProcCnts:~p~n", [ProcCnt]), - io:format("MaxTime: ~10s(ns) ~10s(s)~n", [integer_to_binary(Max), float_to_binary(Max / 1000000000, [{decimals, 6}, compact])]), - io:format("MinTime: ~10s(ns) ~10s(s)~n", [integer_to_binary(Min), float_to_binary(Min / 1000000000, [{decimals, 6}, compact])]), - io:format("SumTime: ~10s(ns) ~10s(s)~n", [integer_to_binary(Sum), float_to_binary(Sum / 1000000000, [{decimals, 6}, compact])]), - io:format("AvgTime: ~10s(ns) ~10s(s)~n", [float_to_binary(Aver, [{decimals, 6}, compact]), float_to_binary(Aver / 1000000000, [{decimals, 6}, compact])]), - io:format("Grar : ~10s(cn) ~10s(~s)~n", [integer_to_binary(Greater), float_to_binary(Greater / LoopTime, [{decimals, 2}]), <<"%">>]), - io:format("Less : ~10s(cn) ~10s(~s)~n", [integer_to_binary(Less), float_to_binary(Less / LoopTime, [{decimals, 2}]), <<"%">>]), + io:format("PMaxTime: ~10s(ns) ~10s(s)~n", [integer_to_binary(Max), float_to_binary(Max / 1000000000, [{decimals, 6}, compact])]), + io:format("PMinTime: ~10s(ns) ~10s(s)~n", [integer_to_binary(Min), float_to_binary(Min / 1000000000, [{decimals, 6}, compact])]), + io:format("PSumTime: ~10s(ns) ~10s(s)~n", [integer_to_binary(Sum), float_to_binary(Sum / 1000000000, [{decimals, 6}, compact])]), + io:format("PAvgTime: ~10s(ns) ~10s(s)~n", [float_to_binary(Aver, [{decimals, 6}, compact]), float_to_binary(Aver / 1000000000, [{decimals, 6}, compact])]), + io:format("FAvgTime: ~10s(ns) ~10s(s)~n", [float_to_binary(Aver / LoopTime, [{decimals, 6}, compact]), float_to_binary(Aver / LoopTime / 1000000000, [{decimals, 6}, compact])]), + io:format("PGrar : ~10s(cn) ~10s(~s)~n", [integer_to_binary(Greater), float_to_binary(Greater / ProcCnt, [{decimals, 2}]), <<"%">>]), + io:format("PLess : ~10s(cn) ~10s(~s)~n", [integer_to_binary(Less), float_to_binary(Less / ProcCnt, [{decimals, 2}]), <<"%">>]), io:format("=====================~n"). diff --git a/src/wsSrv/elli.erl b/src/wsSrv/elli.erl index ee23723..5b46234 100644 --- a/src/wsSrv/elli.erl +++ b/src/wsSrv/elli.erl @@ -30,8 +30,7 @@ %% @type http_method(). An uppercase atom representing a known HTTP verb or a %% binary for other verbs. --type http_method() :: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' -| 'PUT' | 'DELETE' | 'TRACE' | binary(). +-type http_method() :: 'OPTIONS' | 'GET' | 'HEAD' | 'POST'| 'PUT' | 'DELETE' | 'TRACE' | binary(). %% @type body(). A binary or iolist. -type body() :: binary() | iolist(). @@ -71,8 +70,7 @@ start_link() -> start_link(?EXAMPLE_CONF). Pid :: pid(), Error :: {already_started, Pid} | term(). start_link(Opts) -> - valid_callback(required_opt(callback, Opts)) - orelse throw(invalid_callback), + valid_callback(required_opt(callback, Opts)) orelse throw(invalid_callback), case proplists:get_value(name, Opts) of undefined -> @@ -162,8 +160,7 @@ init([Opts]) -> Acceptors = ets:new(acceptors, [private, set]), [begin - Pid = elli_http:start_link(self(), Socket, Options, - {Callback, CallbackArgs}), + Pid = elli_http:start_link(self(), Socket, Options, {Callback, CallbackArgs}), ets:insert(Acceptors, {Pid}) end || _ <- lists:seq(1, MinAcceptors)], @@ -217,14 +214,14 @@ handle_cast(_Msg, State) -> Result :: {stop, emfile, State0} | {noreply, State1 :: state()}. handle_info({'EXIT', _Pid, {error, emfile}}, State) -> - ?LOG_ERROR("No more file descriptors, shutting down~n"), + ?wsErr("No more file descriptors, shutting down~n"), {stop, emfile, State}; handle_info({'EXIT', Pid, normal}, State) -> {noreply, remove_acceptor(State, Pid)}; handle_info({'EXIT', Pid, Reason}, State) -> - ?LOG_ERROR("Elli request (pid ~p) unexpectedly crashed:~n~p~n", [Pid, Reason]), + ?wsErr("Elli request (pid ~p) unexpectedly crashed:~n~p~n", [Pid, Reason]), {noreply, remove_acceptor(State, Pid)}. diff --git a/src/wsSrv/elli_example_callback.erl b/src/wsSrv/elli_example_callback.erl index 606951e..fc197cf 100644 --- a/src/wsSrv/elli_example_callback.erl +++ b/src/wsSrv/elli_example_callback.erl @@ -224,7 +224,7 @@ chunk_loop(Ref, N) -> case elli_request:send_chunk(Ref, [<<"chunk">>, integer_to_binary(N)]) of ok -> ok; - {error, Reason} -> ?LOG_ERROR("error in sending chunk: ~p~n", [Reason]) + {error, Reason} -> ?wsErr("error in sending chunk: ~p~n", [Reason]) end, chunk_loop(Ref, N - 1). diff --git a/src/wsSrv/elli_handler.erl b/src/wsSrv/elli_handler.erl index e264a89..0108338 100644 --- a/src/wsSrv/elli_handler.erl +++ b/src/wsSrv/elli_handler.erl @@ -27,7 +27,7 @@ -type result() :: {elli:response_code() | ok, elli:headers(), {file, file:name_all()} - | {file, file:name_all(), elli_util:range()}} + | {file, file:name_all(), wsUtil:range()}} | {elli:response_code() | ok, elli:headers(), elli:body()} | {elli:response_code() | ok, elli:body()} | {chunk, elli:headers()} diff --git a/src/wsSrv/elli_http.erl b/src/wsSrv/elli_http.erl index 406a814..1ad642d 100644 --- a/src/wsSrv/elli_http.erl +++ b/src/wsSrv/elli_http.erl @@ -178,7 +178,7 @@ handle_response(Req, Buffer, {file, ResponseCode, UserHeaders, ResponseHeaders = [connection(Req, UserHeaders) | UserHeaders], - case elli_util:file_size(Filename) of + case wsUtil:file_size(Filename) of {error, FileError} -> handle_event(Mod, file_error, [FileError], Args), send_server_error(Req#req.socket), @@ -186,21 +186,21 @@ handle_response(Req, Buffer, {file, ResponseCode, UserHeaders, exit(normal); Size -> t(send_start), - case elli_util:normalize_range(Range, Size) of + case wsUtil:normalize_range(Range, Size) of undefined -> send_file(Req, ResponseCode, [{<<"Content-Length">>, Size} | ResponseHeaders], Filename, {0, 0}); {Offset, Length} -> - ERange = elli_util:encode_range({Offset, Length}, Size), + ERange = wsUtil:encode_range({Offset, Length}, Size), send_file(Req, 206, lists:append(ResponseHeaders, [{<<"Content-Length">>, Length}, {<<"Content-Range">>, ERange}]), Filename, {Offset, Length}); invalid_range -> - ERange = elli_util:encode_range(invalid_range, Size), + ERange = wsUtil:encode_range(invalid_range, Size), send_response(Req, 416, lists:append(ResponseHeaders, [{<<"Content-Length">>, 0}, @@ -251,7 +251,7 @@ send_response(Req, Code, Headers, UserBody) -> Code :: elli:response_code(), Headers :: elli:headers(), Filename :: file:filename(), - Range :: elli_util:range(). + Range :: wsUtil:range(). send_file(#req{callback = {Mod, Args}} = Req, Code, Headers, Filename, Range) -> ResponseHeaders = assemble_response_headers(Code, Headers), @@ -323,21 +323,15 @@ execute_callback(#req{callback = {Mod, Args}} = Req) -> catch throw:{ResponseCode, Headers, Body} when is_integer(ResponseCode) -> {response, ResponseCode, Headers, Body}; - ?WITH_STACKTRACE(throw, Exc, Stacktrace) -handle_event(Mod, request_throw, - [Req, Exc, Stacktrace], - Args), -{response, 500, [], <<"Internal server error">>}; -?WITH_STACKTRACE(error, Error, Stacktrace) -handle_event(Mod, request_error, -[Req, Error, Stacktrace], -Args), -{response, 500, [], <<"Internal server error">>}; -?WITH_STACKTRACE(exit, Exit, Stacktrace) -handle_event(Mod, request_exit, -[Req, Exit, Stacktrace], -Args), -{response, 500, [], <<"Internal server error">>} + throw:Exc:Stacktrace -> + handle_event(Mod, request_throw, [Req, Exc, Stacktrace], Args), + {response, 500, [], <<"Internal server error">>}; + error:Error:Stacktrace -> + handle_event(Mod, request_error, [Req, Error, Stacktrace], Args), + {response, 500, [], <<"Internal server error">>}; + exit:Exit:Stacktrace -> + handle_event(Mod, request_exit, [Req, Exit, Stacktrace], Args), + {response, 500, [], <<"Internal server error">>} end . %% @@ -813,8 +807,8 @@ handle_event(Mod, Name, EventArgs, ElliArgs) -> try Mod:handle_event(Name, EventArgs, ElliArgs) catch - ?WITH_STACKTRACE(EvClass, EvError, Stacktrace) - ?LOG_ERROR("~p:handle_event/3 crashed ~p:~p~n~p", + EvClass:EvError:Stacktrace -> + ?wsErr("~p:handle_event/3 crashed ~p:~p~n~p", [Mod, EvClass, EvError, Stacktrace]) end. @@ -937,7 +931,7 @@ status(506) -> <<"506 Variant Also Negotiates">>; status(507) -> <<"507 Insufficient Storage">>; status(510) -> <<"510 Not Extended">>; status(511) -> <<"511 Network Authentication Required">>; -status(I) when is_integer(I), I >= 100, I < 1000 -> list_to_binary(io_lib:format("~B Status", [I])); +status(I) when is_integer(I), I >= 100, I < 1000 -> <<(integer_to_binary(I))/binary, "Status">>; status(B) when is_binary(B) -> B. diff --git a/src/wsSrv/elli_util.erl b/src/wsSrv/wsUtil.erl similarity index 97% rename from src/wsSrv/elli_util.erl rename to src/wsSrv/wsUtil.erl index 43a9f07..84e71c1 100644 --- a/src/wsSrv/elli_util.erl +++ b/src/wsSrv/wsUtil.erl @@ -1,4 +1,4 @@ --module(elli_util). +-module(wsUtil). -include("eWSrv.hrl"). -include("wsCom.hrl"). @@ -7,6 +7,7 @@ -export([normalize_range/2 , encode_range/2 , file_size/1 + , gLV/3 ]). -export_type([range/0]). @@ -70,7 +71,7 @@ file_size(Filename) -> _ -> {error, invalid_file} end. -getLValue(Key, List, Default) -> +gLV(Key, List, Default) -> case lists:keyfind(Key, 1, List) of false -> Default;