qiniu_http_client/client/callback/
extended.rs

1use super::{
2    super::{Authorization, Idempotent, InnerRequestParts, QueryPair, RetriedStatsInfo},
3    context::CallbackContext,
4    simplified::SimplifiedCallbackContext,
5};
6use auto_impl::auto_impl;
7use qiniu_http::{
8    uri::Scheme, Extensions, HeaderMap, Method, RequestParts as HttpRequestParts, Uri, UserAgent, Version,
9};
10use std::{borrow::Cow, net::IpAddr};
11
12/// 扩展的回调函数上下文
13///
14/// 基于回调函数上下文,并在此基础上增加返回部分请求信息的可变引用,以及 UserAgent 和经过解析的 IP 地址列表的获取和设置方法。
15#[auto_impl(&mut, Box)]
16pub trait ExtendedCallbackContext: CallbackContext {
17    /// 获取 HTTP 请求 URL
18    fn url(&self) -> &Uri;
19
20    /// 获取请求 HTTP 版本的可变引用
21    fn version_mut(&mut self) -> &mut Version;
22
23    /// 获取请求 HTTP Headers 的可变引用
24    fn headers_mut(&mut self) -> &mut HeaderMap;
25
26    /// 获取 UserAgent
27    fn user_agent(&self) -> UserAgent;
28
29    /// 设置追加的 UserAgent
30    fn set_appended_user_agent(&mut self, appended_user_agent: UserAgent);
31
32    /// 获取经过解析的 IP 地址列表
33    fn resolved_ip_addrs(&self) -> Option<&[IpAddr]>;
34
35    /// 设置经过解析的 IP 地址列表
36    fn set_resolved_ip_addrs(&mut self, resolved_ip_addrs: Vec<IpAddr>);
37
38    /// 获取重试统计信息
39    fn retried(&self) -> &RetriedStatsInfo;
40}
41
42#[derive(Debug)]
43pub(in super::super) struct ExtendedCallbackContextImpl<'reqref, 'req, 'retried, 'httpreqref, 'httpreq> {
44    request: &'reqref InnerRequestParts<'req>,
45    http_request: &'httpreqref mut HttpRequestParts<'httpreq>,
46    retried: &'retried RetriedStatsInfo,
47}
48
49impl<'reqref, 'req, 'retried, 'httpreqref, 'httpreq>
50    ExtendedCallbackContextImpl<'reqref, 'req, 'retried, 'httpreqref, 'httpreq>
51{
52    pub(in super::super) fn new(
53        request: &'reqref InnerRequestParts<'req>,
54        http_request: &'httpreqref mut HttpRequestParts<'httpreq>,
55        retried: &'retried RetriedStatsInfo,
56    ) -> Self {
57        Self {
58            request,
59            http_request,
60            retried,
61        }
62    }
63}
64
65impl SimplifiedCallbackContext for ExtendedCallbackContextImpl<'_, '_, '_, '_, '_> {
66    #[inline]
67    fn use_https(&self) -> bool {
68        self.http_request.url().scheme() == Some(&Scheme::HTTPS)
69    }
70
71    #[inline]
72    fn method(&self) -> &Method {
73        self.http_request.method()
74    }
75
76    #[inline]
77    fn version(&self) -> Version {
78        self.http_request.version()
79    }
80
81    #[inline]
82    fn path(&self) -> &str {
83        self.request.path()
84    }
85
86    #[inline]
87    fn query(&self) -> &str {
88        self.request.query()
89    }
90
91    #[inline]
92    fn query_pairs(&self) -> &[QueryPair] {
93        self.request.query_pairs()
94    }
95
96    #[inline]
97    fn headers(&self) -> &HeaderMap {
98        self.http_request.headers()
99    }
100
101    #[inline]
102    fn appended_user_agent(&self) -> &UserAgent {
103        self.http_request.appended_user_agent()
104    }
105
106    #[inline]
107    fn authorization(&self) -> Option<&Authorization> {
108        self.request.authorization()
109    }
110
111    #[inline]
112    fn idempotent(&self) -> Idempotent {
113        self.request.idempotent()
114    }
115}
116
117impl CallbackContext for ExtendedCallbackContextImpl<'_, '_, '_, '_, '_> {
118    #[inline]
119    fn extensions(&self) -> &Extensions {
120        self.http_request.extensions()
121    }
122
123    #[inline]
124    fn extensions_mut(&mut self) -> &mut Extensions {
125        self.http_request.extensions_mut()
126    }
127}
128
129impl ExtendedCallbackContext for ExtendedCallbackContextImpl<'_, '_, '_, '_, '_> {
130    #[inline]
131    fn url(&self) -> &Uri {
132        self.http_request.url()
133    }
134
135    #[inline]
136    fn version_mut(&mut self) -> &mut Version {
137        self.http_request.version_mut()
138    }
139
140    #[inline]
141    fn headers_mut(&mut self) -> &mut HeaderMap {
142        self.http_request.headers_mut()
143    }
144
145    #[inline]
146    fn user_agent(&self) -> UserAgent {
147        self.http_request.user_agent()
148    }
149
150    #[inline]
151    fn set_appended_user_agent(&mut self, appended_user_agent: UserAgent) {
152        *self.http_request.appended_user_agent_mut() = appended_user_agent;
153    }
154
155    #[inline]
156    fn resolved_ip_addrs(&self) -> Option<&[IpAddr]> {
157        self.http_request.resolved_ip_addrs()
158    }
159
160    #[inline]
161    fn set_resolved_ip_addrs(&mut self, resolved_ip_addrs: Vec<IpAddr>) {
162        *self.http_request.resolved_ip_addrs_mut() = Some(Cow::Owned(resolved_ip_addrs));
163    }
164
165    #[inline]
166    fn retried(&self) -> &RetriedStatsInfo {
167        self.retried
168    }
169}