From 6627ccc42b9641b7d4c15937edd589830212412c Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Wed, 13 Nov 2024 12:11:39 +0100 Subject: [PATCH] For JSON deocding, implement `process_response` instead of `process_response_body` This allows us to only perform Jason.decode! for HTTP 200 responses --- lib/hcloud.ex | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/hcloud.ex b/lib/hcloud.ex index ed74e70..4b8c745 100644 --- a/lib/hcloud.ex +++ b/lib/hcloud.ex @@ -5,7 +5,6 @@ defmodule ClusterHcloud.Hcloud do use HTTPoison.Base - @api_baseurl "https://api.hetzner.cloud/v1" @impl true @@ -14,8 +13,13 @@ defmodule ClusterHcloud.Hcloud do end @impl true - def process_response_body(body) do - Jason.decode!(body) + def process_response(%HTTPoison.Response{status_code: 200, body: body} = response) do + %{response | body: Jason.decode!(body)} + end + + @impl true + def process_response(%HTTPoison.Response{} = response) do + response end @doc """ @@ -25,25 +29,32 @@ defmodule ClusterHcloud.Hcloud do headers = [ authorization_header(access_token) ] + params = %{ label_selector: label_selector, per_page: 50, page: page } + case get("/servers", headers, params: params) do {:ok, %HTTPoison.Response{body: body, status_code: 200}} -> results = Enum.concat(results, body["servers"]) + case body["meta"]["pagination"]["next_page"] do nil -> {:ok, results} + next_page when is_integer(next_page) -> servers(access_token, label_selector, next_page, results) + _ -> {:error, "Malformed pagination information returned from hetzner."} end + {:ok, %HTTPoison.Response{status_code: status_code}} -> {:error, "Received status code #{status_code}"} + {:error, %HTTPoison.Error{reason: reason}} -> {:error, reason} end @@ -57,19 +68,24 @@ defmodule ClusterHcloud.Hcloud do headers = [ authorization_header(access_token) ] + params = %{ name: network_name } + case get("/networks", headers, params: params) do {:ok, %HTTPoison.Response{body: body, status_code: 200}} -> case body["networks"] do - [first_network | _rest ] -> + [first_network | _rest] -> {:ok, first_network["id"]} + [] -> {:error, "Network \"#{network_name}\" not found."} end + {:ok, %HTTPoison.Response{status_code: status_code}} -> {:error, "Received status code #{status_code}"} + {:error, %HTTPoison.Error{reason: reason}} -> {:error, reason} end