Use actix-web instead of hyper
Dependencies
- [2]
EVIOKGS2Don''t break threads and channel after disconnection - [3]
T5VMNBHRFix other warnings - [4]
3EKAR2UJClean up some clippy warnings - [5]
OJ4HP746Update dependencies - [6]
BBX3ELGVUpdate dependencies - [7]
YCYYN7MFUpdate dependencies - [8]
WXPEN4YCUpdate dependencies - [9]
K7XUYBRZUpdate dependencies and format - [10]
PO3H34B6Update dependencies - [11]
HTJ7H7Z6Update dependencies and format - [12]
VXJOXN2OUpdate dependencies - [13]
MEXG7XQMUpdate dependencies - [14]
MKEEMMX7Ping and check timeouts in different phases - [15]
GVI6M6SCSend ping to custom jid - [16]
OX5ZPQRFUpdate tokio to 1.* - [17]
RNQTHBRIAccept all previous HTTP API - [18]
TGO4TIWUFix README - [19]
BXD2CASXRemove repository - [20]
S7A7LHUNFix some warnings - [21]
4XX74XB3Update xmpp-parsers to 0.20
Change contents
- replacement in src/main.rs at line 7
use hyper::{Body, Request, Response, Server};use actix_web::{middleware, web, App, HttpRequest, HttpResponse, HttpServer}; - replacement in src/main.rs at line 20
/// Return future with body converted to Stringasync 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)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
struct ServiceCmd {cmd_send: tokio::sync::mpsc::Sender<XmppCommand>,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
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>,>;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
fn poll_ready(&mut self,_: &mut std::task::Context,) -> std::task::Poll<Result<(), Self::Error>> {std::task::Poll::Ready(Ok(()))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
} - 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())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
.and_then(|s| std::str::FromStr::from_str(s).map_err(std::convert::Into::into)).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
let xmpp_muc_opt = req.headers().get("X-XMPP-Muc").map(|h| h.to_str().map(std::string::ToString::to_string));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
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))})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
);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)})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),}(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
})},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)}}}(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
})}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)}}}(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
})}(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)})}Err(_) => HttpResponse::BadRequest().body("Cann't get chat message text"), - replacement in src/main.rs at line 180
}}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)(Some(Err(err)), _, _) => {warn!("Unknown destination: {}", err);HttpResponse::BadRequest().body(format!("Unknown destination: {}", err,))} - replacement in src/main.rs at line 218
let http_server = Server::bind(&config.http).serve(MakeServiceCmd {cmd_send: cmd_send.clone(),}).with_graceful_shutdown(ctrl_c.clone());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
http_server.await?;http_server.bind(&config.http)?.run().await?; - replacement in Cargo.toml at line 30
[dependencies.hyper]version = "0.14"features = ["full"][dependencies.actix-web]version = "4.2.1" - edit in Cargo.lock at line 4
[[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
][[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
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
[[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
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
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
[[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
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
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
][[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
[[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
"wasi","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
"rand","rand 0.8.5", - replacement in Cargo.lock at line 924
"rand","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
[[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
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
[[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
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
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
"wasi","log","wasi 0.11.0+wasi-snapshot-preview1", - edit in Cargo.lock at line 1368
[[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
[[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
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
"rand_chacha","rand_core","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
"rand_core","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
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
"getrandom","getrandom 0.3.2", - edit in Cargo.lock at line 1623
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
"getrandom","getrandom 0.2.15", - replacement in Cargo.lock at line 1755
"getrandom","getrandom 0.2.15", - edit in Cargo.lock at line 1772
"actix-web", - edit in Cargo.lock at line 1777
"hyper", - edit in Cargo.lock at line 1808
][[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
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
"form_urlencoded","itoa","ryu", - edit in Cargo.lock at line 2028
][[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
"parking_lot", - replacement in Cargo.lock at line 2161
"rand","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
"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
name = "want"version = "0.3.1"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",]checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - replacement in Cargo.lock at line 2320
version = "0.11.0+wasi-snapshot-preview1"version = "0.14.2+wasi-0.2.4" - replacement in Cargo.lock at line 2322
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"dependencies = ["wit-bindgen-rt",] - edit in Cargo.lock at line 2569
][[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",]