Files
rust-xmpp/docs/HTTP-ALTCONNECT.md
T
2026-10-20 15:59:55 +07:00

5.2 KiB

http_altconnect (0.7.7)

Встроенный модуль публикует альтернативные XMPP connection methods:

  • GET /.well-known/host-meta: XRD, Content-Type application/xrd+xml.
  • GET /.well-known/host-meta.json: JRD, Content-Type application/json.

Оба ответа содержат Access-Control-Allow-Origin: *. HEAD возвращает те же заголовки без тела; OPTIONS разрешён; остальные методы дают405. Неизвестные пути и неразрешённый HTTP Host не обслуживаются. Query не изменяет формат и не включает JSONP. В логах запрос классифицируется как altconnect.

Реализация сверена с supplied plugins/mod_http_altconnect.lua cafd74b9c5ea. Источник протокола: https://xmpp.org/extensions/xep-0156.html.

Включение

Добавьте http_altconnect в существующий modules_enabled, сохранив остальные модули. В Lua, например:

modules_enabled = {
    -- остальные существующие модули
    "websocket";
    "bosh";
    "http_altconnect";
}
advertise_bosh = true;
advertise_websocket = true;

Это фрагмент: не заменяйте им весь рабочий список modules_enabled. Оба advertise-параметра по умолчанию true; false скрывает соответствующий Link. Выключенный/неподключённый транспорт не рекламируется. Если нет ни одного транспорта, XRD пустой, JSON содержит links: []. Отключение http_altconnect убирает discovery endpoints, сохраняя работу WS/BOSH.

Адреса учитывают http_host, http_paths.bosh/websocket и http_external_url. При отсутствии внешнего URL выбирается первый настроенный HTTPS listener, затем первый HTTP listener; значения не зависят от Host/Forwarded в запросе. Пустой interfaces список не считается действующим listener.

Пример для HTTPS proxy с удаляемым публичным префиксом /xmpp/:

http_external_url = "https://wthome.ru/xmpp/";
http_paths = {
    websocket = "/ws";
    bosh = "/bind";
}

Опубликованные href: https://wthome.ru/xmpp/bind и wss://wthome.ru/xmpp/ws. http_external_url меняет публичные адреса, внутренние пути остаются /bind и /ws. http_paths.altconnect меняет внутреннюю базу discovery, например /discover: в этом случае endpoint — /discover/host-meta[.json]. $host поддерживается. Путь transport, конфликтующий с активным host-meta endpoint, отвергается при check-config/startup вместо неоднозначной маршрутизации.

Публичный discovery

Клиент запрашивает well-known на HTTPS origin XMPP-домена, например https://wthome.ru/.well-known/host-meta. HTTPS listener5281 сам по себе не создаёт публикацию на443: используйте существующий reverse proxy или port mapping. Пример дополнительных location внутри TLS server Nginx, если backendHTTP5280:

location = /.well-known/host-meta {
    proxy_pass http://127.0.0.1:5280;
    proxy_set_header Host wthome.ru;
}
location = /.well-known/host-meta.json {
    proxy_pass http://127.0.0.1:5280;
    proxy_set_header Host wthome.ru;
}

Эти location публикуют discovery без transport-префикса /xmpp/; соответствующие WS/BOSH location по-прежнему настраиваются согласно HTTP-PROXY.md. При custom altconnect mount proxy должен переписать well-known на него.

XEP-0156 требует HTTPS загрузку metadata и только https/wss href. Для native совместимости supplied module HTTP/WS fallback также сохранён: если настроен только HTTP, ссылки будут http/ws. Для стандартного защищённого discovery настройте HTTPS listener или HTTPS http_external_url. Автоматическое изменение production DNS, proxy или TLS-сертификатов не выполняется.

Проверка с действительным CA (для self-signed добавьте --cacert cert.pem):

curl -i https://wthome.ru/.well-known/host-meta
curl -i https://wthome.ru/.well-known/host-meta.json

Модуль включается на единственном runtime VirtualHost. Host Meta2/XEP-0487, DNS TXT/SRV changes, redirects на чужие Host и автоматический запуск браузера не являются частью этого плагина. Результаты локальных проверок — VALIDATION.md.