Rust 使用Warp’;那么s和U呢

Rust 使用Warp’;那么s和U呢,rust,rust-warp,Rust,Rust Warp,我正在尝试将HTTPS强制添加到GKE上基于Warp的web应用程序中 GKE平台基本上是不相关的;cromulent的细节是负载平衡器终止SSL/TLS连接,因此在X-Forwarded-Proto头中提供了“真实”方案。Warp解析的文本方案将始终是HTTP 逻辑如下: 如果方案为HTTPSHTTPS,则正常处理请求 如果方案是HTTP,则发送301重定向到等效的HTTPSURL 如果该方案是其他方案,则发送421(错误定向请求)错误 如果X-Forwarded-Proto报头丢失(或出现任

我正在尝试将HTTPS强制添加到GKE上基于Warp的web应用程序中

GKE平台基本上是不相关的;cromulent的细节是负载平衡器终止SSL/TLS连接,因此在
X-Forwarded-Proto
头中提供了“真实”方案。Warp解析的文本方案将始终是
HTTP

逻辑如下:

  • 如果方案为HTTPS
    HTTPS
    ,则正常处理请求
  • 如果方案是
    HTTP
    ,则发送301重定向到等效的
    HTTPS
    URL
  • 如果该方案是其他方案,则发送421(错误定向请求)错误
  • 如果
    X-Forwarded-Proto
    报头丢失(或出现任何其他实际不可能的情况),则发送400(错误请求)错误
  • 在本例中,错误响应没有正文内容,所有HTTPS请求都应该以文本
    Hello,world

    问题是:
    error[E0277]:未满足特性绑定'std::result::result:core::future::future::future::future'
    -->src/main.rs:23:10
    |
    23 |和|然后(|方案|头:选项,主机:字符串,路径:完整路径|{
    |^^^^^^^^未为'std::result::result'实现特性'core::future::future::future'`
    |
    =注:由于'std::result::result'的'futures\u core::future::TryFuture'impl上的要求,因此需要`
    错误[E0599]:在当前作用域中找不到类型“warp::filter::and_then::AndThen”的名为“and”的方法
    -->src/main.rs:44:10
    |
    44 |和(过滤器)
    |^^^^在'warp::filter::and_then::and then'中找不到方法`
    |
    =注意:方法`和`存在,但不满足以下特征界限:
    `&mut warp::filter::and_then::and then:warp::filter::filter`
    `&warp::filter::and_then::and then:warp::filter::filter`
    `warp::filter::and_then::and then:warp::filter::filter`
    
    很明显,我错过了一些明显的东西,所以我希望有人能把我推向正确的方向

    使用期货:{futurext,StreamExt};
    使用warp::{Filter,Rejection};
    使用warp::filters::path::{FullPath};
    使用warp::http::{StatusCode,Uri};
    使用warp::http::uri::{Parts,Scheme};
    使用warp::reply::reply;
    枚举模式错误{
    不安全方案(Uri),
    未知数,
    失踪计划,
    }
    impl warp::reject::拒绝SchemeError{}
    异步fn需要\u https(筛选器:impl-filter+Copy)->impl-filter+Copy{
    warp::header::可选(“X-Forwarded-Proto”)
    和(warp::header(“主机”))
    .和(warp::path::full())
    .and|u then(| scheme|u header:Option,host:String,path:FullPath|{
    如果let Some(scheme)=scheme_头{
    将scheme.to_ascii_lowercase()匹配为_str(){
    “https”=>正常(()),
    “http”=>{
    让mut uri_parts=parts::default();
    uri_parts.scheme=Some(scheme::HTTPS);
    uri_parts.authority=Some(host.parse().unwrap());
    uri_parts.path_和_query=Some(path.as_str().parse().unwrap());
    设uri_parts=uri_parts;
    让new_uri=uri::from_parts(uri_parts).unwrap();
    println!(“重定向到安全URL:{}”,新的uri);
    错误(warp::reject::custom(SchemeError::unsecureScheme(new_uri)))
    },
    _=>Err(warp::reject::custom(SchemeError::UnknownScheme)),
    }
    }否则{
    错误(warp::reject::custom(SchemeError::MissingScheme))
    }
    })
    .及(过滤器)
    .恢复(错误:拒绝){
    如果let Some(scheme_error)=err.find::(){
    匹配方案错误{
    SchemeError::UnsecureScheme(新uri)=>Ok(warp::redirect(新uri)),
    SchemeError::UnknownScheme=>Ok(状态码::定向错误的请求),
    SchemeError::MissingScheme=>Ok(状态码::错误的请求),
    }
    }否则{
    厄尔(厄尔)
    }
    })
    }
    #[tokio::main]
    异步fn main(){
    let routes=requires_https(warp::any().map(| |“你好,世界!”);
    翘曲:发球(路线)
    .run(([0,0,0,0],8080))
    .等待;
    }
    
    我是个新手,但遇到了类似的编译器错误

    我的问题是查看warp 0.1文档,同时使用warp 0.2

    我需要将
    async move
    放在
    中的闭合管道之后,然后

    如果不是那样,可能类似于

    其中
    std::result::result
    表示您正在返回一个单元类型作为left result,这可能不会为它实现