Hi, I want to download a file from GitHub, but Finch returns 302 status and can’t download.
for example:
%Finch.Response{
status: 302,
body: "",
headers: [
{"server", "GitHub.com"},
{"date", "Mon, 19 Sep 2022 11:41:40 GMT"},
{"content-type", "text/html;charset=utf-8"},
{"content-length", "0"},
{"cache-control", "public, must-revalidate, max-age=0"},
{"expires", "Mon, 19 Sep 2022 11:41:40 GMT"},
{"location",
"https://codeload.github.com/mishka-group/mishka-cms/legacy.tar.gz/refs/tags/0.0.2"},
In location section you can see the real link after redirection, if I use this it works, but I need to know how to force Finch download automatically links maybe are redirected.
Block code:
Finch.build(:get, "https://api.github.com/repos/mishka-group/mishka-cms/tarball/0.0.2")
|> Finch.request(@request_name)
Thank you in advance
1 Like
hst337
September 19, 2022, 12:41pm
2
There’s no built-in feature inside Finch which follow redirects. You can write your own wrapper for this. For example
def do_get(url, name, depth \\ 123)
def do_get(:undefined, _, _), do: {:error, :bad_redirect}
def do_get(url, name, 0), do: {:error, :maximum_depth_exceeded}
def do_get(url, name, depth) do
:get
|> Finch.build(url)
|> Finch.request(name)
|> case do
{:ok, %Finch.Response{status: 302, headers: headers}} ->
"location"
|> :proplists.get_value(headers)
|> do_get(name, depth - 1)
other ->
other
end
end
3 Likes
Thank you, yes I know we can get from location, but I thought there is an option for this problem.
Apologies that I am not answering your question directly but I would strongly recommend you use Tesla
with Finch
below. Tesla has a number of these super useful wrappers, redirect following being one of them.
3 Likes
Thank you for suggestion, sure I will test it
hst337
September 19, 2022, 2:36pm
6
As I’ve said, there’s no such option. I’ve read the sources and it doesn’t support redirects out of the box
1 Like