问题描述
带有actix的简单http客户端。从服务器获取响应,可以处理标头。但是,当尝试处理有效载荷时,我对锈的理解失败了。 我的愿望是逐字节处理有效负载,以获取巨大的流和分块数据。简单的body()解决方案可以正常工作。但是如何从有效载荷中获取字节。似乎暗示着Stream,因此fn size_hint()可以访问,但是Decompresser暗示从Stream发出的poll_next暗示解码器暗示着Stream。
main.rs
use actix::prelude::*;
use actix_http::encoding::{Decoder};
use actix_web::{HttpMessage,client::ClientBuilder,dev::Payload,http::{Version,StatusCode},web::Bytes};
use futures::future::{TryFutureExt};
use futures_core::stream::Stream;
use std::pin::Pin;
use std::Boxed::Box;
use std::task::{Context,Poll};
#[actix_web::main]
async fn main() {
const URL : [&str; 2] = ["..",".."];
let client = ClientBuilder::new()
.disable_timeout()
.disable_redirects()
.header("User-Agent","actix-web/3.0")
.header("Accept-Encoding","gzip,deflate,br,chunked")
.header("Connection","keepalive")
.header("DNT","1")
.max_http_version( Version::HTTP_2 )
.finish();
// Create request builder and send request
let response =
client.get(URL[0]).send().map_err(|err|{
println!("Error on send {:?}",err);
});
match response.await{
Ok( mut v) => {
println!("encoding: {:?}",v.encoding());
println!("content type: {:?}",v.content_type());
println!("mime type: {:?}",v.mime_type());
println!("chunked: {:?}",v.chunked());
match v.status(){
StatusCode::OK => {
/* works fine
match v.body().await {
Ok(m) => { println!("body {:?}",m); },Err(r) => { println!("Error.body {:?}",r); }
}
*/
// but what about handling byte by byte?
let payload = v.take_payload();
match payload {
Payload::None => { println!(" no data "); },Payload::H1(h1) => {println!(" data h1 {:?}",h1); },Payload::H2(d2) => {println!(" data h2 "); },Payload::Stream(s1) => {
println!(" data stream ");
println!(" size: {:?}",s1.size_hint());
// Decompress impl Decoder
// Decoder impl Stream
// but how to activate poll_next
// compiler can size_hint from Stream
// but poll_next not found??
}
};
},StatusCode::NOT_FOUND => {
println!(" resource was not found");
},_ => {
}
}
},Err(err) => {
println!("Error {:?}",err);
}
};
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)