Skip to content

Commit 0e5a26d

Browse files
committed
Fix struct update type warning in Mint.WebSocket.Extension
The struct update syntax is deprecated in favor of pattern matching on the struct earlier in scope and then using map update syntax. This change rewrites the helper `Mint.WebSocket.Extension.accept_extensions/3` to follow this pattern. Also I've unrolled the `with` into cases to avoid weird return values if `client_extensions` is updated to something that isn't `[Extension.t()]` (probably by erroneously using `Mint.HTTP.put_private/3` on the conn).
1 parent 8a0d8f7 commit 0e5a26d

File tree

1 file changed

+28
-16
lines changed

1 file changed

+28
-16
lines changed

lib/mint/web_socket/extension.ex

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -203,34 +203,45 @@ defmodule Mint.WebSocket.Extension do
203203
end
204204

205205
@doc false
206+
@spec accept_extensions([t()], Mint.Types.headers()) ::
207+
{:ok, [t()]} | {:error, Mint.WebSocket.error()}
206208
def accept_extensions(client_extensions, response_headers) do
207209
server_extensions = parse_accepted_extensions(response_headers)
208210
client_extension_mapping = Enum.into(client_extensions, %{}, &{&1.name, &1})
209211

210212
accept_extensions(server_extensions, [], client_extension_mapping)
211213
end
212214

215+
@spec accept_extensions([t()], [t()], %{String.t() => t()}) ::
216+
{:ok, [t()]} | {:error, Mint.WebSocket.error()}
213217
defp accept_extensions(server_extension, acc, client_extension_mapping)
214218

215219
defp accept_extensions([], acc, _), do: {:ok, :lists.reverse(acc)}
216220

217-
defp accept_extensions([server_extension | server_extensions], acc, client_extension_mapping) do
218-
with {:ok, client_extension} <-
219-
Map.fetch(client_extension_mapping, server_extension.name),
220-
extension = %__MODULE__{client_extension | params: server_extension.params},
221-
all_extensions = acc ++ [extension | server_extensions],
222-
{:ok, extension} <- client_extension.module.init(extension, all_extensions) do
223-
accept_extensions(
224-
server_extensions,
225-
acc ++ [extension],
226-
client_extension_mapping
227-
)
228-
else
229-
:error ->
230-
{:error, %WebSocketError{reason: {:extension_not_negotiated, server_extension}}}
221+
defp accept_extensions(
222+
[%__MODULE__{name: name, params: params} = server_extension | server_extensions],
223+
acc,
224+
client_extension_mapping
225+
) do
226+
case client_extension_mapping do
227+
%{^name => %__MODULE__{} = client_extension} ->
228+
extension = %{client_extension | params: params}
229+
all_extensions = acc ++ [extension | server_extensions]
230+
231+
case client_extension.module.init(extension, all_extensions) do
232+
{:ok, extension} ->
233+
accept_extensions(
234+
server_extensions,
235+
acc ++ [extension],
236+
client_extension_mapping
237+
)
238+
239+
error ->
240+
error
241+
end
231242

232-
init_error ->
233-
init_error
243+
_not_found ->
244+
{:error, %WebSocketError{reason: {:extension_not_negotiated, server_extension}}}
234245
end
235246
end
236247

@@ -251,6 +262,7 @@ defmodule Mint.WebSocket.Extension do
251262
# is exactly equivalent to
252263
#
253264
# Sec-WebSocket-Extensions: foo, bar; baz=2
265+
@spec parse_accepted_extensions(Mint.Types.headers()) :: [t()]
254266
defp parse_accepted_extensions(response_headers) do
255267
response_headers
256268
|> Enum.flat_map(fn

0 commit comments

Comments
 (0)