Распаковка запросов
Аналогично сжатию, Волга предоставляет функцию middleware, которая распаковывает тела HTTP-запросов на основе заголовка Content-Encoding
. В настоящее время Волга поддерживает четыре алгоритма распаковки: Brotli, Gzip, Deflate и Zstandard.
Включение распаковки
Чтобы включить распаковку запросов, убедитесь, что вы включили необходимую функцию в Cargo.toml
. Если вы не используете набор функций full
, вы можете отдельно подключить функцию decompression-full
делающую доступными все алгоритмы распаковки:
[dependencies]
volga = { version = "0.4.6", features = ["decompression-full"] }
Если вам нужны определенные алгоритмы, вы можете указать их явно:
[dependencies]
volga = { version = "0.4.6", features = ["decompression-brotli", "decompression-gzip"] }
Пример использования
Чтобы использовать распаковку в вашем приложении, используйте метод use_decompression()
в вашем main.rs
:
use volga::{App, ok};
#[tokio::main]
async fn main() -> std::io::Result<()> {
let mut app = App::new();
// Подключает middleware распаковывающий запросы
app.use_decompression();
app.map_get("/hello", || async {
ok!("Hello, World!")
});
app.run().await
}
Затем вы можете проверить это с помощью команды curl
, предварительно создав и упаковав файл users.json.gz
, который вы можете сделать из ответа примера предыдущей темы: Сжатие ответов:
curl -v -X POST --location 'http://127.0.0.1:7878/users' \
-H "Content-Type: application/json" \
-H "Content-Encoding: gzip" \
--compressed \
--data-binary users.json.gz
Принцип работы
При получении запроса middleware распаковки проверяет HTTP-заголовок Content-Encoding
, чтобы определить алгоритм сжатия, затем обертывает поток тела запроса в соответствующий поток распаковки и удаляет HTTP-заголовок Content-Encoding
, указывая, что тело запроса больше не сжато. Если заголовок Content-Encoding
не указан, то middleware игнорирует этот запрос и оставляет тело как есть.
Если заголовок Content-Encoding
указывает на неподдерживаемый алгоритм, то middleware отвечает кодом состояния 415 Unsupported Media Type
.
Полный пример можно посмотреть здесь