Rust in Everything
基于 tower-http 0.7.1

客户端

tower-http 只认 http 和 http_body,所以同一批层也能套在客户端外面。reqwest 就是这样用的:它的重定向是 tower-http 的 FollowRedirect,解压是 Decompression(reqwest 卷 重定向、响应体)。这一部分讲 reqwest 卷没讲的两件事:

  1. FollowRedirect 的策略:Policy 的三个方法;Standard = And<Limited, FilterCredentials>,限额用完返回 3xx 而不是报错;Standard 不复制 body,307 遇到非空 body 原样返回,clone_body_fn 补上;0.7.0 起扩展跟着重发、过滤逐跳累积,0.6.11 会把凭据发给跨源之后的同一个源。
  2. 拼一个客户端栈:hyper-util 的 legacy::Client 加 Trace、FollowRedirect、Decompression、SetRequestHeader、AddAuthorization、Timeout;Timeout 要先把 Incoming 装箱;AddAuthorization 要放在 FollowRedirect 外面,跨源时才会被删掉。
flowchart TB
  app[调用方] --> outer["FollowRedirect 外面的层:整条链执行一次"]
  outer --> fr["FollowRedirect:Policy 决定跟不跟、改下一跳"]
  fr --> inner["FollowRedirect 里面的层:每一跳执行一次"]
  inner --> cli["hyper-util Client"]
  cli -->|3xx| fr

客户端栈的顺序问题,归根到底是「这一层在 FollowRedirect 的哪一边」:外面的层只看到一个逻辑请求,里面的层看到每一跳。

💬 关联讨论

发起讨论
加载中...