客户端
tower-http 只认 http 和 http_body,所以同一批层也能套在客户端外面。reqwest 就是这样用的:它的重定向是 tower-http 的 FollowRedirect,解压是 Decompression(reqwest 卷 重定向、响应体)。这一部分讲 reqwest 卷没讲的两件事:
- FollowRedirect 的策略:
Policy的三个方法;Standard = And<Limited, FilterCredentials>,限额用完返回 3xx 而不是报错;Standard不复制 body,307 遇到非空 body 原样返回,clone_body_fn补上;0.7.0 起扩展跟着重发、过滤逐跳累积,0.6.11 会把凭据发给跨源之后的同一个源。 - 拼一个客户端栈: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 的哪一边」:外面的层只看到一个逻辑请求,里面的层看到每一跳。
💬 关联讨论
发起讨论加载中...