summaryrefslogtreecommitdiff
path: root/lib/phoenix
diff options
context:
space:
mode:
authorfeld <feld@feld.me>2020-10-13 14:47:29 +0000
committerfeld <feld@feld.me>2020-10-13 14:47:29 +0000
commit8b6221d4ecd1d7e354e7de831dd46e285cb85077 (patch)
tree992e96bbdf4b40a5738ca2306ba3acf4158b17d5 /lib/phoenix
parenteea879eb362d3310d4fe047fb6412b69dd8711fe (diff)
parent4c4ea9a3486f824cfba825a176439d50ec54fe95 (diff)
downloadpleroma-8b6221d4ecd1d7e354e7de831dd46e285cb85077.tar.gz
pleroma-8b6221d4ecd1d7e354e7de831dd46e285cb85077.zip
Merge branch 'feature/1822-files-consistency' into 'develop'
Feature/1822 files consistency Closes #1822 See merge request pleroma/pleroma!2680
Diffstat (limited to 'lib/phoenix')
-rw-r--r--lib/phoenix/transports/web_socket/raw.ex89
1 files changed, 89 insertions, 0 deletions
diff --git a/lib/phoenix/transports/web_socket/raw.ex b/lib/phoenix/transports/web_socket/raw.ex
new file mode 100644
index 000000000..aab7fad99
--- /dev/null
+++ b/lib/phoenix/transports/web_socket/raw.ex
@@ -0,0 +1,89 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Phoenix.Transports.WebSocket.Raw do
+ import Plug.Conn,
+ only: [
+ fetch_query_params: 1,
+ send_resp: 3
+ ]
+
+ alias Phoenix.Socket.Transport
+
+ def default_config do
+ [
+ timeout: 60_000,
+ transport_log: false,
+ cowboy: Phoenix.Endpoint.CowboyWebSocket
+ ]
+ end
+
+ def init(%Plug.Conn{method: "GET"} = conn, {endpoint, handler, transport}) do
+ {_, opts} = handler.__transport__(transport)
+
+ conn =
+ conn
+ |> fetch_query_params
+ |> Transport.transport_log(opts[:transport_log])
+ |> Transport.force_ssl(handler, endpoint, opts)
+ |> Transport.check_origin(handler, endpoint, opts)
+
+ case conn do
+ %{halted: false} = conn ->
+ case Transport.connect(endpoint, handler, transport, __MODULE__, nil, conn.params) do
+ {:ok, socket} ->
+ {:ok, conn, {__MODULE__, {socket, opts}}}
+
+ :error ->
+ send_resp(conn, :forbidden, "")
+ {:error, conn}
+ end
+
+ _ ->
+ {:error, conn}
+ end
+ end
+
+ def init(conn, _) do
+ send_resp(conn, :bad_request, "")
+ {:error, conn}
+ end
+
+ def ws_init({socket, config}) do
+ Process.flag(:trap_exit, true)
+ {:ok, %{socket: socket}, config[:timeout]}
+ end
+
+ def ws_handle(op, data, state) do
+ state.socket.handler
+ |> apply(:handle, [op, data, state])
+ |> case do
+ {op, data} ->
+ {:reply, {op, data}, state}
+
+ {op, data, state} ->
+ {:reply, {op, data}, state}
+
+ %{} = state ->
+ {:ok, state}
+
+ _ ->
+ {:ok, state}
+ end
+ end
+
+ def ws_info({_, _} = tuple, state) do
+ {:reply, tuple, state}
+ end
+
+ def ws_info(_tuple, state), do: {:ok, state}
+
+ def ws_close(state) do
+ ws_handle(:closed, :normal, state)
+ end
+
+ def ws_terminate(reason, state) do
+ ws_handle(:closed, reason, state)
+ end
+end