Волга
Главная
API Docs
GitHub
  • English
  • Русский
Главная
API Docs
GitHub
  • English
  • Русский
  • Главная
  • Основы

    • Быстрый старт
    • Параметры маршрута
    • Параметры запроса
    • Группировка маршрутов
    • Заголовки (Headers)
  • Форматы данных

    • Работа с JSON
    • Работа с Form Data
    • Работа с файлами
    • Server-Sent Events (SSE)
  • Протоколы

    • HTTP/1 and HTTP/2
    • HTTPS
    • WebSockets & WebTransport
  • Продвинутые сценарии

    • Пользовательские Middleware
    • Сжатие ответов
    • Распаковка запросов
    • Центральный обработчик ошибок
    • Внедрение Зависимостей
    • Логгирование и Трассировка
    • Статические файлы
    • CORS (Cross-Origin Resource Sharing)
    • Cookies
    • Отмена запросов
    • Пользовательская обработка методов HEAD, OPTIONS и TRACE

Сжатие ответов

Волга предоставляет middleware, которое сжимает тела ответов HTTP на основе заголовка Accept-Encoding. В настоящее время поддерживается четыре алгоритма сжатия: Brotli, Gzip, Deflate и Zstandard.

Включение сжатия

Чтобы включить сжатие ответов, убедитесь, что вы включили необходимую функцию в Cargo.toml. Если вы не используете набор функций full, вы можете отдельно подключить функцию compression-full делающую доступными все алгоритмы сжатия:

[dependencies]
volga = { version = "0.4.6", features = ["compression-full"] }

Если вам нужны определенные алгоритмы сжатия, вы можете указать их явно:

[dependencies]
volga = { version = "0.4.6", features = ["compression-brotli", "compression-gzip"] }

Пример использования

Чтобы использовать сжатие в вашем приложении, используйте метод use_compression() в вашем main.rs:

use volga::{App, ok};
use serde::Serialize;
 
#[derive(Serialize)]
struct User {
    name: String,
    age: i32
}

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

    // Подключает middleware сжимающий ответы
    app.use_compression();

    app.map_get("/users", || async {
        let mut values = Vec::new();
        for i in 0..10000 {
            values.push(User { 
                age: i, 
                name: i.to_string()
            });
        }
        ok!(values)
    });
    
    app.run().await
}

Затем вы можете протестировать это с помощью команды curl:

> curl -v --location "http://127.0.0.1:7878/users" \
      -H "Accept-Encoding: br" \
      -H "Content-Type: application/json"
*   Trying 127.0.0.1:7878...
* Connected to 127.0.0.1 (127.0.0.1) port 7878
> GET /hello HTTP/1.1
> Host: 127.0.0.1:7878
> User-Agent: curl/8.9.1
> Accept: */*
> Accept-Encoding: br
> Content-Type: application/json
>
* Request completely sent off
< HTTP/1.1 200 OK
< server: Volga
< content-type: application/json
< vary: accept-encoding
< content-encoding: br
< transfer-encoding: chunked
< date: Fri, 10 Jan 2025 14:14:37 GMT
<
...binary data

Принцип работы

При получении запроса middleware сжатия проверяет HTTP-заголовок Accept-Encoding, чтобы определить подходящий алгоритм сжатия, учитывая, при этом, доступность требуемой функции и q-value (q-factor), если предоставлено несколько вариантов. Затем middleware сжимает тело ответа с помощью выбранного алгоритма и устанавливает HTTP-заголовок Content-Encoding соответствующим образом.

Если заголовок Accept-Encoding указывает неподдерживаемый сервером алгоритм, то middleware отвечает кодом состояния 406 Not Acceptable.

Полный пример можно посмотреть здесь

Last Updated:
Prev
Пользовательские Middleware
Next
Распаковка запросов