diff --git a/lib/nostrum/api/helpers.ex b/lib/nostrum/api/helpers.ex index db8b95a68..2e50e50ba 100644 --- a/lib/nostrum/api/helpers.ex +++ b/lib/nostrum/api/helpers.ex @@ -6,7 +6,17 @@ defmodule Nostrum.Api.Helpers do defguard has_files(args) when is_map_key(args, :files) or is_map_key(args, :file) def handle_request_with_decode(response) - def handle_request_with_decode({:ok, body}), do: {:ok, Jason.decode!(body, keys: :atoms)} + + def handle_request_with_decode({:ok, body}) do + case Jason.decode(body, keys: :atoms) do + {:ok, parsed} -> + {:ok, parsed} + + {:error, _} -> + {:error, %Nostrum.Error.ApiError{status_code: nil, response: body}} + end + end + def handle_request_with_decode({:error, _} = error), do: error def handle_request_with_decode(response, type) @@ -15,12 +25,13 @@ defmodule Nostrum.Api.Helpers do def handle_request_with_decode({:error, _} = error, _type), do: error def handle_request_with_decode({:ok, body}, type) do - convert = - body - |> Jason.decode!(keys: :atoms) - |> Util.cast(type) + case Jason.decode(body, keys: :atoms) do + {:ok, parsed} -> + {:ok, Util.cast(parsed, type)} - {:ok, convert} + {:error, _} -> + {:error, %Nostrum.Error.ApiError{status_code: nil, response: body}} + end end @spec maybe_add_reason(String.t() | nil, list()) :: list() diff --git a/lib/nostrum/util.ex b/lib/nostrum/util.ex index 56ac7ce24..35e927b1e 100644 --- a/lib/nostrum/util.ex +++ b/lib/nostrum/util.ex @@ -91,13 +91,17 @@ defmodule Nostrum.Util do raise(Nostrum.Error.ApiError, status_code: code, message: message) {:ok, body} -> - body = Jason.decode!(body) + case Jason.decode(body) do + {:ok, decoded} -> + "wss://" <> url = decoded["url"] + shards = if decoded["shards"], do: decoded["shards"], else: 1 - "wss://" <> url = body["url"] - shards = if body["shards"], do: body["shards"], else: 1 + :persistent_term.put(@gateway_url_key, {url, shards}) + {url, shards} - :persistent_term.put(@gateway_url_key, {url, shards}) - {url, shards} + {:error, _} -> + raise("Received non-JSON response from Discord gateway, Discord may be down") + end end end