Browse Source

ft: 代码修改

master
SisMaker 3 years ago
parent
commit
a29d505690
10 changed files with 64 additions and 75 deletions
  1. +1
    -2
      include/eWSrv.hrl
  2. +2
    -5
      include/wsCom.hrl
  3. +1
    -3
      rebar.config
  4. +22
    -20
      src/test/elli_tests.erl
  5. +11
    -10
      src/test/wsTc.erl
  6. +5
    -8
      src/wsSrv/elli.erl
  7. +1
    -1
      src/wsSrv/elli_example_callback.erl
  8. +1
    -1
      src/wsSrv/elli_handler.erl
  9. +17
    -23
      src/wsSrv/elli_http.erl
  10. +3
    -2
      src/wsSrv/wsUtil.erl

+ 1
- 2
include/eWSrv.hrl View File

@ -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, []}]).

+ 2
- 5
include/wsCom.hrl View File

@ -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).

+ 1
- 3
rebar.config View File

@ -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, [

+ 22
- 20
src/test/elli_tests.erl View File

@ -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:ChunkSize/binary, R/binary>> -> {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)),

+ 11
- 10
src/test/wsTc.erl View File

@ -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").

+ 5
- 8
src/wsSrv/elli.erl View File

@ -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)}.

+ 1
- 1
src/wsSrv/elli_example_callback.erl View File

@ -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).

+ 1
- 1
src/wsSrv/elli_handler.erl View File

@ -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()}

+ 17
- 23
src/wsSrv/elli_http.erl View File

@ -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.

src/wsSrv/elli_util.erl → src/wsSrv/wsUtil.erl View File

@ -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;

Loading…
Cancel
Save