diff options
| author | Alex Gleason <alex@alexgleason.me> | 2020-10-13 19:20:00 -0500 | 
|---|---|---|
| committer | Alex Gleason <alex@alexgleason.me> | 2020-10-13 19:20:00 -0500 | 
| commit | c3112fd13a6af239b9dff0813e93266ec58f571e (patch) | |
| tree | 7f2252d7a08e4a59b66e392b2732a1cdd8745758 /lib/phoenix/transports/web_socket | |
| parent | 66e00ace7c0708f2f9361bc6e1008ccea08cb6ef (diff) | |
| parent | 481906207e6d803e5c4d3e455c7b93119e392177 (diff) | |
| download | pleroma-c3112fd13a6af239b9dff0813e93266ec58f571e.tar.gz pleroma-c3112fd13a6af239b9dff0813e93266ec58f571e.zip  | |
Merge remote-tracking branch 'upstream/develop' into registration-workflow
Diffstat (limited to 'lib/phoenix/transports/web_socket')
| -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  | 
