aboutsummaryrefslogtreecommitdiff
path: root/patches/3(fix_searches_p2).patch
blob: dcc6490d10c09f453c6aad356db194916fb6b7c0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
From ed31bad2c481633520cc593912586b403c1ac6d4 Mon Sep 17 00:00:00 2001
From: Mint <>
Date: Wed, 31 May 2023 19:50:20 +0300
Subject: [PATCH] In-house redirect handler for mediaproxy with Hackney adapter

---
 lib/pleroma/reverse_proxy/client/hackney.ex | 32 ++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/lib/pleroma/reverse_proxy/client/hackney.ex b/lib/pleroma/reverse_proxy/client/hackney.ex
index d3e9869121..ca4a0c29f0 100644
--- a/lib/pleroma/reverse_proxy/client/hackney.ex
+++ b/lib/pleroma/reverse_proxy/client/hackney.ex
@@ -5,9 +5,39 @@
 defmodule Pleroma.ReverseProxy.Client.Hackney do
   @behaviour Pleroma.ReverseProxy.Client
 
+  # redirect handler from Pleb, slightly modified to work with Hackney
+  # https://declin.eu/objects/d4f38e62-5429-4614-86d1-e8fc16e6bf33
+  # seven years without upstream fix!
+  # https://github.com/benoitc/hackney/issues/273
+  @redirect_statuses [301, 302, 303, 307, 308]
+  defp get_location(headers) do
+    location =
+      Enum.find(headers, fn {header, _location} ->
+        String.downcase(header) == "location"
+      end)
+
+    elem(location, 1)
+  end
+
   @impl true
   def request(method, url, headers, body, opts \\ []) do
-    :hackney.request(method, url, headers, body, opts)
+    if opts[:follow_redirect] != false do
+      {_state, req_opts} = Access.get_and_update(opts, :follow_redirect, fn a -> {a, false} end)
+      res = :hackney.request(method, url, headers, body, req_opts)
+
+      case res do
+        {:ok, code, reply_headers, _client} when code in @redirect_statuses ->
+          :hackney.request(method, get_location(reply_headers), headers, body, req_opts)
+
+        {:ok, code, reply_headers} when code in @redirect_statuses ->
+          :hackney.request(method, get_location(reply_headers), headers, body, req_opts)
+
+        _ ->
+          res
+      end
+    else
+      :hackney.request(method, url, headers, body, opts)
+    end
   end
 
   @impl true
-- 
GitLab