Improve HTTP handling
This commit is contained in:
parent
a0e290197f
commit
00c51e4ad9
|
@ -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
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue