diff options
| author | Mark Felder <feld@FreeBSD.org> | 2020-10-13 09:54:53 -0500 | 
|---|---|---|
| committer | Mark Felder <feld@FreeBSD.org> | 2020-10-13 09:54:53 -0500 | 
| commit | 64553ebae2f415b309df5f6b1c13b9972bc65aaa (patch) | |
| tree | 7e9b70d0def2b93c9e1f867f834ccc4ee1a9f6fc /lib/phoenix/transports/web_socket | |
| parent | ed6511a086694fc163b488d807f17d246f80ad5b (diff) | |
| parent | 8b6221d4ecd1d7e354e7de831dd46e285cb85077 (diff) | |
| download | pleroma-64553ebae2f415b309df5f6b1c13b9972bc65aaa.tar.gz pleroma-64553ebae2f415b309df5f6b1c13b9972bc65aaa.zip | |
Merge branch 'develop' into chore/elixir-1.11
Diffstat (limited to 'lib/phoenix/transports/web_socket')
| -rw-r--r-- | lib/phoenix/transports/web_socket/raw.ex | 94 | 
1 files changed, 94 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..c3665bebe --- /dev/null +++ b/lib/phoenix/transports/web_socket/raw.ex @@ -0,0 +1,94 @@ +# 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 handler.connect(%{ +               endpoint: endpoint, +               transport: transport, +               options: [serializer: nil], +               params: 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 | 
