Расширения

Спецификация ASGI предусматривает, что специфичные для сервера расширения должны использоваться вне основной спецификации ASGI. Этот документ определяет некоторые распространенные расширения.

Websocket Denial Response

Соединения Websocket начинаются с того, что клиент отправляет HTTP-запрос, содержащий соответствующие заголовки обновления. После получения этого запроса сервер может либо обновить соединение, либо ответить HTTP-ответом (отказ в обновлении). Основная спецификация ASGI не допускает какого-либо контроля над ответом об отказе, вместо этого указывается, что должен быть возвращен код состояния HTTP 403, тогда как это расширение позволяет платформе ASGI управлять ответом об отказе. Вместо того, чтобы быть основной частью ASGI, это расширение нужно для того, что считается нишевой функцией, так как большинство клиентов не используют ответ отказа.

Серверы ASGI, которые реализуют это расширение, будут предоставлять websocket.http.response в части расширений области:

"scope": {
    ...
    "extensions": {
        "websocket.http.response": {},
    },
}

Это позволит ASGI Framework отправлять ответные сообщения HTTP после сообщения websocket.connect. За этими сообщениями не могут следовать никакие другие сообщения веб-сокета, поскольку сервер должен отправить HTTP-ответ, а затем закрыть соединение.

Сами сообщения должны быть websocket.http.response.start и websocket.http.response.body со структурой, которая соответствует http.response.start и http.response. body сообщения, определенные в HTTP-части базовой спецификации ASGI.

HTTP/2 Server Push

HTTP/2 позволяет серверу отправить ресурс клиенту, отправив обещание push. Серверы ASGI, которые реализуют это расширение, предоставят http.response.push в части расширений области:

"scope": {
    ...
    "extensions": {
        "http.response.push": {},
    },
}

Платформа ASGI может инициировать проталкивание сервера, отправив сообщение со следующими ключами. Это сообщение может быть отправлено в любое время после сообщения Response Start, но до последнего сообщения Response Body.

Ключи:

  • type (Unicode string): "http.response.push"

  • path (Unicode string): HTTP-путь от URL с кодированными в процентах последовательностями и байтовыми последовательностями UTF-8, декодированными в символы.

  • headers (Iterable[[byte string, byte string]]): итерация из [name, value] итераций из двух элементов, где name - имя заголовка, и value является значением заголовка. Имена заголовков должны быть в нижнем регистре. Псевдозаголовки (присутствующие в HTTP/2 и HTTP/3) не должны присутствовать.

Затем сервер ASGI должен попытаться отправить клиенту push-запрос сервера (или push-обещание). Если клиент поддерживает push-запрос сервера, сервер должен создать новое соединение с новым экземпляром приложения и обработать его так, как если бы клиент сделал запрос.

Сервер ASGI должен установить значение заголовка псевдо :authority равным значению запроса, запускающего обещание push.

Вернуться на верх