|
|
@ -45,8 +45,7 @@ |
|
|
|
Options :: proplists:proplist(), |
|
|
|
Callback :: wsHer:callback(). |
|
|
|
start_link(Server, ListenSocket, Options, Callback) -> |
|
|
|
proc_lib:spawn_link(?MODULE, accept, |
|
|
|
[Server, ListenSocket, Options, Callback]). |
|
|
|
proc_lib:spawn_link(?MODULE, accept, [Server, ListenSocket, Options, Callback]). |
|
|
|
|
|
|
|
%% @doc Accept on the socket until a client connects. |
|
|
|
%% Handle the request, then loop if we're using keep alive or chunked transfer. |
|
|
@ -80,10 +79,9 @@ keepalive_loop(Socket, Options, Callback) -> |
|
|
|
keepalive_loop(Socket, 0, <<>>, Options, Callback). |
|
|
|
|
|
|
|
keepalive_loop(Socket, NumRequests, Buffer, Options, Callback) -> |
|
|
|
case ?n>MODULE:handle_request(Socket, Buffer, Options, Callback) of |
|
|
|
case handle_request(Socket, Buffer, Options, Callback) of |
|
|
|
{keep_alive, NewBuffer} -> |
|
|
|
?MODULE:keepalive_loop(Socket, NumRequests + 1, |
|
|
|
NewBuffer, Options, Callback); |
|
|
|
keepalive_loop(Socket, NumRequests + 1, NewBuffer, Options, Callback); |
|
|
|
{close, _} -> |
|
|
|
wsNet:close(Socket), |
|
|
|
ok |
|
|
@ -125,9 +123,7 @@ handle_request(S, PrevB, Opts, {Mod, Args} = Callback) -> |
|
|
|
t(user_end), |
|
|
|
|
|
|
|
t(request_end), |
|
|
|
handle_event(Mod, request_complete, |
|
|
|
[Req1, handover, [], <<>>, {get_timings(), |
|
|
|
get_sizes()}], Args), |
|
|
|
handle_event(Mod, request_complete, [Req1, handover, [], <<>>, {get_timings(), get_sizes()}], Args), |
|
|
|
Response |
|
|
|
end. |
|
|
|
|
|
|
@ -332,7 +328,7 @@ execute_callback(#req{callback = {Mod, Args}} = Req) -> |
|
|
|
exit:Exit:Stacktrace -> |
|
|
|
handle_event(Mod, request_exit, [Req, Exit, Stacktrace], Args), |
|
|
|
{response, 500, [], <<"Internal server error">>} |
|
|
|
end . |
|
|
|
end. |
|
|
|
|
|
|
|
%% |
|
|
|
%% CHUNKED-TRANSFER |
|
|
@ -460,8 +456,7 @@ get_headers(_Socket, {0, 9}, _, _, _) -> |
|
|
|
get_headers(Socket, {1, _}, Buffer, Opts, Callback) -> |
|
|
|
get_headers(Socket, Buffer, {[], []}, 0, Opts, Callback). |
|
|
|
|
|
|
|
get_headers(Socket, _, {Headers, _}, HeadersCount, _Opts, {Mod, Args}) |
|
|
|
when HeadersCount >= 100 -> |
|
|
|
get_headers(Socket, _, {Headers, _}, HeadersCount, _Opts, {Mod, Args}) when HeadersCount >= 100 -> |
|
|
|
handle_event(Mod, bad_request, [{too_many_headers, Headers}], Args), |
|
|
|
send_bad_request(Socket), |
|
|
|
wsNet:close(Socket), |
|
|
@ -808,9 +803,9 @@ handle_event(Mod, Name, EventArgs, ElliArgs) -> |
|
|
|
Mod:handle_event(Name, EventArgs, ElliArgs) |
|
|
|
catch |
|
|
|
EvClass:EvError:Stacktrace -> |
|
|
|
?wsErr("~p:handle_event/3 crashed ~p:~p~n~p", |
|
|
|
[Mod, EvClass, EvError, Stacktrace]) |
|
|
|
end. |
|
|
|
?wsErr("~p:handle_event/3 crashed ~p:~p~n~p", |
|
|
|
[Mod, EvClass, EvError, Stacktrace]) |
|
|
|
end. |
|
|
|
|
|
|
|
%% |
|
|
|
%% TIMING HELPERS |
|
|
@ -931,7 +926,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 -> <<(integer_to_binary(I))/binary, "Status">>; |
|
|
|
status(I) when is_integer(I), I >= 100, I < 1000 -> <<(integer_to_binary(I))/binary, "Status">>; |
|
|
|
status(B) when is_binary(B) -> B. |
|
|
|
|
|
|
|
|
|
|
|