Phoenix.Endpoint поведение
Исходный кодОпределяет конечную точку Phoenix.
Конечная точка — это граница, где начинаются все запросы к вашему веб-приложению. Это также интерфейс, который приложение предоставляет базовым веб-серверам.
В целом конечная точка выполняет три задачи:
предоставляет обёртку для запуска и остановки конечной точки в составе дерева супервизии
определяет начальный конвейер plug, через который проходят запросы
содержит специфичную для веб-приложения конфигурацию
Конечные точки
Конечная точка — это просто модуль, определённый с помощью Phoenix.Endpoint. Если вы использовали генератор mix phx.new, конечная точка была автоматически создана в составе приложения:
defmodule YourAppWeb.Endpoint do use Phoenix.Endpoint, otp_app: :your_app # plug ... # plug ... plug YourApp.Router end
Конечные точки необходимо явно запускать в составе дерева супервизии приложения. В сгенерированных приложениях конечные точки по умолчанию добавляются в дерево супервизии. Добавить конечную точку в дерево супервизии можно следующим образом:
children = [ YourAppWeb.Endpoint ]
Конфигурация конечной точки
Все конечные точки настраиваются в среде приложения. Например:
config :your_app, YourAppWeb.Endpoint, secret_key_base: "kjoy3o1zeidquwy1398juxzldjlksahdk3"
Конфигурация конечной точки делится на две категории. Конфигурация времени компиляции считывается во время компиляции, и её изменение во время выполнения не оказывает никакого эффекта. Она в основном связана с обработкой ошибок.
Конфигурация времени выполнения считывается во время запуска приложения или после него. Её можно получить с помощью функции config/2:
YourAppWeb.Endpoint.config(:port) YourAppWeb.Endpoint.config(:some_config, :default_value)
Конфигурация времени компиляции
Конфигурацию времени компиляции можно задать в config/dev.exs, config/prod.exs и так далее, но она не оказывает эффекта на config/runtime.exs:
:code_reloader— если задано значениеtrue, включает перезагрузку кода. Список параметров конфигурации перезагрузчика кода см. в разделеPhoenix.CodeReloader.reload/1. Обратите внимание, что перезагрузка кода основана на файловой системе, поэтому при разработке нельзя одновременно запускать два экземпляра одного приложения с включённой перезагрузкой кода: они будут конкурировать друг с другом, и файлы фактически перекомпилирует только один из них. В таких случаях измените файлы конфигурации, чтобы перезагрузка кода была включена только в одном из приложений, или задайте переменной окруженияMIX_BUILD_PATHразные каталоги сборки:debug_errors— если задано значениеtrue, использует возможностиPlug.Debuggerдля отладки сбоев приложения. Рекомендуется задавать значениеtrueтолько при разработке, поскольку это позволяет просматривать исходный код приложения во время отладки. По умолчанию задано значениеfalse:force_ssl— гарантирует, что данные никогда не отправляются по HTTP, перенаправляя все запросы на HTTPS. Ожидает список параметров, которые передаются вPlug.SSL. По умолчанию в HTTPS-запросах устанавливается заголовок "strict-transport-security", предписывающий браузерам всегда использовать HTTPS. Если поступает небезопасный запрос (HTTP), он перенаправляется на версию HTTPS с использованием:host, указанного в конфигурации:url. Чтобы динамически перенаправлять наhostтекущего запроса, задайте:hostв конфигурации:force_sslзначениеnil
Конфигурация времени выполнения
Приведённую ниже конфигурацию можно задать в config/dev.exs, config/prod.exs и так далее, а также в config/runtime.exs. Обычно, если необходимо настроить её с помощью переменных окружения системы, значения задаются в config/runtime.exs. Эти параметры также можно задать при запуске конечной точки в дереве супервизии, например, в {MyApp.Endpoint, options}.
:adapter— адаптер веб-сервера для обработки веб-запросов. См. раздел «Конфигурация адаптера» ниже:cache_static_manifest— путь к файлу манифеста JSON, содержащему статические файлы и их хешированные версии. Обычно здесь указывается "priv/static/cache_manifest.json" — файл, автоматически создаваемый задачейmix phx.digest. Значением может быть строка с путём в файловой системе либо кортеж с именем приложения и путём внутри него.:cache_static_manifest_latest— карта статических файлов, указывающая их хешированные версии. Она автоматически загружается изcache_static_manifestпри запуске. Однако, если вы используете собственный механизм обработки статических файлов, это значение можно задать явно. Оно используется такими проектами, какLiveView, чтобы определить, использует ли клиент последние версии всех ресурсов.:cache_manifest_skip_vsn— если задано значение true, не добавляет строку запроса "?vsn=d" при создании путей к статическим ресурсам. Эта строка запроса используетсяPlug.Staticдля установки длительных сроков действия, поэтому задавайте этому параметру значение true, только если для раздачи ресурсов не используетсяPlug.Static, например, если используется CDN. Если вы задаёте этот параметр, рассмотрите возможность также передать--no-vsnзадачеmix phx.digest. По умолчанию задано значениеfalse.:check_origin— настройка:check_originпо умолчанию для транспортов. Возможные параметры см. в разделеsocket/3. По умолчанию задано значениеtrue.:secret_key_base— секретный ключ, используемый как основа для генерации секретов шифрования и подписи данных. Например, по умолчанию для файлов cookie и токенов создаются подписи, но при необходимости их также можно шифровать. По умолчанию задано значениеnil, поскольку ключ необходимо задавать отдельно для каждого приложения:server— если задано значениеtrue, запускает веб-сервер при старте дерева супервизии конечной точки. По умолчанию задано значениеfalse. Задачаmix phx.serverавтоматически задаёт этому параметру значениеtrue-
:url— конфигурация для генерации URL-адресов во всём приложении. Принимает параметры:host,:scheme,:pathи:port. Все ключи, кроме:path, можно изменять во время выполнения. По умолчанию:[host: "localhost", path: "/"]
Параметр
:portдолжен быть целым числом или строкой. Параметр:hostдолжен быть строкой.Параметр
:schemeпринимает значения"http"и"https". Значение по умолчанию определяется на основе параметра верхнего уровня:httpили:https. Он полезен, когда Phoenix размещён за балансировщиком нагрузки или обратным прокси, где завершается SSL.Параметр
:pathможно использовать для переопределения корневого пути. Полезен, когда Phoenix размещён за обратным прокси с правилами перезаписи URL :static_url— конфигурация для генерации URL-адресов статических файлов. Если параметр не задан, используется значениеurl. Принимает те же параметры, что иurl-
:watchers— набор наблюдателей, запускаемых вместе с сервером. Ожидает список кортежей, содержащих исполняемый файл и его аргументы. Наблюдатели гарантированно запускаются в каталоге приложения, но только если сервер включён (если только параметру конфигурации:force_watchersне задано значениеtrue). Например, приведённый ниже наблюдатель запускает режим "watch" инструмента сборки webpack при запуске сервера. Можно настроить любой инструмент сборки или команду:[ node: [ "node_modules/webpack/bin/webpack.js", "--mode", "development", "--watch", "--watch-options-stdin" ] ]В конец списка можно добавить параметры
:cdи:env, чтобы настроить наблюдателя:[node: [..., cd: "assets", env: [{"TAILWIND_MODE", "watch"}]]]Наблюдатель также может быть кортежем вида модуль-функция-аргументы, который будет вызван соответствующим образом:
[another: {Mod, :fun, [arg1, arg2]}]Если задано значение
false, наблюдателей можно отключить. :force_watchers— если задано значениеtrue, принудительно запускает наблюдателей, даже если параметру:serverзадано значениеfalse.-
:live_reload— конфигурация параметра живой перезагрузки. Для неё требуется параметр:patterns, содержащий список шаблонов файлов для отслеживания. Изменение этих файлов вызывает перезагрузку.live_reload: [ url: "ws://localhost:4000", patterns: [ ~r"priv/static/(?!uploads/).*(js|css|png|jpeg|jpg|gif|svg)$", ~r"lib/app_web/(live|views)/.*(ex)$", ~r"lib/app_web/templates/.*(eex)$" ] ] :pubsub_server— имя сервера pubsub, используемого в каналах и функциях широковещательной рассылки конечной точки. Сервер PubSub обычно запускается в дереве супервизии.-
:render_errors— отвечает за отображение шаблонов при сбоях приложения. Например, если приложение аварийно завершает работу с ошибкой 500 при HTML-запросе, будет вызванrender("500.html", assigns)в представлении, переданном в:render_errors. Чтобы указать отдельный модуль для обработки ошибок в каждом формате, можно задать список:formats. Пример:[formats: [html: MyApp.ErrorHTML], layout: false, log: :debug]
:log_access_url— выводит URL-адрес доступа после запуска сервера
Обратите внимание, что в Phoenix.Endpoint также можно хранить собственные настройки. Например, Phoenix LiveView ожидает собственную конфигурацию под ключом :live_view. В таких случаях обратитесь к документации соответствующего проекта.
Конфигурация адаптера
Phoenix позволяет выбрать адаптер веб-сервера. Вновь созданные приложения, сгенерированные задачей Mix phx.new, используют веб-сервер Bandit через адаптер Bandit.PhoenixAdapter. Если параметр adapter не задан, Phoenix для обратной совместимости с приложениями, созданными до Phoenix 1.7.8, использует Phoenix.Endpoint.Cowboy2Adapter.
Оба адаптера можно настроить аналогичным образом с помощью следующих двух параметров верхнего уровня:
:http— конфигурация HTTP-сервера. В зависимости от выбранного адаптера принимает все параметры, определённые вBanditилиPlug.Cowboy. По умолчанию задано значениеfalse:https— конфигурация HTTPS-сервера. В зависимости от выбранного адаптера принимает все параметры, определённые вBanditилиPlug.Cowboy. По умолчанию задано значениеfalse
Кроме того, для веб-сервера Cowboy можно настроить дренирование соединений с помощью следующего параметра верхнего уровня (для Bandit это не требуется, поскольку дренирование соединений уже встроено):
-
:drainer— процесс дренирования ожидает завершения всех выполняющихся запросов при остановке приложения. Он принимает параметры:shutdownи:check_interval, определённые вPlug.Cowboy.Drainer. Обратите внимание, что дренирование не завершает существующие соединения, а лишь ожидает их завершения. Перед вызовом этого процесса собственное дренирование выполняется для сокетных соединений. Это связано с тем, что сокеты сохраняют состояние и о завершении их работы можно уведомить корректным образом, что позволяет распределить их остановку на более длительный период. Дополнительные сведения см. в документации кsocket/3
API конечной точки
В предыдущем разделе мы использовали функцию config/2, которая автоматически создаётся в конечной точке. Ниже приведён список всех функций, автоматически определяемых в ней:
для работы с путями и URL-адресами:
struct_url/0,url/0,path/1,static_url/0,static_path/1иstatic_integrity/1для получения сведений о времени выполнения, адресе и порте, на которых работает конечная точка:
server_info/1для широковещательной рассылки в каналы:
broadcast/3,broadcast!/3,broadcast_from/4,broadcast_from!/4,local_broadcast/3иlocal_broadcast_from/4для настройки:
start_link/1,config/2иconfig_change/2как того требует поведение
Plug:Plug.init/1иPlug.call/2
Сводка
Типы
- broadcast(topic, event, msg)
Рассылает
msgкакeventв указанномtopicвсем узлам.- broadcast!(topic, event, msg)
Рассылает
msgкакeventв указанномtopicвсем узлам.- broadcast_from(from, topic, event, msg)
Рассылает
msgот указанногоfromкакeventв указанномtopicвсем узлам.- broadcast_from!(from, topic, event, msg)
Рассылает
msgот указанногоfromкакeventв указанномtopicвсем узлам.- config key, default
Возвращает конфигурацию конечной точки по заданному ключу.
- config_change(changed, removed)
Повторно загружает конфигурацию конечной точки при обновлении приложения.
- host()
Возвращает хост из конфигурации :url.
- local_broadcast(topic, event, msg)
Рассылает
msgкакeventв указанномtopicв пределах текущего узла.- local_broadcast_from(from, topic, event, msg)
Рассылает
msgот указанногоfromкакeventв указанномtopicв пределах текущего узла.- path(path)
Создаёт сведения о пути при маршрутизации к этой конечной точке.
- script_name()
Возвращает имя скрипта из конфигурации :url.
- server_info(scheme)
Возвращает адрес и порт, на которых работает сервер
- start_link(keyword)
Запускает дерево супервизии конечной точки.
- static_integrity(path)
Создаёт хеш целостности для статического файла в
priv/static.- static_lookup(path)
Создаёт кортеж из двух элементов, содержащий
static_pathиstatic_integrity.- static_path(path)
Создаёт маршрут к статическому файлу в
priv/static.- static_url()
Создаёт URL статического ресурса без сведений о пути.
- struct_url()
Создаёт базовый URL конечной точки в виде структуры
URI.- subscribe(topic, opts)
Подписывает вызывающую сторону на указанный топик.
- unsubscribe(topic)
Отписывает вызывающую сторону от указанного топика.
- url()
Создаёт базовый URL конечной точки без сведений о пути.
Колбэки
- server?(otp_app, endpoint)
Проверяет, настроен ли запуск веб-сервера конечной точки.
- socket(path, module, opts \\ [])
Определяет точку подключения websocket/longpoll для
socket.
Функции
Типы
event()Исходный код
@type event() :: String.t()
msg()Исходный код
@type msg() :: map() | {:binary, binary()} topic()Исходный код
@type topic() :: String.t()
Обратные вызовы
broadcast(topic, event, msg)Источник
@callback broadcast(topic(), event(), msg()) :: :ok | {:error, term()} Отправляет msg как event в указанном topic всем узлам.
broadcast!(topic, event, msg)Источник
@callback broadcast!(topic(), event(), msg()) :: :ok
Отправляет msg как event в указанном topic всем узлам.
В случае сбоев вызывает исключение.
broadcast_from(from, topic, event, msg)Источник
@callback broadcast_from(from :: pid(), topic(), event(), msg()) :: :ok | {:error, term()} Отправляет msg от указанного from как event в указанном topic всем узлам.
broadcast_from!(from, topic, event, msg)Источник
@callback broadcast_from!(from :: pid(), topic(), event(), msg()) :: :ok
Отправляет msg от указанного from как event в указанном topic всем узлам.
В случае сбоев вызывает исключение.
config key, defaultИсточник
@callback config(key :: atom(), default :: term()) :: term()
Получает конфигурацию конечной точки по указанному ключу.
config_change(changed, removed)Источник
@callback config_change(changed :: term(), removed :: term()) :: term()
Перезагружает конфигурацию конечной точки при обновлении приложения.
host()Источник
@callback host() :: String.t()
Возвращает хост из конфигурации :url.
local_broadcast(topic, event, msg)Источник
@callback local_broadcast(topic(), event(), msg()) :: :ok
Отправляет msg как event в указанном topic в пределах текущего узла.
local_broadcast_from(from, topic, event, msg)Источник
@callback local_broadcast_from(from :: pid(), topic(), event(), msg()) :: :ok
Отправляет msg от указанного from как event в указанном topic в пределах текущего узла.
path(path)Источник
@callback path(path :: String.t()) :: String.t()
Формирует информацию о пути при маршрутизации к этой конечной точке.
script_name()Источник
@callback script_name() :: [String.t()]
Возвращает имя скрипта из конфигурации :url.
server_info(scheme)Источник
@callback server_info(Plug.Conn.scheme()) ::
{:ok,
{:inet.ip_address(), :inet.port_number()} | :inet.returned_non_ip_address()}
| {:error, term()} Возвращает адрес и порт, на которых работает сервер
start_link(keyword)Источник
@callback start_link(keyword()) :: Supervisor.on_start()
Запускает дерево супервизии конечной точки.
Запускает кэш конфигурации конечной точки и, возможно, серверы для обработки запросов.
static_integrity(path)Источник
@callback static_integrity(path :: String.t()) :: String.t() | nil
Формирует хеш целостности для статического файла в priv/static.
static_lookup(path)Источник
@callback static_lookup(path :: String.t()) ::
{String.t(), String.t()} | {String.t(), nil} Формирует кортеж из двух элементов, содержащий static_path и static_integrity.
static_path(path)Источник
@callback static_path(path :: String.t()) :: String.t()
Формирует маршрут к статическому файлу в priv/static.
static_url()Источник
@callback static_url() :: String.t()
Формирует статический URL без информации о пути.
struct_url()Источник
@callback struct_url() :: URI.t()
Формирует базовый URL конечной точки в виде структуры URI.
subscribe(topic, opts)Источник
@callback subscribe(topic(), opts :: Keyword.t()) :: :ok | {:error, term()} Подписывает вызывающий процесс на указанную тему.
Список параметров см. в разделе Phoenix.PubSub.subscribe/3.
unsubscribe(topic)Источник
@callback unsubscribe(topic()) :: :ok | {:error, term()} Отписывает вызывающий процесс от указанной темы.
url()Источник
@callback url() :: String.t()
Формирует базовый URL конечной точки без информации о пути.
Функции
server?(otp_app, endpoint)Источник
Проверяет, настроен ли запуск веб-сервера конечной точки.
-
otp_app— OTP-приложение, в котором запущена конечная точка, например:my_app -
endpoint— модуль конечной точки, напримерMyAppWeb.Endpoint
Примеры
iex> Phoenix.Endpoint.server?(:my_app, MyAppWeb.Endpoint) true
socket(path, module, opts \\ [])Источник
Определяет точку монтирования WebSocket/longpoll для socket.
Ожидает path, модуль socket и набор параметров. Модуль сокета обычно определяется с помощью Phoenix.Socket.
Поддержка соединений WebSocket и longpolling предусмотрена из коробки.
Параметры
:websocket— управляет конфигурацией WebSocket. По умолчанию —true. Может иметь значение false или быть списком ключевых слов с параметрами. Полный список см. в разделах «Общая конфигурация» и «Конфигурация WebSocket»:longpoll— управляет конфигурацией longpoll. По умолчанию —false. Может иметь значение true или быть списком ключевых слов с параметрами. Полный список см. в разделах «Общая конфигурация» и «Конфигурация longpoll»-
:drainer— список ключевых слов или пользовательская функция MFA, возвращающая список ключевых слов, например:{MyAppWeb.Socket, :drainer_configuration, []}параметры для завершения работы сокетов при остановке приложения. Цель — уведомить всех клиентов каналов (и LiveView) о необходимости переподключиться. Поддерживаются следующие параметры:
-
:batch_size— количество клиентов, уведомляемых одновременно в одной группе. По умолчанию — 10000. -
:batch_interval— время в миллисекундах, отведённое на завершение одной группы. По умолчанию — 2000 мс. -
:shutdown— максимально допустимое время в миллисекундах для обработки всех групп. По умолчанию — 30000 мс. -
:log— уровень журнала для действий по завершению работы. По умолчанию используется параметр:log, переданный вuse Phoenix.Socketили:info. Установите значениеfalse, чтобы отключить ведение журнала.
Например, если у вас 150 тыс. соединений, значения по умолчанию разделят их на 15 групп по 10 тыс. соединений. Обработка каждой группы занимает 2000 мс, прежде чем начнётся обработка следующей. В этом случае все действия будут выполнены чуть быстрее максимального времени завершения работы — 30000 мс. Поэтому при увеличении числа соединений не забудьте соответствующим образом настроить время завершения работы. Наконец, после запуска механизма завершения работы сокетов запустится механизм завершения работы HTTP/HTTPS-соединений нижнего уровня, применяемый ко всем соединениям. Установите значение
false, чтобы отключить завершение работы. -
-
auth_token— логическое значение, разрешающее использовать параметр auth_token клиента channels. Конкретный механизм передачи токена зависит от транспорта:- для транспорта WebSocket токен можно передать в заголовке
Sec-WebSocket-Protocol. - для транспорта longpoll токен можно передать в заголовке
Authorization.
Токен доступен в
connect_infoкак:auth_token.Пользовательские транспорты могут реализовывать собственный механизм.
- для транспорта WebSocket токен можно передать в заголовке
Указанные ниже параметры также можно передать в use Phoenix.Socket. Заданные здесь значения имеют приоритет над значением в use Phoenix.Socket.
Примеры
socket "/ws", MyApp.UserSocket socket "/ws/admin", MyApp.AdminUserSocket, longpoll: true, websocket: [compress: true]
Параметры пути
В путь можно включить переменные; они будут доступны в params, передаваемых сокету.
socket "/ws/:user_id", MyApp.UserSocket, websocket: [path: "/project/:project_id"]
Общая конфигурация
Конфигурацию ниже можно передать для обоих ключей: :websocket и :longpoll:
:path— путь для транспорта. По умолчанию используется имя транспорта ("/websocket" или "/longpoll"):serializer— список сериализаторов сообщений. Дополнительные сведения см. в разделеPhoenix.Socket:transport_log— указывает, должен ли транспортный уровень вести журнал и, если да, то с каким уровнем-
:check_origin— проверять ли транспортному уровню источник запросов, если присутствует заголовокorigin. Возможные значения:true,false, список разрешённых URI или функция, заданная кортежем MFA. По умолчанию используется значение настройки:check_originв конфигурации конечной точки.Если задано значение
true, заголовок проверяется на соответствие:hostвYourAppWeb.Endpoint.config(:url)[:host].Если задано значение
falseи вы не проверяете сеанс в сокете, ваше приложение уязвимо для атак Cross-Site WebSocket Hijacking (CSWSH). Используйте этот параметр только в среде разработки, когда хост действительно неизвестен или когда обслуживаются клиенты, не отправляющие заголовокorigin, например мобильные приложения.Также можно указать список явно разрешённых источников. Каждый источник может включать схему, хост и порт. Поддерживаются подстановочные знаки.
check_origin: [ "https://example.com", "//another.com:888", "//*.other.com" ]
Или чтобы принимать любые источники, соответствующие хосту, порту и схеме соединения запроса:
check_origin: :conn
Или пользовательскую функцию MFA:
check_origin: {MyAppWeb.Auth, :my_check_origin?, []}Функция MFA вызывается с запросом
%URI{}в качестве первого аргумента, за которым следуют аргументы из списка MFA, и должна возвращать логическое значение. :check_csrf— выполнять ли транспортному уровню проверку CSRF. Чтобы избежать атак «Cross-Site WebSocket Hijacking», должен быть включён хотя бы один из параметровcheck_originиcheck_csrf. Если для обоих задать значениеfalse, Phoenix вызовет исключение, однако отключить оба параметра всё же можно, передав пользовательскую функцию MFA вcheck_origin. В этом случае вы несёте ответственность за включение хотя бы одного из них. По умолчанию —true:code_reloader— включить или отключить перезагрузчик кода. По умолчанию используется конфигурация конечной точки:connect_info— список ключей, соответствующих данным, копируемым из транспорта и передаваемым в обратный вызов пользовательского сокетаconnect/3. Допустимые ключи см. в подразделе «Информация о подключении»
Информация о подключении
Допустимые ключи:
:peer_data— результат вызоваPlug.Conn.get_peer_data/1:trace_context_headers— список всех заголовков контекста трассировки. Поддерживаемые заголовки определены в спецификации W3C Trace Context. Эти заголовки необходимы таким библиотекам, как OpenTelemetry, чтобы извлекать информацию о распространении трассировки и определять, что этот запрос является частью выполняющейся трассировки большего размера.:x_headers— все заголовки запроса, начинающиеся с "x-":uri—%URI{}с информацией из conn:user_agent— значение заголовка запроса "user-agent"-
{:session, session_config}— информация о сеансе изPlug.Conn.session_configобычно является точной копией аргументов, переданных вPlug.Session. Для проверки сеанса при подключении сокета в качестве параметра запроса необходимо передать "_csrf_token" со значениемURI.encode_www_form(Plug.CSRFProtection.get_csrf_token()). Параметр запроса с CSRF-токеном можно изменить с помощью параметра:csrf_token_key.Кроме того,
session_configможет быть MFA, например{MyAppWeb.Auth, :get_session_config, []}, чтобы загружать конфигурацию во время выполнения.
После перечисленных выше допустимых ключей также можно указать произвольные ключевые слова — это удобно для передачи сокету пользовательской информации о подключении.
Например:
socket "/socket", AppWeb.UserSocket,
websocket: [
connect_info: [:peer_data, :trace_context_headers, :x_headers, :uri, session: [store: :cookie]]
]
С произвольными ключевыми словами:
socket "/socket", AppWeb.UserSocket,
websocket: [
connect_info: [:uri, custom_value: "abcdef"]
]
Где мои заголовки?
Из соображений безопасности Phoenix предоставляет ограниченный доступ к заголовкам соединения. WebSocket-соединения являются междоменными, поэтому, когда пользователь «Иван Иванов» посещает вредоносный сайт, этот сайт может открыть WebSocket-соединение с вашим приложением, а браузер охотно передаст данные аутентификации и cookie Ивана Иванова. Если принять эти данные как есть, вредоносный сайт получит полный контроль над WebSocket-соединением с вашим приложением, аутентифицированным от имени Ивана Иванова.
Чтобы защитить приложение, Phoenix ограничивает доступную сокету информацию о соединении и проверяет её. Это защищает приложение от подобных атак, но не позволяет обращаться к cookie и другим заголовкам из сокета. Вы можете получить доступ к сеансу, сохранённому в соединении, с помощью параметра :connect_info, если при подключении по WebSocket также передадите токен CSRF.
Конфигурация WebSocket
Следующая конфигурация применяется только к :websocket.
:timeout— тайм-аут, в течение которого WebSocket-соединения остаются открытыми после получения последних данных; по умолчанию 60_000 мс:max_frame_size— максимально допустимый размер кадра в байтах; по умолчанию "infinity":fullsweep_after— максимальное количество сборок мусора до принудительной полной сборки для процесса сокета. Чтобы чаще очищать процессы транспортного уровня WebSocket, можно задать значение0. Для настройки этого параметра требуется Erlang/OTP 24:compress— включить ли сжатие каждого сообщения во всех кадрах данных; по умолчанию false-
:subprotocols— список поддерживаемых подпротоколов WebSocket. Используется для заголовка ответаSec-WebSocket-Protocolпри рукопожатии; по умолчанию nil.Например:
subprotocols: ["sip", "mqtt"]
-
:error_handler— пользовательский обработчик ошибок соединения. ЕслиPhoenix.Socket.connect/3возвращает кортеж{:error, reason}, обработчик ошибок вызывается с причиной ошибки. Для WebSocket обработчик ошибок должен быть кортежем MFA, принимающимPlug.Connи причину ошибки и возвращающимPlug.Connс ответом. Например:socket "/socket", MySocket, websocket: [ error_handler: {MySocket, :handle_error, []} ]а возвращаемое значение
{:error, :rate_limit}можно обработать вMySocketследующим образом:def handle_error(conn, :rate_limit), do: Plug.Conn.send_resp(conn, 429, "Too many requests")
Конфигурация longpoll
Следующая конфигурация применяется только к :longpoll:
:window_ms— время в миллисекундах (мс), в течение которого клиент может ожидать новые сообщения в запросе опроса. По умолчанию —10_000.:pubsub_timeout_ms— время в миллисекундах (мс), в течение которого запрос может ожидать ответа уровня pubsub. По умолчанию —2000.:crypto— параметры для проверки и подписания токена, принимаемые модулемPhoenix.Token. По умолчанию срок действия токенов составляет 2 недели
© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix.hexdocs.pm/Phoenix.Endpoint.html