gpt4 book ai didi

rust - 如何在运行时在 Hyper 中设置原始 header ?

转载 作者:行者123 更新时间:2023-11-29 08:27:19 25 4
gpt4 key购买 nike

我正在尝试在运行时在 Hyper Response 上设置 header 。在实际代码中, header 来自一个文件,所以我不知道它们在编译时是什么。不幸的是,我已经仔细阅读了文档和我能找到的所有示例,但还没有看到有人这样做。这是代码:

extern crate hyper;
use std::collections::HashMap;
use std::io::{Read,Write};
use hyper::server::{Handler,Server,Response,Request};
use hyper::header::*;

fn main() {
let headers = HashMap::new();
headers.insert("X-Test-Header".to_string(), "test_value".to_string());
let responder = Responder::new(headers);

Server::http("127.0.0.1:1340")
.unwrap()
.handle(responder)
.unwrap();
}

struct Responder {
headers: HashMap<String, String>
}

impl Responder {
pub fn new(headers: HashMap<String,String>) -> Self {
Responder {
headers: headers.clone()
}
}
fn respond_success(&self, mut res: Response, content: &[u8]) {
res.headers_mut()
.set(ContentLength(content.len() as u64));
for (key, val) in self.headers.iter() {
res.headers_mut()
.set_raw(key.as_str(), vec![val.into_bytes()])
}
let mut res_body = res.start().unwrap();
res_body.write_all(content).unwrap();
}
}

impl Handler for Responder {
fn handle(&self, req: Request, res: Response) {
let content = b"Hello World!";
self.respond_success(res, content);
}
}

错误:

error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src\main.rs:31:40
|
31 | for (key, val) in self.headers.iter() {
| ^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the body at 28:65...
--> src\main.rs:28:66
|
28 | fn respond_success(&self, mut res: Response, content: &[u8]) {
| ^
note: ...so that reference does not outlive borrowed content
--> src\main.rs:31:27
|
31 | for (key, val) in self.headers.iter() {
| ^^^^^^^^^^^^
= note: but, the lifetime must be valid for the static lifetime...
note: ...so that types are compatible (expected std::convert::From<&str>, found std::convert::From<&str>)
--> src\main.rs:33:18
|
33 | .set_raw(key.as_str(), vec![val.into_bytes()])
| ^^^^^^^

看起来 set_raw 需要一些静态的东西,但我不确定重构它的最佳选择是什么。 responder 必须是静态的吗?这似乎是错误的。

最佳答案

检查 Headers::set_raw 的签名:

fn set_raw<K>(&mut self, name: K, value: Vec<Vec<u8>>)
where
K: Into<Cow<'static, str>>

这表示 name可以是任何可以转换为 Cow<'static, str> 的类型.这意味着它可以是 &'static str 一个String .

接下来,查看您要传递的类型:

.set_raw(key.as_str(), vec![val.into_bytes()])
  1. String::as_str 返回一个与 String 一样长的字符串切片它被调用,不是 'static生命周期。

    相反,您需要获得一个拥有的字符串。

  2. 您正在调用 String::into_bytes &String 上, 但是,如 Cannot move out of borrowed content 中所述,你不能,因为它按值接收接收者。

    相反,您需要获取字节的自有副本。

放在一起,它看起来像:

for (key, val) in self.headers.iter() {
res.headers_mut()
.set_raw(key.clone(), vec![val.clone().into_bytes()])
}

关于rust - 如何在运行时在 Hyper 中设置原始 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44054284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com