Волга
Главная
Agent Skill
API Docs
GitHub
  • English
  • Русский
Главная
Agent Skill
API Docs
GitHub
  • English
  • Русский
  • Главная
  • Старт

    • Быстрый старт
    • Обработчики
    • Параметры маршрута
    • Параметры запроса
    • Группировка маршрутов
  • Запросы и ответы

    • Заголовки (Headers)
    • Работа с JSON
    • Работа с Form Data
    • Работа с файлами
    • Multipart-ответы
    • Сырое тело запроса
    • Cookies
    • Валидация запросов
  • Middleware и инфраструктура

    • Основы Middleware
    • Пользовательские Middleware
    • Параметризованные Middleware
    • Сжатие ответов
    • Распаковка запросов
    • CORS (Cross-Origin Resource Sharing)
    • Статические файлы
    • Rate Limiting
    • Файлы конфигурации
    • OpenAPI
  • Безопасность и доступ

    • Аутентификация и авторизация
    • OAuth 2.1 и OpenID Connect
    • OAuth 2.1 Клиент
    • Гранты «сервис-сервис»
    • DPoP — токены, привязанные к отправителю
  • Надежность и наблюдаемость

    • Центральный обработчик ошибок
    • Логгирование и Трассировка
    • Отмена запросов
    • Плавное завершение работы
  • Протоколы и realtime

    • Версии и методы HTTP
    • HTTPS
    • WebSockets
    • Server-Sent Events (SSE)
  • Продвинутые паттерны

    • Внедрение Зависимостей
    • Пользовательская обработка методов HEAD, OPTIONS и TRACE
  • Agent Skill

Пользовательская обработка методов HEAD, OPTIONS и TRACE

В данном руководстве представлены различные способы обработки таких методов HTTP как HEAD, OPTIONS и TRACE.

Метод HEAD

По умолчанию обработчик, замапленный на метод GET, отвечает и на HEAD: маршрутизация передаёт запрос HEAD, у которого нет собственного маршрута, маршруту GET, а тело отбрасывается на выходе.

Поэтому запрос HEAD проходит через всё то же, через что проходит его маршрут GET: middleware маршрута, middleware группы и политику CORS. Health-check на основе HEAD, бьющий в маршрут за authorize, получит 401 / 403 так же, как и GET рядом; если на каком-то пути HEAD работать не должен, для него нужен собственный map_head, который об этом и говорит.

Чтобы настроить поведение метода HEAD, явно определите его с помощью метода map_head. map_head по-прежнему имеет приоритет и выполняет свои собственные middleware, а не middleware маршрута GET:

use volga::{App, ok};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    // HEAD /resource
    app.map_head("/resource", || async {
        ok!([
            ("x-custom-header", "some-value-get")
        ])
    });

    // GET /resource
    app.map_get("/resource", || async {
        ok!("Hello World!"; [
            ("x-custom-header", "some-value-get")
        ])
    });

    app.run().await
}

Здесь метод HEAD возвращает заголовки без тела, часто зеркально отражая те заголовки, которые вернул бы запрос GET.

Совет

GET и HEAD, замапленные на один путь, описывают один ресурс, поэтому их параметры маршрута должны называться одинаково — map_get("/file/{id}", ..) рядом с map_head("/file/{name}", ..) приводит к панике при регистрации. См. Параметры маршрута.

Метод OPTIONS

Для специальной обработки запросов OPTIONS используйте метод map_options для сопоставления этого метода HTTP:

use volga::{App, ok};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    // OPTIONS /resource
    app.map_options("/resource", || async {
        ok!([
            ("Allow", "GET, OPTIONS")
        ])
    });

    // GET /resource
    app.map_get("/resource", || async {
        ok!("Hello World!")
    });

    app.run().await
}

Пример выше включает заголовок Allow для указания поддерживаемых HTTP-методов для ресурса. Тело ответа необязательно и зависит от конкретных потребностей вашего API.

Метод TRACE

Метод TRACE полезен для отладки, так как он позволяет отслеживать путь запроса к серверу и возвращает сообщение запроса для диагностических целей:

use volga::{App, HttpRequest, stream};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    // TRACE /
    app.map_trace("/", |req: HttpRequest| async move {
        let body = req.into_body().into_data_stream();
        stream!(body; [
            ("content-type", "message/http")
        ])
    });

    app.run().await
}

Этот обработчик захватывает входящий запрос и отправляет его обратно в ответе с соответствующим типом содержимого.

Вы можете посмотреть примеры здесь:

  • HEAD
  • OPTIONS
  • TRACE
Последнее обновление: 14.09.2026, 06:45
Prev
Внедрение Зависимостей