相关疑难解决方法(0)

如何在Hyper处理程序之间共享HashMap?

我试图通过使用Hyper 0.10实现一个简单的内存URL缩短器来学习Rust.我遇到了一个问题,我认为这是因为我试图HashMap在我的处理程序中关闭一个mutable :

fn post(mut req: Request, mut res: Response, short_uris: &mut HashMap<&str, &str>) {
    let mut body = String::new();
    match req.read_to_string(&mut body) {
        Ok(_) => {
            let key = short_uris.len();
            short_uris.insert(&key.to_string(), &body.to_string());
            *res.status_mut() = StatusCode::Created;
            res.start().unwrap().write(&key.to_string().into_bytes());
        },
        Err(_) => *res.status_mut() = StatusCode::BadRequest
    }
}

fn get(req: Request, mut res: Response, short_uris: &HashMap<&str, &str>) {
    match req.uri.clone() {
        AbsolutePath(path) => {
            match short_uris.get::<str>(&path) {
                Some(short_uri) => {
                    *res.status_mut() = StatusCode::MovedPermanently;
                    res.headers_mut().set(Location(short_uri.to_string()));
                },
                None => *res.status_mut() = StatusCode::NotFound
            } …
Run Code Online (Sandbox Code Playgroud)

rust hyper

7
推荐指数
1
解决办法
1155
查看次数

Hyper 中的共享可变状态

我正在尝试在 Hyper Web 服务器中创建一个计数器来计算它收到的请求数。我正在使用 aArc<Mutex<u64>>来保持计数。但是,我一直无法弄清楚闭包的正确组合move.clone()满足闭包的类型。这是一些编译代码,但在每个请求上重置计数器:

extern crate hyper;

use hyper::rt::Future;
use hyper::service::service_fn_ok;
use hyper::{Body, Response, Server};
use std::sync::{Arc, Mutex};

fn main() {
    let addr = "0.0.0.0:3000".parse().unwrap();
    // FIXME want to create the counter here, not below
    let server = Server::bind(&addr)
        .serve(|| {
            service_fn_ok(|_req| {
                let counter = Arc::new(Mutex::new(0));
                use_counter(counter)
            })
        })
        .map_err(|e| eprintln!("Error: {}", e));
    hyper::rt::run(server)
}

fn use_counter(counter: Arc<Mutex<u64>>) -> Response<Body> {
    let mut data = counter.lock().unwrap();
    *data += 1;
    Response::new(Body::from(format!("Counter: {}\n", data))) …
Run Code Online (Sandbox Code Playgroud)

rust hyper rust-tokio

3
推荐指数
1
解决办法
760
查看次数

如何与超级请求处理程序共享不可变的配置数据?

我正在尝试在 Rust 中开发一个基于超级服务器的应用程序。有一个 INI 文件保存配置,如绑定 IP、数据库等。

我不想在每个请求上解析 INI 文件,并且可以保留配置数据直到服务器重新启动。如何将已解析数据的结构提供给请求处理程序?

我尝试了多种方法,例如 using std::sync::Arc,但目前唯一有效的方法是使用 a static,但我想避免unsafe阻塞。

这是一个完整的(非工作)示例:

Cargo.toml

[package]
name = "demo"
version = "0.1.0"
edition = "2018"

[dependencies]
hyper = "0.12"
rust-ini = "0.13"
Run Code Online (Sandbox Code Playgroud)

演示文件

[Demo]
value="some value"
Run Code Online (Sandbox Code Playgroud)

src/main.rs

[package]
name = "demo"
version = "0.1.0"
edition = "2018"

[dependencies]
hyper = "0.12"
rust-ini = "0.13"
Run Code Online (Sandbox Code Playgroud)

错误

[Demo]
value="some value"
Run Code Online (Sandbox Code Playgroud)

rust hyper

2
推荐指数
1
解决办法
383
查看次数

标签 统计

hyper ×3

rust ×3

rust-tokio ×1