mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-14 12:20:24 +00:00
Add shutdown_reason Websocket command
This allows changing the normal exit reason of Websocket processes, providing a way to signal other processes of why the exit occurred.
This commit is contained in:
parent
cc54c207e3
commit
d52e84bdd9
5 changed files with 87 additions and 6 deletions
38
test/handlers/ws_shutdown_reason_commands_h.erl
Normal file
38
test/handlers/ws_shutdown_reason_commands_h.erl
Normal file
|
@ -0,0 +1,38 @@
|
|||
%% This module sends the process pid to the test pid
|
||||
%% found in the x-test-pid header, then changes the
|
||||
%% shutdown reason and closes the connection normally.
|
||||
|
||||
-module(ws_shutdown_reason_commands_h).
|
||||
-behavior(cowboy_websocket).
|
||||
|
||||
-export([init/2]).
|
||||
-export([websocket_init/1]).
|
||||
-export([websocket_handle/2]).
|
||||
-export([websocket_info/2]).
|
||||
|
||||
init(Req, RunOrHibernate) ->
|
||||
TestPid = list_to_pid(binary_to_list(cowboy_req:header(<<"x-test-pid">>, Req))),
|
||||
{cowboy_websocket, Req, {TestPid, RunOrHibernate}}.
|
||||
|
||||
websocket_init(State={TestPid, RunOrHibernate}) ->
|
||||
TestPid ! {ws_pid, self()},
|
||||
ShutdownReason = receive
|
||||
{TestPid, SR} ->
|
||||
SR
|
||||
after 1000 ->
|
||||
error(timeout)
|
||||
end,
|
||||
Commands = [
|
||||
{shutdown_reason, ShutdownReason},
|
||||
close
|
||||
],
|
||||
case RunOrHibernate of
|
||||
run -> {Commands, State};
|
||||
hibernate -> {Commands, State, hibernate}
|
||||
end.
|
||||
|
||||
websocket_handle(_, State) ->
|
||||
{[], State}.
|
||||
|
||||
websocket_info(_, State) ->
|
||||
{[], State}.
|
|
@ -52,7 +52,8 @@ init_dispatch(Name) ->
|
|||
{"/info", ws_info_commands_h, RunOrHibernate},
|
||||
{"/active", ws_active_commands_h, RunOrHibernate},
|
||||
{"/deflate", ws_deflate_commands_h, RunOrHibernate},
|
||||
{"/set_options", ws_set_options_commands_h, RunOrHibernate}
|
||||
{"/set_options", ws_set_options_commands_h, RunOrHibernate},
|
||||
{"/shutdown_reason", ws_shutdown_reason_commands_h, RunOrHibernate}
|
||||
]}]).
|
||||
|
||||
%% Support functions for testing using Gun.
|
||||
|
@ -286,3 +287,21 @@ websocket_set_options_idle_timeout(Config) ->
|
|||
after 2000 ->
|
||||
error(timeout)
|
||||
end.
|
||||
|
||||
websocket_shutdown_reason(Config) ->
|
||||
doc("The command {shutdown_reason, any()} can be used to "
|
||||
"change the shutdown reason of a Websocket connection."),
|
||||
ConnPid = gun_open(Config),
|
||||
StreamRef = gun:ws_upgrade(ConnPid, "/shutdown_reason", [
|
||||
{<<"x-test-pid">>, pid_to_list(self())}
|
||||
]),
|
||||
{upgrade, [<<"websocket">>], _} = gun:await(ConnPid, StreamRef),
|
||||
WsPid = receive {ws_pid, P} -> P after 1000 -> error(timeout) end,
|
||||
MRef = monitor(process, WsPid),
|
||||
WsPid ! {self(), {?MODULE, ?FUNCTION_NAME}},
|
||||
receive
|
||||
{'DOWN', MRef, process, WsPid, {shutdown, {?MODULE, ?FUNCTION_NAME}}} ->
|
||||
ok
|
||||
after 1000 ->
|
||||
error(timeout)
|
||||
end.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue