4 releases (2 breaking)

0.3.0 Nov 23, 2023
0.2.0 Feb 1, 2023
0.1.1 Sep 29, 2022
0.1.0 Sep 29, 2022

#1026 in HTTP server

Download history 12/week @ 2023-12-07 18/week @ 2023-12-14 7/week @ 2023-12-21 40/week @ 2024-01-11 23/week @ 2024-01-18 7/week @ 2024-01-25 4/week @ 2024-02-01 13/week @ 2024-02-08 24/week @ 2024-02-15 37/week @ 2024-02-22 30/week @ 2024-02-29 32/week @ 2024-03-07 57/week @ 2024-03-14 31/week @ 2024-03-21

153 downloads per month
Used in unleash-edge

MIT license

15KB
274 lines

ETag middleware for Actix web

To use

use actix_web::{web, App, HttpServer, HttpResponse, Error};
use actix_middleware_etag::{Etag};
#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(move ||
            App::new()
            // Add etag headers to your actix application. Calculating the hash of your GET bodies and putting the base64 hash in the ETag header
            .wrap(Etag::default())
                ...
        .bind(("127.0.0.1", 8080))?
        .run()
        .await
}

This will hash all bodies for GET requests and base64 encode the hash as a weak ETag header in the response


lib.rs:

Actix Middleware - ETag

To avoid sending unnecessary bodies downstream, this middleware handles comparing If-None-Match headers to the calculated hash of the body of the GET request. Inspired by Node's express framework and how it does ETag calculation, this middleware behaves in a similar fashion.

First hash the resulting body, then base64 encode the hash and set this as the ETag header for the GET request.

This does not save CPU resources on server side, since the body is still being calculated.

Beware: This middleware does not look at headers, so if you need to refresh your headers even if body is exactly the same, use something else (or better yet, add a PR on this repo adding a sane way to adhere to headers as well)

Dependencies

~17–31MB
~537K SLoC