diff options
author | feld <feld@feld.me> | 2020-10-13 14:47:29 +0000 |
---|---|---|
committer | feld <feld@feld.me> | 2020-10-13 14:47:29 +0000 |
commit | 8b6221d4ecd1d7e354e7de831dd46e285cb85077 (patch) | |
tree | 992e96bbdf4b40a5738ca2306ba3acf4158b17d5 /lib/phoenix | |
parent | eea879eb362d3310d4fe047fb6412b69dd8711fe (diff) | |
parent | 4c4ea9a3486f824cfba825a176439d50ec54fe95 (diff) | |
download | pleroma-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.ex | 89 |
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 |