微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

actix-web客户端将有效负载作为流处理

如何解决actix-web客户端将有效负载作为流处理

带有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 举报,一经查实,本站将立刻删除。