Use actix-web instead of hyper

O01eg
Mar 29, 2025, 8:33 PM
UTMFRRHQR4RXI4SJBHUUXPFJXQKOTD7LFT5X6NXD3INLXTCENILQC

Dependencies

Change contents

  • replacement in src/main.rs at line 7
    [6.43456][6.43456:43502]()
    use hyper::{Body, Request, Response, Server};
    [6.43456]
    [6.43502]
    use actix_web::{middleware, web, App, HttpRequest, HttpResponse, HttpServer};
  • replacement in src/main.rs at line 20
    [6.43702][6.43702:44025]()
    /// Return future with body converted to String
    async fn body_to_string(req: Request<Body>) -> Result<String, failure::Error> {
    let whole_body = hyper::body::to_bytes(req.into_body()).await?;
    std::str::from_utf8(&whole_body)
    .map(std::string::ToString::to_string)
    .map_err(std::convert::Into::into)
    [6.43702]
    [6.44025]
    async fn payload_to_string(payload: web::Payload) -> Result<String, failure::Error> {
    match payload.to_bytes_limited(4096).await {
    Ok(Ok(bytes)) => {
    let message = String::from_utf8(bytes.to_vec());
    match message {
    Ok(m) => Ok(m),
    Err(e) => Err(e.into()),
    }
    }
    Ok(Err(e)) => Err(failure::format_err!("{}", e)),
    Err(e) => Err(e.into()),
    }
  • replacement in src/main.rs at line 34
    [6.44028][6.44028:44102]()
    struct ServiceCmd {
    cmd_send: tokio::sync::mpsc::Sender<XmppCommand>,
    [6.44028]
    [6.44102]
    fn req_xmpp_to(req: &HttpRequest) -> Result<jid::Jid, failure::Error> {
    let xmpp_to_opt = req.headers().get("X-XMPP-To");
    let xmpp_to_res: Result<jid::Jid, failure::Error> = xmpp_to_opt.map_or_else(
    || Err(failure::format_err!("No X-XMPP-To header")),
    |xmpp_to| {
    std::str::from_utf8(xmpp_to.as_bytes())
    .map_err(std::convert::Into::into)
    .and_then(|s| std::str::FromStr::from_str(s).map_err(std::convert::Into::into))
    },
    );
    xmpp_to_res
  • replacement in src/main.rs at line 47
    [6.44105][6.44105:44366]()
    impl hyper::service::Service<Request<Body>> for ServiceCmd {
    type Response = Response<Body>;
    type Error = failure::Error;
    type Future = std::pin::Pin<
    Box<dyn std::future::Future<Output = Result<Self::Response, Self::Error>> + Send>,
    >;
    [6.44105]
    [6.44366]
    async fn ping(
    req: HttpRequest,
    data: web::Data<tokio::sync::mpsc::Sender<XmppCommand>>,
    ) -> HttpResponse {
    let xmpp_to_res = req_xmpp_to(&req);
  • replacement in src/main.rs at line 53
    [6.44367][6.44367:44532]()
    fn poll_ready(
    &mut self,
    _: &mut std::task::Context,
    ) -> std::task::Poll<Result<(), Self::Error>> {
    std::task::Poll::Ready(Ok(()))
    [6.44367]
    [6.44532]
    match xmpp_to_res {
    Ok(xmpp_to) => {
    info!("Got ping request");
    let cmd_send = data.clone();
    match cmd_send
    .send(XmppCommand::Ping {
    opt_xmpp_to: Some(xmpp_to),
    })
    .await
    {
    Ok(_) => HttpResponse::Ok().body("Accepted"),
    Err(e) => {
    error!("Cann't send ping command: {}", e);
    HttpResponse::BadRequest().body("Cann't send ping")
    }
    }
    }
    _ => HttpResponse::BadRequest().body("Cann't send ping, missing X-XMPP-To"),
  • edit in src/main.rs at line 72
    [6.44538]
    [6.44538]
    }
  • replacement in src/main.rs at line 74
    [6.44539][6.44539:44658](),[6.44658][5.4882:4967](),[5.4967][6.44752:44897](),[6.44752][6.44752:44897]()
    fn call(&mut self, req: Request<Body>) -> Self::Future {
    let xmpp_to_opt = req.headers().get("X-XMPP-To");
    let xmpp_to_res: Result<jid::Jid, failure::Error> = xmpp_to_opt.map_or_else(
    || Err(failure::format_err!("No X-XMPP-To header")),
    |xmpp_to| {
    std::str::from_utf8(xmpp_to.as_bytes())
    [6.44539]
    [6.44897]
    async fn index(
    req: HttpRequest,
    data: web::Data<tokio::sync::mpsc::Sender<XmppCommand>>,
    payload: web::Payload,
    ) -> HttpResponse {
    let xmpp_to_res = req_xmpp_to(&req);
    let xmpp_muc_opt = req
    .headers()
    .get("X-XMPP-Muc")
    .map(|h| h.to_str().map(std::string::ToString::to_string));
    let xmpp_pres_opt = req.headers().get("X-XMPP-Presence");
    let xmpp_pres_res: Result<xmpp_parsers::presence::Show, failure::Error> = xmpp_pres_opt
    .map_or_else(
    || Err(failure::format_err!("No X-XMPP-Presence header")),
    |show| {
    std::str::from_utf8(show.as_bytes())
  • replacement in src/main.rs at line 93
    [6.44952][6.44952:45052]()
    .and_then(|s| std::str::FromStr::from_str(s).map_err(std::convert::Into::into))
    [6.44952]
    [6.45052]
    .and_then(|s| {
    std::str::FromStr::from_str(s)
    .map_err(|e| failure::format_err!("Incorrect presence {}", e))
    })
  • replacement in src/main.rs at line 100
    [6.45079][6.45079:45236]()
    let xmpp_muc_opt = req
    .headers()
    .get("X-XMPP-Muc")
    .map(|h| h.to_str().map(std::string::ToString::to_string));
    [6.45079]
    [6.45236]
    match (xmpp_muc_opt, xmpp_to_res, xmpp_pres_res) {
    (None, Err(err), Err(err2)) => {
    warn!("Unknown destination: {}", err);
    warn!("Unknown destination2: {}", err2);
  • replacement in src/main.rs at line 105
    [6.45237][6.45237:45862]()
    let xmpp_pres_opt = req.headers().get("X-XMPP-Presence");
    let xmpp_pres_res: Result<xmpp_parsers::presence::Show, failure::Error> = xmpp_pres_opt
    .map_or_else(
    || Err(failure::format_err!("No X-XMPP-Presence header")),
    |show| {
    std::str::from_utf8(show.as_bytes())
    .map_err(std::convert::Into::into)
    .and_then(|s| {
    std::str::FromStr::from_str(s)
    .map_err(|e| failure::format_err!("Incorrect presence {}", e))
    })
    [6.45237]
    [6.45862]
    HttpResponse::BadRequest().body(format!(
    "Unknown destination: {}\nUnknown destination2: {}",
    err, err2,
    ))
    }
    (None, _, Ok(show)) => {
    info!("Got presence request. Reading body...");
    let cmd_send = data.clone();
    match payload_to_string(payload).await {
    Ok(message) => match cmd_send.send(XmppCommand::Presence { show, message }).await {
    Ok(_) => HttpResponse::Ok().body("Accepted".to_string()),
    Err(e) => {
    error!("Cann't send presence command: {}", e);
    HttpResponse::BadRequest().body("Cann't get presence text")
    }
  • replacement in src/main.rs at line 121
    [6.45881][6.45881:46531]()
    );
    match (xmpp_muc_opt, xmpp_to_res, xmpp_pres_res) {
    (None, Err(err), Err(err2)) => {
    warn!("Unknown destination: {}", err);
    warn!("Unknown destination2: {}", err2);
    Box::pin(async move {
    Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from(format!(
    "Unknown destination: {}\nUnknown destination2: {}",
    err, err2,
    )))
    .map_err(std::convert::Into::into)
    })
    [6.45881]
    [6.46531]
    Err(_) => HttpResponse::BadRequest().body("Cann't get presence text"),
  • replacement in src/main.rs at line 123
    [6.46545][6.46545:46646](),[6.46646][6.0:54](),[6.54][6.46704:46995](),[6.46704][6.46704:46995](),[6.46995][4.0:78](),[4.78][6.47070:47405](),[6.47070][6.47070:47405](),[6.47405][4.79:177](),[4.177][6.47500:47665](),[6.47500][6.47500:47665](),[6.47665][2.686:740](),[2.740][6.47719:47787](),[6.47719][6.47719:47787](),[6.47787][4.178:264](),[4.264][6.0:64](),[6.47870][6.0:64]()
    (None, _, Ok(show)) => {
    info!("Got presence request. Reading body...");
    let cmd_send = self.cmd_send.clone();
    Box::pin(async move {
    match body_to_string(req).await {
    Ok(message) => {
    match cmd_send.send(XmppCommand::Presence { show, message }).await {
    Ok(_) => Response::builder()
    .body(Body::from("Accepted".to_string()))
    .map_err(std::convert::Into::into),
    Err(e) => {
    error!("Cann't send presence command: {}", e);
    Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from("Cann't get presence text".to_string()))
    .map_err(std::convert::Into::into)
    }
    }
    }
    Err(_) => Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from("Cann't get presence text".to_string()))
    .map_err(std::convert::Into::into),
    [6.46545]
    [6.64]
    }
    (None, Ok(xmpp_to), _) => {
    info!("Got message request. Reading body...");
    let cmd_send = data.clone();
    match payload_to_string(payload).await {
    Ok(message) => match cmd_send.send(XmppCommand::Chat { xmpp_to, message }).await {
    Ok(_) => HttpResponse::Ok().body("Accepted"),
    Err(e) => {
    error!("Cann't send message command: {}", e);
    HttpResponse::BadRequest().body("Cann't get message text")
  • replacement in src/main.rs at line 134
    [6.86][6.86:105]()
    })
    [6.86]
    [6.105]
    },
    Err(_) => HttpResponse::BadRequest().body("Cann't get message text"),
  • replacement in src/main.rs at line 137
    [6.119][6.119:159](),[6.159][6.0:96](),[6.96][6.55:113](),[6.113][6.158:502](),[6.158][6.158:502](),[6.502][4.265:339](),[4.339][6.573:884](),[6.573][6.573:884](),[6.884][4.340:426](),[4.426][6.967:1209](),[6.967][6.967:1209](),[6.1209][6.114:172](),[6.172][6.1271:1581](),[6.1271][6.1271:1581](),[6.1581][4.427:509](),[4.509][6.1660:2014](),[6.1660][6.1660:2014](),[6.2014][4.510:611](),[4.611][6.2112:2229](),[6.2112][6.2112:2229](),[6.2229][6.1148:1212](),[6.1148][6.1148:1212](),[6.1212][3.326:384](),[3.384][6.2288:2360](),[6.2288][6.2288:2360](),[6.2360][4.612:701](),[4.701][6.2446:2514](),[6.2446][6.2446:2514](),[6.2514][6.1212:1238](),[6.1212][6.1212:1238](),[6.1238][6.2515:2556](),[6.2556][6.47975:47989](),[6.47975][6.47975:47989](),[6.47989][6.1443:1561](),[6.1561][6.173:227](),[6.227][6.1619:2161](),[6.1619][6.1619:2161](),[6.2161][4.702:780](),[4.780][6.2236:2576](),[6.2236][6.2236:2576](),[6.2576][4.781:971](),[4.971][6.2676:2815](),[6.2676][6.2676:2815]()
    (None, Ok(xmpp_to), _) => {
    if req.uri().path() == "/ping" {
    info!("Got ping request");
    let cmd_send = self.cmd_send.clone();
    Box::pin(async move {
    match cmd_send
    .send(XmppCommand::Ping {
    opt_xmpp_to: Some(xmpp_to),
    })
    .await
    {
    Ok(_) => Response::builder()
    .body(Body::from("Accepted".to_string()))
    .map_err(std::convert::Into::into),
    Err(e) => {
    error!("Cann't send ping command: {}", e);
    Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from("Cann't send ping".to_string()))
    .map_err(std::convert::Into::into)
    }
    }
    })
    } else {
    info!("Got message request. Reading body...");
    let cmd_send = self.cmd_send.clone();
    Box::pin(async move {
    match body_to_string(req).await {
    Ok(message) => {
    match cmd_send.send(XmppCommand::Chat { xmpp_to, message }).await {
    Ok(_) => Response::builder()
    .body(Body::from("Accepted".to_string()))
    .map_err(std::convert::Into::into),
    Err(e) => {
    error!("Cann't send message command: {}", e);
    Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from("Cann't get message text".to_string()))
    .map_err(std::convert::Into::into)
    }
    }
    }
    Err(_) => Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from("Cann't get message text".to_string()))
    .map_err(std::convert::Into::into),
    }
    })
    }
    }
    (Some(Ok(muc_id)), _, Ok(show)) => {
    info!("Got chat presence request. Reading body...");
    let cmd_send = self.cmd_send.clone();
    Box::pin(async move {
    match body_to_string(req).await {
    Ok(message) => {
    match cmd_send
    .send(XmppCommand::ChatroomPresence {
    muc_id,
    show,
    message,
    })
    .await
    {
    Ok(_) => Response::builder()
    .body(Body::from("Accepted".to_string()))
    .map_err(std::convert::Into::into),
    Err(e) => {
    error!("Cann't send chat presence command: {}", e);
    Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from(
    "Cann't get chat presence text".to_string(),
    ))
    .map_err(std::convert::Into::into)
    }
    }
    [6.119]
    [6.2815]
    }
    (Some(Ok(muc_id)), _, Ok(show)) => {
    info!("Got chat presence request. Reading body...");
    let cmd_send = data.clone();
    match payload_to_string(payload).await {
    Ok(message) => {
    match cmd_send
    .send(XmppCommand::ChatroomPresence {
    muc_id,
    show,
    message,
    })
    .await
    {
    Ok(_) => HttpResponse::Ok().body("Accepted"),
    Err(e) => {
    error!("Cann't send chat presence command: {}", e);
    HttpResponse::BadRequest().body("Cann't get chat presence text")
  • edit in src/main.rs at line 156
    [6.2841][3.385:439](),[3.439][6.2895:2963](),[6.2895][6.2895:2963](),[6.2963][4.972:1063](),[4.1063][6.3051:3115](),[6.3051][6.3051:3115]()
    Err(_) => Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from("Cann't get chat presence text".to_string()))
    .map_err(std::convert::Into::into),
  • replacement in src/main.rs at line 157
    [6.3137][6.3137:3156]()
    })
    [6.3137]
    [6.3156]
    }
    Err(_) => HttpResponse::BadRequest().body("Cann't get chat presence text"),
  • replacement in src/main.rs at line 160
    [6.3170][6.3170:3280](),[6.3280][6.228:282](),[6.282][6.3338:3725](),[6.3338][6.3338:3725](),[6.3725][4.1064:1142](),[4.1142][6.3800:4139](),[6.3800][6.3800:4139](),[6.4139][4.1143:1332](),[4.1332][6.4238:4377](),[6.4238][6.4238:4377]()
    (Some(Ok(muc_id)), _, _) => {
    info!("Got chat message request. Reading body...");
    let cmd_send = self.cmd_send.clone();
    Box::pin(async move {
    match body_to_string(req).await {
    Ok(message) => {
    match cmd_send
    .send(XmppCommand::Chatroom { muc_id, message })
    .await
    {
    Ok(_) => Response::builder()
    .body(Body::from("Accepted".to_string()))
    .map_err(std::convert::Into::into),
    Err(e) => {
    error!("Cann't send chat message command: {}", e);
    Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from(
    "Cann't get chat message text".to_string(),
    ))
    .map_err(std::convert::Into::into)
    }
    }
    [6.3170]
    [6.4377]
    }
    (Some(Ok(muc_id)), _, _) => {
    info!("Got chat message request. Reading body...");
    let cmd_send = data.clone();
    match payload_to_string(payload).await {
    Ok(message) => {
    match cmd_send
    .send(XmppCommand::Chatroom { muc_id, message })
    .await
    {
    Ok(_) => HttpResponse::Ok().body("Accepted"),
    Err(e) => {
    error!("Cann't send chat message command: {}", e);
    HttpResponse::BadRequest().body("Cann't get chat message text")
  • edit in src/main.rs at line 175
    [6.4403][3.440:494](),[3.494][6.4457:4525](),[6.4457][6.4457:4525](),[6.4525][4.1333:1423](),[4.1423][6.4612:4676](),[6.4612][6.4612:4676]()
    Err(_) => Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from("Cann't get chat message text".to_string()))
    .map_err(std::convert::Into::into),
  • replacement in src/main.rs at line 176
    [6.4698][6.4698:5130]()
    })
    }
    (Some(Err(err)), _, _) => {
    warn!("Unknown destination: {}", err);
    Box::pin(async move {
    Response::builder()
    .status(hyper::StatusCode::BAD_REQUEST)
    .body(Body::from(format!("Unknown destination: {}", err,)))
    .map_err(std::convert::Into::into)
    })
    [6.4698]
    [6.5130]
    }
    Err(_) => HttpResponse::BadRequest().body("Cann't get chat message text"),
  • replacement in src/main.rs at line 180
    [6.49118][6.49118:49810]()
    }
    }
    struct MakeServiceCmd {
    cmd_send: tokio::sync::mpsc::Sender<XmppCommand>,
    }
    impl<T> hyper::service::Service<T> for MakeServiceCmd {
    type Response = ServiceCmd;
    type Error = failure::Error;
    type Future = std::pin::Pin<
    Box<dyn std::future::Future<Output = Result<Self::Response, Self::Error>> + Send>,
    >;
    fn poll_ready(
    &mut self,
    _: &mut std::task::Context,
    ) -> std::task::Poll<Result<(), Self::Error>> {
    std::task::Poll::Ready(Ok(()))
    }
    fn call(&mut self, _: T) -> Self::Future {
    let cmd_send = self.cmd_send.clone();
    let fut = async move { Ok(ServiceCmd { cmd_send }) };
    Box::pin(fut)
    [6.49118]
    [6.49810]
    (Some(Err(err)), _, _) => {
    warn!("Unknown destination: {}", err);
    HttpResponse::BadRequest().body(format!("Unknown destination: {}", err,))
    }
  • replacement in src/main.rs at line 218
    [6.50652][6.50652:50833]()
    let http_server = Server::bind(&config.http)
    .serve(MakeServiceCmd {
    cmd_send: cmd_send.clone(),
    })
    .with_graceful_shutdown(ctrl_c.clone());
    [6.50652]
    [6.50833]
    let http_cmd_send = cmd_send.clone();
    let http_server = HttpServer::new(move || {
    let logger =
    middleware::Logger::new("%{r}a \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\" %T");
    App::new()
    // Enable the logger.
    .wrap(logger)
    .app_data(web::Data::new(http_cmd_send.clone()))
    .route("/ping", web::get().to(ping))
    .route("/", web::post().to(index))
    });
  • replacement in src/main.rs at line 278
    [6.52313][6.5145:5169]()
    http_server.await?;
    [6.52313]
    [6.52336]
    http_server.bind(&config.http)?.run().await?;
  • replacement in Cargo.toml at line 30
    [6.69585][6.1413:1471]()
    [dependencies.hyper]
    version = "0.14"
    features = ["full"]
    [6.69585]
    [6.69756]
    [dependencies.actix-web]
    version = "4.2.1"
  • edit in Cargo.lock at line 4
    [6.4752]
    [6.391]
    [[package]]
    name = "actix-codec"
    version = "0.5.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a"
    dependencies = [
    "bitflags 2.9.0",
    "bytes",
    "futures-core",
    "futures-sink",
    "memchr",
    "pin-project-lite",
    "tokio",
    "tokio-util",
    "tracing",
    ]
    [[package]]
    name = "actix-http"
    version = "3.10.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "0fa882656b67966045e4152c634051e70346939fced7117d5f0b52146a7c74c9"
    dependencies = [
    "actix-codec",
    "actix-rt",
    "actix-service",
    "actix-utils",
    "base64",
    "bitflags 2.9.0",
    "brotli",
    "bytes",
    "bytestring",
    "derive_more",
    "encoding_rs",
    "flate2",
    "foldhash",
    "futures-core",
    "h2",
    "http",
    "httparse",
    "httpdate",
    "itoa",
    "language-tags",
    "local-channel",
    "mime",
    "percent-encoding",
    "pin-project-lite",
    "rand 0.9.0",
    "sha1",
    "smallvec",
    "tokio",
    "tokio-util",
    "tracing",
    "zstd",
    ]
    [[package]]
    name = "actix-macros"
    version = "0.2.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
    dependencies = [
    "quote",
    "syn 2.0.100",
    ]
    [[package]]
    name = "actix-router"
    version = "0.5.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8"
    dependencies = [
    "bytestring",
    "cfg-if",
    "http",
    "regex",
    "regex-lite",
    "serde",
    "tracing",
    ]
    [[package]]
    name = "actix-rt"
    version = "2.10.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208"
    dependencies = [
    "futures-core",
    "tokio",
    ]
    [[package]]
    name = "actix-server"
    version = "2.5.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "6398974fd4284f4768af07965701efbbb5fdc0616bff20cade1bb14b77675e24"
    dependencies = [
    "actix-rt",
    "actix-service",
    "actix-utils",
    "futures-core",
    "futures-util",
    "mio",
    "socket2",
    "tokio",
    "tracing",
    ]
    [[package]]
    name = "actix-service"
    version = "2.0.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f"
    dependencies = [
    "futures-core",
    "pin-project-lite",
    ]
    [[package]]
    name = "actix-utils"
    version = "3.0.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8"
    dependencies = [
    "local-waker",
    "pin-project-lite",
    ]
    [[package]]
    name = "actix-web"
    version = "4.10.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "f2e3b15b3dc6c6ed996e4032389e9849d4ab002b1e92fbfe85b5f307d1479b4d"
    dependencies = [
    "actix-codec",
    "actix-http",
    "actix-macros",
    "actix-router",
    "actix-rt",
    "actix-server",
    "actix-service",
    "actix-utils",
    "actix-web-codegen",
    "bytes",
    "bytestring",
    "cfg-if",
    "cookie",
    "derive_more",
    "encoding_rs",
    "foldhash",
    "futures-core",
    "futures-util",
    "impl-more",
    "itoa",
    "language-tags",
    "log",
    "mime",
    "once_cell",
    "pin-project-lite",
    "regex",
    "regex-lite",
    "serde",
    "serde_json",
    "serde_urlencoded",
    "smallvec",
    "socket2",
    "time",
    "tracing",
    "url",
    ]
    [[package]]
    name = "actix-web-codegen"
    version = "4.3.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8"
    dependencies = [
    "actix-router",
    "proc-macro2",
    "quote",
    "syn 2.0.100",
    ]
  • edit in Cargo.lock at line 210
    [6.70499]
    [6.70729]
    ]
    [[package]]
    name = "alloc-no-stdlib"
    version = "2.0.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
    [[package]]
    name = "alloc-stdlib"
    version = "0.2.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
    dependencies = [
    "alloc-no-stdlib",
  • edit in Cargo.lock at line 353
    [6.74196]
    [6.74196]
    name = "brotli"
    version = "7.0.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd"
    dependencies = [
    "alloc-no-stdlib",
    "alloc-stdlib",
    "brotli-decompressor",
    ]
    [[package]]
    name = "brotli-decompressor"
    version = "4.0.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37"
    dependencies = [
    "alloc-no-stdlib",
    "alloc-stdlib",
    ]
    [[package]]
  • edit in Cargo.lock at line 378
    [6.6135]
    [5.6290]
    [[package]]
    name = "bytestring"
    version = "1.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f"
    dependencies = [
    "bytes",
    ]
  • edit in Cargo.lock at line 490
    [6.76015]
    [6.1484]
    name = "cookie"
    version = "0.16.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb"
    dependencies = [
    "percent-encoding",
    "time",
    "version_check",
    ]
    [[package]]
  • edit in Cargo.lock at line 510
    [6.76209]
    [6.1365]
    name = "crc32fast"
    version = "1.4.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
    dependencies = [
    "cfg-if",
    ]
    [[package]]
  • edit in Cargo.lock at line 533
    [6.6894]
    [6.76940]
    [[package]]
    name = "deranged"
    version = "0.4.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058"
    dependencies = [
    "powerfmt",
    ]
    [[package]]
    name = "derive_more"
    version = "2.0.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678"
    dependencies = [
    "derive_more-impl",
    ]
  • edit in Cargo.lock at line 553
    [6.76953]
    [6.76953]
    name = "derive_more-impl"
    version = "2.0.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn 2.0.100",
    "unicode-xid",
    ]
    [[package]]
  • edit in Cargo.lock at line 599
    [5.7708]
    [6.77187]
    name = "encoding_rs"
    version = "0.8.35"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
    dependencies = [
    "cfg-if",
    ]
    [[package]]
  • edit in Cargo.lock at line 668
    [6.7891]
    [6.78210]
    ]
    [[package]]
    name = "flate2"
    version = "1.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc"
    dependencies = [
    "crc32fast",
    "miniz_oxide",
  • edit in Cargo.lock at line 685
    [6.78592]
    [6.2120]
    [[package]]
    name = "foldhash"
    version = "0.1.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
  • replacement in Cargo.lock at line 814
    [6.3436][5.8017:8026]()
    "wasi",
    [6.3436]
    [6.82756]
    "wasi 0.11.0+wasi-snapshot-preview1",
    ]
    [[package]]
    name = "getrandom"
    version = "0.3.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0"
    dependencies = [
    "cfg-if",
    "libc",
    "r-efi",
    "wasi 0.14.2+wasi-0.2.4",
  • replacement in Cargo.lock at line 903
    [5.8664][5.8664:8673]()
    "rand",
    [5.8664]
    [5.8673]
    "rand 0.8.5",
  • replacement in Cargo.lock at line 924
    [5.9052][5.9052:9061]()
    "rand",
    [5.9052]
    [5.9061]
    "rand 0.8.5",
  • edit in Cargo.lock at line 970
    [6.2164][6.84937:84971](),[6.3515][6.84937:84971](),[6.84937][6.84937:84971](),[6.84971][6.10363:10381](),[6.2183][6.84989:85054](),[6.3534][6.84989:85054](),[6.3573][6.84989:85054](),[6.4181][6.84989:85054](),[6.10381][6.84989:85054](),[6.84989][6.84989:85054](),[6.85054][6.10382:10460](),[6.2262][6.85132:85168](),[6.3613][6.85132:85168](),[6.3652][6.85132:85168](),[6.4260][6.85132:85168](),[6.10460][6.85132:85168](),[6.85132][6.85132:85168](),[6.85168][6.3653:3674]()
    ]
    [[package]]
    name = "http-body"
    version = "0.4.6"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
    dependencies = [
    "bytes",
    "http",
    "pin-project-lite",
  • edit in Cargo.lock at line 989
    [6.1672][6.85782:85810](),[6.4456][6.85782:85810](),[6.10755][6.85782:85810](),[6.85782][6.85782:85810](),[6.85810][6.10756:10776](),[6.2381][6.85829:85894](),[6.3533][6.85829:85894](),[6.3732][6.85829:85894](),[6.3891][6.85829:85894](),[6.4476][6.85829:85894](),[6.10776][6.85829:85894](),[6.85829][6.85829:85894](),[6.85894][6.10777:10855](),[6.2460][6.85972:86109](),[6.3612][6.85972:86109](),[6.3811][6.85972:86109](),[6.3970][6.85972:86109](),[6.4555][6.85972:86109](),[6.10855][6.85972:86109](),[6.85972][6.85972:86109](),[6.86109][6.3812:3821](),[6.2476][6.3971:3992](),[6.3821][6.3971:3992](),[6.86118][6.3971:3992](),[6.3992][6.10856:10868](),[6.656][6.86146:86195](),[6.1600][6.86146:86195](),[6.3840][6.86146:86195](),[6.4010][6.86146:86195](),[6.10868][6.86146:86195](),[6.86146][6.86146:86195](),[6.86195][6.10869:10871]()
    [[package]]
    name = "hyper"
    version = "0.14.32"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"
    dependencies = [
    "bytes",
    "futures-channel",
    "futures-core",
    "futures-util",
    "h2",
    "http",
    "http-body",
    "httparse",
    "httpdate",
    "itoa",
    "pin-project-lite",
    "socket2",
    "tokio",
    "tower-service",
    "tracing",
    "want",
    ]
  • edit in Cargo.lock at line 1128
    [6.14272]
    [6.14272]
    [[package]]
    name = "impl-more"
    version = "0.1.9"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2"
  • edit in Cargo.lock at line 1218
    [6.88037]
    [6.88037]
    name = "language-tags"
    version = "0.3.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388"
    [[package]]
  • edit in Cargo.lock at line 1268
    [6.15738]
    [6.5496]
    [[package]]
    name = "local-channel"
    version = "0.1.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8"
    dependencies = [
    "futures-core",
    "futures-sink",
    "local-waker",
    ]
  • edit in Cargo.lock at line 1281
    [6.5509]
    [6.5509]
    name = "local-waker"
    version = "0.1.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487"
    [[package]]
  • edit in Cargo.lock at line 1318
    [6.90174]
    [6.90174]
    name = "mime"
    version = "0.3.17"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
    [[package]]
  • replacement in Cargo.lock at line 1354
    [6.90876][5.10764:10773]()
    "wasi",
    [6.90876]
    [6.16480]
    "log",
    "wasi 0.11.0+wasi-snapshot-preview1",
  • edit in Cargo.lock at line 1368
    [6.91800]
    [6.91800]
    [[package]]
    name = "num-conv"
    version = "0.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
  • edit in Cargo.lock at line 1474
    [6.96761]
    [6.96956]
    [[package]]
    name = "pkg-config"
    version = "0.3.32"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
    [[package]]
    name = "powerfmt"
    version = "0.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
  • edit in Cargo.lock at line 1525
    [6.98638]
    [6.98638]
    name = "r-efi"
    version = "5.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
    [[package]]
  • replacement in Cargo.lock at line 1537
    [6.98853][6.6958:6988]()
    "rand_chacha",
    "rand_core",
    [6.98853]
    [6.98914]
    "rand_chacha 0.3.1",
    "rand_core 0.6.4",
    ]
    [[package]]
    name = "rand"
    version = "0.9.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
    dependencies = [
    "rand_chacha 0.9.0",
    "rand_core 0.9.3",
    "zerocopy",
  • replacement in Cargo.lock at line 1559
    [6.8836][6.6989:7003]()
    "rand_core",
    [6.8836]
    [6.99395]
    "rand_core 0.6.4",
    ]
    [[package]]
    name = "rand_chacha"
    version = "0.9.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
    dependencies = [
    "ppv-lite86",
    "rand_core 0.9.3",
  • edit in Cargo.lock at line 1577
    [6.18895]
    [6.100536]
    dependencies = [
    "getrandom 0.2.15",
    ]
    [[package]]
    name = "rand_core"
    version = "0.9.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
  • replacement in Cargo.lock at line 1587
    [6.100553][5.11166:11180]()
    "getrandom",
    [6.100553]
    [6.100573]
    "getrandom 0.3.2",
  • edit in Cargo.lock at line 1623
    [6.101482]
    [6.19342]
    name = "regex-lite"
    version = "0.1.6"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
    [[package]]
  • replacement in Cargo.lock at line 1651
    [5.11393][5.11393:11407]()
    "getrandom",
    [5.11393]
    [5.11407]
    "getrandom 0.2.15",
  • replacement in Cargo.lock at line 1755
    [5.13103][5.13103:13117]()
    "getrandom",
    [5.13103]
    [6.102555]
    "getrandom 0.2.15",
  • edit in Cargo.lock at line 1772
    [6.103509]
    [6.103509]
    "actix-web",
  • edit in Cargo.lock at line 1777
    [6.103562][6.103562:103572]()
    "hyper",
  • edit in Cargo.lock at line 1808
    [6.21198]
    [6.8597]
    ]
    [[package]]
    name = "serde_json"
    version = "1.0.140"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
    dependencies = [
    "itoa",
    "memchr",
    "ryu",
    "serde",
  • edit in Cargo.lock at line 1827
    [5.13302]
    [5.13302]
    dependencies = [
    "serde",
    ]
    [[package]]
    name = "serde_urlencoded"
    version = "0.7.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
  • edit in Cargo.lock at line 1837
    [5.13319]
    [5.13319]
    "form_urlencoded",
    "itoa",
    "ryu",
  • edit in Cargo.lock at line 2028
    [6.23942]
    [6.23942]
    ]
    [[package]]
    name = "time"
    version = "0.3.41"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
    dependencies = [
    "deranged",
    "itoa",
    "num-conv",
    "powerfmt",
    "serde",
    "time-core",
    "time-macros",
    ]
    [[package]]
    name = "time-core"
    version = "0.1.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
    [[package]]
    name = "time-macros"
    version = "0.2.22"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49"
    dependencies = [
    "num-conv",
    "time-core",
  • edit in Cargo.lock at line 2096
    [6.111048]
    [6.12853]
    "parking_lot",
  • replacement in Cargo.lock at line 2161
    [6.112171][6.25052:25061]()
    "rand",
    [6.11357]
    [6.11358]
    "rand 0.8.5",
  • edit in Cargo.lock at line 2207
    [6.112524][6.112524:112547](),[6.112547][6.25177:25195](),[6.11507][6.112565:112630](),[6.13829][6.112565:112630](),[6.25195][6.112565:112630](),[6.112565][6.112565:112630](),[6.112630][6.25196:25274](),[6.11586][6.112708:112721](),[6.13908][6.112708:112721](),[6.25274][6.112708:112721](),[6.112708][6.112708:112721]()
    name = "tower-service"
    version = "0.3.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
    [[package]]
  • edit in Cargo.lock at line 2212
    [6.112917]
    [6.14019]
    "log",
  • edit in Cargo.lock at line 2239
    [6.113970][6.113970:113988](),[6.113988][6.25986:26004](),[6.26004][6.114006:114071](),[6.114006][6.114006:114071](),[6.114071][6.26005:26083](),[6.26083][6.114149:114162](),[6.114149][6.114149:114162]()
    name = "try-lock"
    version = "0.2.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
    [[package]]
  • replacement in Cargo.lock at line 2313
    [6.116429][6.116429:116443](),[6.116443][6.27381:27399]()
    name = "want"
    version = "0.3.1"
    [6.116429]
    [6.116461]
    name = "wasi"
    version = "0.11.0+wasi-snapshot-preview1"
  • replacement in Cargo.lock at line 2316
    [6.116526][6.27400:27478](),[6.27478][6.116604:116621](),[6.116604][6.116604:116621](),[6.116629][6.116629:116644]()
    checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
    dependencies = [
    "try-lock",
    ]
    [6.116526]
    [6.116855]
    checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
  • replacement in Cargo.lock at line 2320
    [6.116882][6.12446:12488]()
    version = "0.11.0+wasi-snapshot-preview1"
    [6.116882]
    [6.116924]
    version = "0.14.2+wasi-0.2.4"
  • replacement in Cargo.lock at line 2322
    [6.116989][6.12489:12567]()
    checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
    [6.116989]
    [6.117067]
    checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
    dependencies = [
    "wit-bindgen-rt",
    ]
  • edit in Cargo.lock at line 2569
    [5.15184]
    [6.119297]
    ]
    [[package]]
    name = "wit-bindgen-rt"
    version = "0.39.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
    dependencies = [
    "bitflags 2.9.0",
  • edit in Cargo.lock at line 2727
    [6.35489]
    [[package]]
    name = "zstd"
    version = "0.13.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
    dependencies = [
    "zstd-safe",
    ]
    [[package]]
    name = "zstd-safe"
    version = "7.2.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d"
    dependencies = [
    "zstd-sys",
    ]
    [[package]]
    name = "zstd-sys"
    version = "2.0.15+zstd.1.5.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237"
    dependencies = [
    "cc",
    "pkg-config",
    ]