commit: e2066994b1e64481e0e74350688d91c71d03e230
parent 8893a044b3af5be607512a6b19747dc447d02262
Author: Mark Felder <feld@feld.me>
Date:   Tue, 19 Dec 2023 10:18:29 -0500
Fix Web Push notification delivery
Finch does not automatically append header content-type: octet-stream for binary payloads.
Diffstat:
3 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/changelog.d/web_push.fix b/changelog.d/web_push.fix
@@ -0,0 +1 @@
+Fix web push notifications not successfully delivering
diff --git a/lib/pleroma/http/web_push.ex b/lib/pleroma/http/web_push.ex
@@ -6,7 +6,11 @@ defmodule Pleroma.HTTP.WebPush do
   @moduledoc false
 
   def post(url, payload, headers, options \\ []) do
-    list_headers = Map.to_list(headers)
+    list_headers =
+      headers
+      |> Map.to_list()
+      |> Kernel.++([{"content-type", "octet-stream"}])
+
     Pleroma.HTTP.post(url, payload, list_headers, options)
   end
 end
diff --git a/test/pleroma/http/web_push_test.exs b/test/pleroma/http/web_push_test.exs
@@ -0,0 +1,45 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.HTTP.WebPushTest do
+  use ExUnit.Case
+
+  import Tesla.Mock
+  alias Pleroma.HTTP
+
+  @push_url "https://some-push-server/"
+
+  setup do
+    mock(fn
+      %{
+        method: :post,
+        url: @push_url,
+        headers: headers
+      } ->
+        if {"content-type", "octet-stream"} in headers do
+          %Tesla.Env{
+            status: 200
+          }
+        else
+          %Tesla.Env{
+            status: 403
+          }
+        end
+    end)
+
+    :ok
+  end
+
+  test "post" do
+    response =
+      HTTP.WebPush.post(
+        @push_url,
+        "encrypted payload",
+        %{"authorization" => "WebPush"},
+        []
+      )
+
+    assert {:ok, %{status: 200}} = response
+  end
+end