Procházet zdrojové kódy

ft: 代码修改

master
SisMaker před 3 roky
rodič
revize
64c125539c
17 změnil soubory, kde provedl 128 přidání a 128 odebrání
  1. +1
    -1
      README.md
  2. +57
    -15
      include/eWSrv.hrl
  3. +1
    -3
      src/eWSrv_sup.erl
  4. +1
    -1
      src/test/elli_metrics_middleware.erl
  5. +5
    -5
      src/wsSrv/elli.erl
  6. +5
    -5
      src/wsSrv/elli_example_callback.erl
  7. +3
    -3
      src/wsSrv/elli_example_callback_handover.erl
  8. +1
    -1
      src/wsSrv/elli_example_middleware.erl
  9. +0
    -57
      src/wsSrv/elli_handler.erl
  10. +6
    -6
      src/wsSrv/elli_http.erl
  11. +16
    -16
      src/wsSrv/elli_middleware.erl
  12. +1
    -1
      src/wsSrv/elli_middleware_compress.erl
  13. +1
    -1
      src/wsSrv/elli_tcp.erl
  14. +1
    -1
      src/wsSrv/elli_test.erl
  15. +17
    -0
      src/wsSrv/wsHer.erl
  16. +10
    -11
      src/wsSrv/wsSendFile.erl
  17. +2
    -1
      src/wsSrv/wsUtil.erl

+ 1
- 1
README.md Zobrazit soubor

@ -35,7 +35,7 @@ A minimal callback module could look like this:
-export([handle/2, handle_event/3]).
-include_lib("elli/include/eWSrv.hrl").
-behaviour(elli_handler).
-behaviour(wsHer).
handle(Req, _Args) ->
%% Delegate to our handler function

+ 57
- 15
include/eWSrv.hrl Zobrazit soubor

@ -1,17 +1,59 @@
-record(req, {method :: elli:http_method(),
scheme :: undefined | binary(),
host :: undefined | binary(),
port :: undefined | 1..65535,
path :: [binary()],
args :: [{binary(), any()}],
raw_path :: binary(),
version :: elli_http:version(),
headers :: elli:headers(),
original_headers :: elli:headers(),
body :: elli:body(),
pid :: pid(),
socket :: undefined | elli_tcp:socket(),
callback :: elli_handler:callback()
}).
-record(req, {
method :: elli:http_method(),
scheme :: undefined | binary(),
host :: undefined | binary(),
port :: undefined | 1..65535,
path :: [binary()],
args :: [{binary(), any()}],
raw_path :: binary(),
version :: elli_http:version(),
headers :: elli:headers(),
original_headers :: elli:headers(),
body :: elli:body(),
pid :: pid(),
socket :: undefined | elli_tcp:socket(),
callback :: wsHer:callback()
}).
-define(EXAMPLE_CONF, [{callback, elli_example_callback}, {callback_args, []}]).
-export_type([callback/0, callback_mod/0, callback_args/0, event/0, result/0]).
%% @type callback(). A tuple of a {@type callback_mod()} and {@type
%% callback_args()}.
-type callback() :: {callback_mod(), callback_args()}.
%% @type callback_mod(). A callback module.
-type callback_mod() :: module().
%% @type callback_args(). Arguments to pass to a {@type callback_mod()}.
-type callback_args() :: list().
%% @type event(). Fired throughout processing a request.
%% See {@link elli_example_callback:handle_event/3} for descriptions.
-type event() ::
elli_startup|
bad_request |
file_error|
chunk_complete |
request_complete|
request_throw |
request_error |
request_exit|
request_closed |
request_parse_error|
client_closed |
client_timeout|
invalid_return.
-type result() ::
{elli:response_code() |ok, elli:headers(), {file, file:name_all()}|
{file, file:name_all(), wsUtil:range()}}|
{elli:response_code() | ok, elli:headers(), elli:body()}|
{elli:response_code() | ok, elli:body()}|
{chunk, elli:headers()}|
{chunk, elli:headers(), elli:body()}|
ignore.
-type sendfile_opts() :: [{chunk_size, non_neg_integer()}].

+ 1
- 3
src/eWSrv_sup.erl Zobrazit soubor

@ -12,9 +12,7 @@ start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
init([]) ->
SupFlags = #{strategy => one_for_all,
intensity => 0,
period => 1},
SupFlags = #{strategy => one_for_all, intensity => 100, period => 3600},
ChildSpecs = [],
{ok, {SupFlags, ChildSpecs}}.

+ 1
- 1
src/test/elli_metrics_middleware.erl Zobrazit soubor

