Browse Source

Fix stopping unknown listeners

Jan Uhlig 2 years ago
parent
commit
6a26bb8d91
2 changed files with 25 additions and 10 deletions
  1. 18 9
      src/ranch.erl
  2. 7 1
      test/acceptor_SUITE.erl

+ 18 - 9
src/ranch.erl

@@ -193,15 +193,24 @@ start_error(_, Error) -> Error.
 
 -spec stop_listener(ref()) -> ok | {error, not_found}.
 stop_listener(Ref) ->
-	[_, Transport, _, _, _] = ranch_server:get_listener_start_args(Ref),
-	TransOpts = get_transport_options(Ref),
-	case supervisor:terminate_child(ranch_sup, {ranch_listener_sup, Ref}) of
-		ok ->
-			_ = supervisor:delete_child(ranch_sup, {ranch_listener_sup, Ref}),
-			ranch_server:cleanup_listener_opts(Ref),
-			Transport:cleanup(TransOpts);
-		{error, Reason} ->
-			{error, Reason}
+	try
+		[_, Transport, _, _, _] = ranch_server:get_listener_start_args(Ref),
+		TransOpts = get_transport_options(Ref),
+		{Transport, TransOpts}
+	of
+		{Transport, TransOpts} ->
+			case supervisor:terminate_child(ranch_sup, {ranch_listener_sup, Ref}) of
+				ok ->
+					_ = supervisor:delete_child(ranch_sup, {ranch_listener_sup, Ref}),
+					ranch_server:cleanup_listener_opts(Ref),
+					Transport:cleanup(TransOpts),
+					ok;
+				{error, Reason} ->
+					{error, Reason}
+			end
+	catch
+		error:badarg ->
+			{error, not_found}
 	end.
 
 -spec suspend_listener(ref()) -> ok | {error, any()}.

+ 7 - 1
test/acceptor_SUITE.erl

@@ -111,7 +111,8 @@ groups() ->
 		misc_set_transport_options,
 		misc_wait_for_connections,
 		misc_multiple_ip_local_socket_opts,
-		misc_connection_alarms
+		misc_connection_alarms,
+		misc_stop_unknown_listener
 	]}, {supervisor, [
 		connection_type_supervisor,
 		connection_type_supervisor_separate_from_connection,
@@ -659,6 +660,11 @@ do_flush_connection_alarms(Name) ->
 		ok
 	end.
 
+misc_stop_unknown_listener(_) ->
+	doc("Ensure that stopping an unknown listener returns an error."),
+	{error, not_found} = ranch:stop_listener(make_ref()),
+	ok.
+
 %% ssl.
 
 ssl_accept_error(_) ->