errserve 0.10.0

Servidor de páginas de error para Traefik que devuelve el código de error real
[package]
name = "errserve"
version = "0.10.0"
edition = "2024"
description = "Servidor de páginas de error para Traefik que devuelve el código de error real"
license = "MIT"
authors = ["Lorenzo Carbonell <lorenzo.carbonell.cerezo@gmail.com>"]
repository = "https://github.com/atareao/errserve"
readme = "README.md"
keywords = ["http-server", "error-pages", "traefik", "reverse-proxy", "axum"]
categories = ["command-line-utilities", "network-programming", "web-programming::http-server"]
exclude = ["/openspec", "/.github", "/AGENTS.md", "/cliff.toml", "/deny.toml", "/.justfile"]

# Versiones elegidas contra la caché local de `~/.cargo/registry` (rangos caret,
# sin fijar de memoria): axum 0.8.9, tokio 1.54.1, tower-http 0.6.11,
# tracing 0.1.44, tracing-subscriber 0.3.23, serde 1.0.229, serde_json 1.0.154,
# percent-encoding 2.3.2, tower 0.5.3 y http-body-util 0.1.5.
#
# `percent-encoding` ya estaba en el árbol de forma transitiva (vía `tower-http`,
# que lo usa para decodificar el path en `ServeDir`); se declara ahora como
# dependencia directa porque `src/path.rs` lo usa para normalizar el path con el
# **mismo** decodificador que el servidor de ficheros.
#
# Features añadidas por el change `release-hardening`, verificadas contra la
# caché local antes de fijarlas (el repo compila sin red, `cargo --offline`):
#
# - `tower-http/compression-gzip`: la capa de compresión gzip que pide el
#   requisito "La respuesta se comprime cuando el cliente la pide". La feature
#   arrastra `async-compression` (caché: 0.4.50) que, con su feature `gzip`,
#   arrastra a su vez `compression-codecs/gzip` -> `flate2` (caché: 1.1.10, con
#   backend `rust_backend`/`miniz_oxide`, sin `libz-sys` ni compilador de C).
#   No se añade `compression-full` ni otras codificaciones: solo gzip, que es
#   lo que la spec exige.
# - `tracing-subscriber/json`: la salida estructurada de `LOG_FORMAT=json`.
#   Depende solo de `serde_json`, que ya está en el árbol.
# - `flate2` en `[dev-dependencies]`: **no** por lo anterior, sino para que las
#   pruebas **descompriman** el cuerpo con gzip y lo comparen con el de la
#   respuesta en claro. Sin ella, una prueba solo podría mirar la cabecera
#   `Content-Encoding` y no que el cuerpo comprimido sea el de verdad; el mismo
#   `flate2` que usa el código en compilación normal evita divergencias entre lo
#   que el servidor comprime y lo que la prueba descomprime.

[dependencies]
axum = { version = "0.8", features = ["tokio"] }
tokio = { version = "1", features = ["full"] }
tower-http = { version = "0.6", features = ["fs", "trace", "compression-gzip"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
percent-encoding = "2"

[dev-dependencies]
tower = { version = "0.5", features = ["util"] }
http-body-util = "0.1"
flate2 = "1"