@ -1,6 +1,6 @@
-module(elli_metrics_middleware).
-export([init/2, preprocess/2, handle/2, postprocess/3, handle_event/3]).
-behaviour(elli_handler).
-behaviour(wsHer).
%%

+ 5
- 5
src/wsSrv/elli.erl Zobrazit soubor

@ -44,7 +44,7 @@
acceptors :: ets:tid(),
open_reqs = 0 :: non_neg_integer(),
options = [] :: [{_, _}], % TODO: refine
callback :: elli_handler:callback()
callback :: wsHer:callback()
}).
%% @type state(). Internal state.
-opaque state() :: #state{}.
@ -95,8 +95,8 @@ get_open_reqs(S, Timeout) ->
-spec set_callback(S, Callback, CallbackArgs) -> Reply when
S :: atom(),
Callback :: elli_handler:callback_mod(),
CallbackArgs :: elli_handler:callback_args(),
Callback :: wsHer:callback_mod(),
CallbackArgs :: wsHer:callback_args(),
Reply :: {reply, ok, state()}.
set_callback(S, Callback, CallbackArgs) ->
valid_callback(Callback) orelse throw(invalid_callback),
@ -180,8 +180,8 @@ init([Opts]) ->
(stop, {pid(), _Tag}, state()) -> {stop, normal, ok, state()};
({set_callback, Mod, Args}, {pid(), _Tag}, state()) ->
{reply, ok, state()} when
Mod :: elli_handler:callback_mod(),
Args :: elli_handler:callback_args().
Mod :: wsHer:callback_mod(),
Args :: wsHer:callback_args().
handle_call(get_acceptors, _From, State) ->
Acceptors = [Pid || {Pid} <- ets:tab2list(State#state.acceptors)],
{reply, {ok, Acceptors}, State};

+ 5
- 5
src/wsSrv/elli_example_callback.erl Zobrazit soubor

@ -12,7 +12,7 @@
-include("eWSrv.hrl").
-include("wsCom.hrl").
-behaviour(elli_handler).
-behaviour(wsHer).
-include_lib("kernel/include/file.hrl").
@ -25,8 +25,8 @@
%% @see handle/3
-spec handle(Req, _Args) -> Result when
Req :: elli:req(),
_Args :: elli_handler:callback_args(),
Result :: elli_handler:result().
_Args :: wsHer:callback_args(),
Result :: wsHer:result().
handle(Req, _Args) -> handle(Req#req.method, elli_request:path(Req), Req).
@ -62,7 +62,7 @@ handle(Req, _Args) -> handle(Req#req.method, elli_request:path(Req), Req).
%% @see elli_request:encode_range/2
%% @see elli_request:chunk_ref/1
%% @see chunk_loop/1
-spec handle(Method, Path, Req) -> elli_handler:result() when
-spec handle(Method, Path, Req) -> wsHer:result() when
Method :: elli:http_method(),
Path :: [binary()],
Req :: elli:req().
@ -296,7 +296,7 @@ chunk_loop(Ref, N) ->
%% response, but for some reason it cannot be opened.
-spec handle_event(Event, Args, Config) -> ok when
Event :: elli:event(),
Args :: elli_handler:callback_args(),
Args :: wsHer:callback_args(),
Config :: [tuple()].
handle_event(elli_startup, [], _) -> ok;
handle_event(request_complete, [_Request,

+ 3
- 3
src/wsSrv/elli_example_callback_handover.erl Zobrazit soubor

@ -2,7 +2,7 @@
-export([init/2, handle/2, handle_event/3]).
-include("wsCom.hrl").
-behaviour(elli_handler).
-behaviour(wsHer).
%% @doc Return `{ok, handover}' if `Req''s path is `/hello/world',
%% otherwise `ignore'.
@ -17,8 +17,8 @@ init(Req, _Args) ->
%% TODO: write docstring
-spec handle(Req, Args) -> Result when
Req :: elli:req(),
Args :: elli_handler:callback_args(),
Result :: elli_handler:result().
Args :: wsHer:callback_args(),
Result :: wsHer:result().
handle(Req, Args) ->
handle(elli_request:method(Req), elli_request:path(Req), Req, Args).

+ 1
- 1
src/wsSrv/elli_example_middleware.erl Zobrazit soubor

@ -1,7 +1,7 @@
%% @hidden
-module(elli_example_middleware).
-export([handle/2, handle_event/3]).
-behaviour(elli_handler).
-behaviour(wsHer).
%%

+ 0
- 57
src/wsSrv/elli_handler.erl Zobrazit soubor

@ -1,57 +0,0 @@
-module(elli_handler).
-optional_callbacks([init/2, preprocess/2, postprocess/3]).
-export_type([callback/0, callback_mod/0, callback_args/0, event/0, result/0]).
%% @type callback(). A tuple of a {@type callback_mod()} and {@type
%% callback_args()}.
-type callback() :: {callback_mod(), callback_args()}.
%% @type callback_mod(). A callback module.
-type callback_mod() :: module().
%% @type callback_args(). Arguments to pass to a {@type callback_mod()}.
-type callback_args() :: list().
%% @type event(). Fired throughout processing a request.
%% See {@link elli_example_callback:handle_event/3} for descriptions.
-type event() :: elli_startup
| bad_request | file_error
| chunk_complete | request_complete
| request_throw | request_error | request_exit
| request_closed | request_parse_error
| client_closed | client_timeout
| invalid_return.
-type result() :: {elli:response_code() | ok,
elli:headers(),
{file, file:name_all()}
| {file, file:name_all(), wsUtil:range()}}
| {elli:response_code() | ok, elli:headers(), elli:body()}
| {elli:response_code() | ok, elli:body()}
| {chunk, elli:headers()}
| {chunk, elli:headers(), elli:body()}
| ignore.
-callback handle(Req :: elli:req(), callback_args()) -> result().
-callback handle_event(Event, Args, Config) -> ok when
Event :: event(),
Args :: callback_args(),
Config :: [tuple()].
-callback init(Req, Args) -> {ok, standard | handover} when
Req :: elli:req(),
Args :: callback_args().
-callback preprocess(Req1, Args) -> Req2 when
Req1 :: elli:req(),
Args :: callback_args(),
Req2 :: elli:req().
-callback postprocess(Req, Res1, Args) -> Res2 when
Req :: elli:req(),
Res1 :: result(),
Args :: callback_args(),
Res2 :: result().

+ 6
- 6
src/wsSrv/elli_http.erl Zobrazit soubor

@ -43,7 +43,7 @@
Server :: pid(),
ListenSocket :: elli_tcp:socket(),
Options :: proplists:proplist(),
Callback :: elli_handler:callback().
Callback :: wsHer:callback().
start_link(Server, ListenSocket, Options, Callback) ->
proc_lib:spawn_link(?MODULE, accept,
[Server, ListenSocket, Options, Callback]).
@ -56,7 +56,7 @@ start_link(Server, ListenSocket, Options, Callback) ->
Server :: pid(),
ListenSocket :: elli_tcp:socket(),
Options :: proplists:proplist(),
Callback :: elli_handler:callback().
Callback :: wsHer:callback().
accept(Server, ListenSocket, Options, Callback) ->
case catch elli_tcp:accept(ListenSocket, Server, accept_timeout(Options)) of
{ok, Socket} ->
@ -96,7 +96,7 @@ keepalive_loop(Socket, NumRequests, Buffer, Options, Callback) ->
Socket :: elli_tcp:socket(),
PrevBin :: binary(),
Options :: proplists:proplist(),
Callback :: elli_handler:callback(),
Callback :: wsHer:callback(),
ConnToken :: {'keep_alive' | 'close', binary()}.
handle_request(S, PrevB, Opts, {Mod, Args} = Callback) ->
{Method, RawPath, V, B0} = get_request(S, PrevB, Opts, Callback),
@ -453,7 +453,7 @@ recv_request(Socket, Buffer, Options, {Mod, Args} = _Callback) ->
V :: version(),
Buffer :: binary(),
Opts :: proplists:proplist(),
Callback :: elli_handler:callback(),
Callback :: wsHer:callback(),
Headers :: {{elli:headers(), elli:headers()}, any()}. % TODO: refine
get_headers(_Socket, {0, 9}, _, _, _) ->
{{[], []}, <<>>};
@ -510,7 +510,7 @@ get_headers(Socket, Buffer, {Headers, ParsedHeaders}, Count, Opts, {Mod, Args} =
Headers :: elli:headers(),
Buffer :: binary(),
Opts :: proplists:proplist(),
Callback :: elli_handler:callback(),
Callback :: wsHer:callback(),
FullBody :: {elli:body(), binary()}.
get_body(Socket, Headers, Buffer, Opts, Callback) ->
case get_header(?CONTENT_LENGTH_HEADER, Headers, undefined) of
@ -599,7 +599,7 @@ do_check_max_size_x2(_, _, _, _) -> ok.
Body :: elli:body(),
V :: version(),
Socket :: elli_tcp:socket() | undefined,
Callback :: elli_handler:callback(),
Callback :: wsHer:callback(),
Req :: elli:req().
mk_req(Method, PathTuple, Headers, ParsedHeaders, Body, V, Socket, {Mod, Args} = Callback) ->
case parse_path(PathTuple) of

+ 16
- 16
src/wsSrv/elli_middleware.erl Zobrazit soubor

@ -37,7 +37,7 @@
%%% `elli_middleware' does not add any significant overhead.
-module(elli_middleware).
-behaviour(elli_handler).
-behaviour(wsHer).
-export([init/2, handle/2, handle_event/3]).
%% Macros.
@ -51,13 +51,13 @@
%% @hidden
-spec init(Req, Args) -> {ok, standard | handover} when
Req :: elli:req(),
Args :: elli_handler:callback_args().
Args :: wsHer:callback_args().
init(Req, Args) ->
do_init(Req, callbacks(Args)).
%% @hidden
-spec handle(Req :: elli:req(), Config :: [tuple()]) -> elli_handler:result().
-spec handle(Req :: elli:req(), Config :: [tuple()]) -> wsHer:result().
handle(CleanReq, Config) ->
Callbacks = callbacks(Config),
PreReq = preprocess(CleanReq, Callbacks),
@ -67,8 +67,8 @@ handle(CleanReq, Config) ->
%% @hidden
-spec handle_event(Event, Args, Config) -> ok when
Event :: elli_handler:event(),
Args :: elli_handler:callback_args(),
Event :: wsHer:event(),
Args :: wsHer:callback_args(),
Config :: [tuple()].
handle_event(elli_startup, Args, Config) ->
Callbacks = callbacks(Config),
@ -84,7 +84,7 @@ handle_event(Event, Args, Config) ->
-spec do_init(Req, Callbacks) -> {ok, standard | handover} when
Req :: elli:req(),
Callbacks :: elli_handler:callbacks().
Callbacks :: wsHer:callbacks().
do_init(_, []) ->
{ok, standard};
do_init(Req, [{Mod, Args} | Mods]) ->
@ -97,8 +97,8 @@ do_init(Req, [{Mod, Args} | Mods]) ->
-spec process(Req, Callbacks) -> Result when
Req :: elli:req(),
Callbacks :: [Callback :: elli_handler:callback()],
Result :: elli_handler:result().
Callbacks :: [Callback :: wsHer:callback()],
Result :: wsHer:result().
process(_Req, []) ->
{404, [], <<"Not Found">>};
process(Req, [{Mod, Args} | Mods]) ->
@ -110,7 +110,7 @@ process(Req, [{Mod, Args} | Mods]) ->
-spec preprocess(Req1, Callbacks) -> Req2 when
Req1 :: elli:req(),
Callbacks :: [elli_handler:callback()],
Callbacks :: [wsHer:callback()],
Req2 :: elli:req().
preprocess(Req, []) ->
Req;
@ -120,9 +120,9 @@ preprocess(Req, [{Mod, Args} | Mods]) ->
-spec postprocess(Req, Res1, Callbacks) -> Res2 when
Req :: elli:req(),
Res1 :: elli_handler:result(),
Callbacks :: [elli_handler:callback()],
Res2 :: elli_handler:result().
Res1 :: wsHer:result(),
Callbacks :: [wsHer:callback()],
Res2 :: wsHer:result().
postprocess(_Req, Res, []) ->
Res;
postprocess(Req, Res, [{Mod, Args} | Mods]) ->
@ -131,9 +131,9 @@ postprocess(Req, Res, [{Mod, Args} | Mods]) ->
-spec forward_event(Event, Args, Callbacks) -> ok when
Event :: elli_handler:event(),
Args :: elli_handler:callback_args(),
Callbacks :: [elli_handler:callback()].
Event :: wsHer:event(),
Args :: wsHer:callback_args(),
Callbacks :: [wsHer:callback()].
forward_event(Event, Args, Callbacks) ->
[?IF_NOT_EXPORTED(M, handle_event, 3, ok,
M:handle_event(Event, Args, XArgs))
@ -146,6 +146,6 @@ forward_event(Event, Args, Callbacks) ->
%%
-spec callbacks(Config :: [{mod, Callbacks} | tuple()]) -> Callbacks when
Callbacks :: [elli_handler:callback()].
Callbacks :: [wsHer:callback()].
callbacks(Config) ->
proplists:get_value(mods, Config, []).

+ 1
- 1
src/wsSrv/elli_middleware_compress.erl Zobrazit soubor

@ -11,7 +11,7 @@
%%% `compress_byte_size' (`1024' by default).
-spec postprocess(Req, Result, Config) -> Result when
Req :: elli:req(),
Result :: elli_handler:result(),
Result :: wsHer:result(),
Config :: [{compress_byte_size, non_neg_integer()} | tuple()].
postprocess(Req, {ResponseCode, Body}, Config)
when is_integer(ResponseCode) orelse ResponseCode =:= ok ->

+ 1
- 1
src/wsSrv/elli_tcp.erl Zobrazit soubor

@ -89,7 +89,7 @@ setopts({ssl, Socket}, Opts) ->
sendfile(Fd, {plain, Socket}, Offset, Length, Opts) ->
file:sendfile(Fd, Socket, Offset, Length, Opts);
sendfile(Fd, {ssl, Socket}, Offset, Length, Opts) ->
elli_sendfile:sendfile(Fd, Socket, Offset, Length, Opts).
wsSendFile:sendfile(Fd, Socket, Offset, Length, Opts).
peername({plain, Socket}) ->
inet:peername(Socket);

+ 1
- 1
src/wsSrv/elli_test.erl Zobrazit soubor

@ -12,7 +12,7 @@
-export([call/5]).
-spec call(Method, Path, Headers, Body, Opts) -> elli_handler:result() when
-spec call(Method, Path, Headers, Body, Opts) -> wsHer:result() when
Method :: elli:http_method(),
Path :: binary(),
Headers :: elli:headers(),

+ 17
- 0
src/wsSrv/wsHer.erl Zobrazit soubor

@ -0,0 +1,17 @@
-module(wsHer).
-callback init(Req :: elli:req(), Args :: callback_args()) -> {ok, standard | handover}.
-callback handle(Req :: elli:req(), callback_args()) -> result().
-callback handle_event(Event :: event(), Args :: callback_args(), Config :: [tuple()]) -> ok.
-callback preprocess(Req1 :: elli:req(), Args :: callback_args()) -> Req2 :: elli:req().
-callback postprocess(Req :: elli:req(), Res1 :: result(), Args :: callback_args()) -> Res2 :: result().
-optional_callbacks([
init/2
, preprocess/2
, postprocess/3
]).

src/wsSrv/elli_sendfile.erl → src/wsSrv/wsSendFile.erl Zobrazit soubor

@ -1,11 +1,12 @@
%% Taken from https://github.com/ninenines/ranch/pull/41/files,
%% with permission from fishcakez
-module(wsSendFile).
-module(elli_sendfile).
-include("eWSrv.hrl").
-export([
sendfile/5
]).
-export([sendfile/5]).
-type sendfile_opts() :: [{chunk_size, non_neg_integer()}].
%% @doc Send part of a file on a socket.
%%
@ -13,11 +14,9 @@
%% Originally from https://github.com/ninenines/ranch/pull/41/files
%%
%% @end
-spec sendfile(file:fd(), inet:socket() | ssl:sslsocket(),
non_neg_integer(), non_neg_integer(), sendfile_opts())
-> {ok, non_neg_integer()} | {error, atom()}.
-spec sendfile(file:fd(), inet:socket() | ssl:sslsocket(), non_neg_integer(), non_neg_integer(), sendfile_opts()) -> {ok, non_neg_integer()} | {error, atom()}.
sendfile(RawFile, Socket, Offset, Bytes, Opts) ->
ChunkSize = chunk_size(Opts),
ChunkSize = chunkSize(Opts),
Initial2 = case file:position(RawFile, {cur, 0}) of
{ok, Offset} ->
Offset;
@ -33,8 +32,8 @@ sendfile(RawFile, Socket, Offset, Bytes, Opts) ->
Error
end.
-spec chunk_size(sendfile_opts()) -> pos_integer().
chunk_size(Opts) ->
-spec chunkSize(sendfile_opts()) -> pos_integer().
chunkSize(Opts) ->
case lists:keyfind(chunk_size, 1, Opts) of
{chunk_size, ChunkSize}
when is_integer(ChunkSize) andalso ChunkSize > 0 ->

+ 2
- 1
src/wsSrv/wsUtil.erl Zobrazit soubor

@ -4,7 +4,8 @@
-include_lib("kernel/include/file.hrl").
-export([normalize_range/2
-export([
normalize_range/2
, encode_range/2
, file_size/1
, gLV/3

Načítá se…
Zrušit
Uložit