diff --git a/lib/phoenix/transports/websocket.ex b/lib/phoenix/transports/websocket.ex index f04cc4350d..16eadc1384 100644 --- a/lib/phoenix/transports/websocket.ex +++ b/lib/phoenix/transports/websocket.ex @@ -47,6 +47,11 @@ defmodule Phoenix.Transports.WebSocket do keys = Keyword.get(opts, :connect_info, []) connect_info = Transport.connect_info(conn, endpoint, keys) + opts = case Keyword.fetch!(opts, :timeout) do + {m, f, a} -> Keyword.put(opts, :timeout, apply(m, f, a)) + _ -> opts + end + config = %{ endpoint: endpoint, transport: :websocket, diff --git a/test/phoenix/integration/websocket_socket_test.exs b/test/phoenix/integration/websocket_socket_test.exs index aa249f4138..0660692792 100644 --- a/test/phoenix/integration/websocket_socket_test.exs +++ b/test/phoenix/integration/websocket_socket_test.exs @@ -91,12 +91,18 @@ defmodule Phoenix.Integration.WebSocketTest do websocket: [path: "nested/path", check_origin: ["//example.com"], timeout: 200], custom: :value + socket "/custom/timeout", UserSocket, + websocket: [path: "/", timeout: {Endpoint, :websocket_timeout, []}], + custom: :value + socket "/custom/:socket_var", UserSocket, websocket: [path: ":path_var/path", check_origin: ["//example.com"], timeout: 200], custom: :value socket "/ws/ping", PingSocket, websocket: true + + def websocket_timeout, do: 50 end setup_all do @@ -161,6 +167,16 @@ defmodule Phoenix.Integration.WebSocketTest do assert {:ok, _} = WebsocketClient.connect(self(), "#{path}?key=value", :noop) end + test "websocket timeout can be provided via MFA" do + path = "ws://127.0.0.1:#{@port}/custom/timeout/" + {:ok, client} = WebsocketClient.connect(self(), path, :noop) + WebsocketClient.send(client, {:text, "ping"}) + assert_receive {:text, "pong"} + + Process.sleep(100) + refute Process.alive?(client) + end + test "allows a path with variables" do path = "ws://127.0.0.1:#{@port}/custom/123/456/path" assert {:ok, client} = WebsocketClient.connect(self(), "#{path}?key=value", :noop)