Improve HTTP handling

This commit is contained in:
Shadowfacts 2020-04-25 22:43:57 -04:00
parent a0e290197f
commit 00c51e4ad9
Signed by: shadowfacts
GPG Key ID: 94A5AB95422746E5
2 changed files with 47 additions and 6 deletions

View File

@ -40,15 +40,10 @@ defmodule Clacks.ActivityPub.Fetcher do
headers = [Accept: "application/activity+json, application/ld+json"] headers = [Accept: "application/activity+json, application/ld+json"]
opts = [hackney: Application.get_env(:clacks, :hackney_opts, [])] opts = [hackney: Application.get_env(:clacks, :hackney_opts, [])]
with {:ok, %HTTPoison.Response{status_code: status_code, body: body}} with {:ok, %HTTPoison.Response{body: body}} <- Clacks.HTTP.get(uri, headers, opts),
when status_code in 200..299 <-
HTTPoison.get(uri, headers, opts),
{:ok, data} <- Jason.decode(body) do {:ok, data} <- Jason.decode(body) do
data data
else else
{:ok, %HTTPoison.Response{}} ->
nil
{:error, reason} -> {:error, reason} ->
Logger.warn("Couldn't fetch AP object at #{uri}: #{inspect(reason)}") Logger.warn("Couldn't fetch AP object at #{uri}: #{inspect(reason)}")
nil nil

46
lib/clacks/http.ex Normal file
View File

@ -0,0 +1,46 @@
defmodule Clacks.HTTP do
require Logger
def get(url, headers \\ [], options \\ []) do
case HTTPoison.get(url, headers, options) do
{:ok, %HTTPoison.Response{status_code: status_code} = response}
when status_code in 200..299 ->
{:ok, response}
{:ok, %HTTPoison.Response{status_code: status_code, headers: resp_headers}}
when status_code in [301, 302] ->
resp_headers
|> Enum.find(fn {name, _value} -> String.downcase(name) == "location" end)
|> case do
{_, new_url} ->
new_url =
case URI.parse(new_url) do
%URI{host: nil, path: path} ->
# relative path
%URI{URI.parse(url) | path: path} |> URI.to_string()
uri ->
uri
end
Logger.debug("Got 301 redirect from #{url} to #{new_url}")
get(new_url, headers, options)
_ ->
{:error, "Missing Location header for redirect"}
end
{:ok, %HTTPoison.Response{status_code: 403}} ->
{:error, "403 Forbidden"}
{:ok, %HTTPoison.Response{status_code: 404}} ->
{:error, "404 Not Found"}
{:ok, %HTTPoison.Response{status_code: status_code}} ->
{:error, "HTTP #{status_code}"}
{:error, %HTTPoison.Error{reason: reason}} ->
{:error, reason}
end
end
end