1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
use crate::{
    client::ResponseFuture,
    config::{internal::ConfigurableBase, Configurable},
    {Body, Error},
};
use http::{Request, Response};
pub trait RequestExt<T> {
    
    
    
    
    fn to_builder(&self) -> http::request::Builder;
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    fn send(self) -> Result<Response<Body>, Error>
    where
        T: Into<Body>;
    
    
    
    
    fn send_async(self) -> ResponseFuture<'static>
    where
        T: Into<Body>;
}
impl<T> RequestExt<T> for Request<T> {
    fn to_builder(&self) -> http::request::Builder {
        let mut builder = Request::builder()
            .method(self.method().clone())
            .uri(self.uri().clone())
            .version(self.version());
        *builder.headers_mut().unwrap() = self.headers().clone();
        
        macro_rules! try_clone_extension {
            ($extensions:expr, $builder:expr, [$($ty:ty,)*]) => {{
                let extensions = $extensions;
                $(
                    if let Some(extension) = extensions.get::<$ty>() {
                        $builder = $builder.extension(extension.clone());
                    }
                )*
            }}
        }
        try_clone_extension!(
            self.extensions(),
            builder,
            [
                crate::config::Timeout,
                crate::config::ConnectTimeout,
                crate::config::TcpKeepAlive,
                crate::config::TcpNoDelay,
                crate::config::NetworkInterface,
                crate::config::Dialer,
                crate::config::RedirectPolicy,
                crate::config::redirect::AutoReferer,
                crate::config::AutomaticDecompression,
                crate::auth::Authentication,
                crate::auth::Credentials,
                crate::config::MaxAgeConn,
                crate::config::MaxUploadSpeed,
                crate::config::MaxDownloadSpeed,
                crate::config::VersionNegotiation,
                crate::config::proxy::Proxy<Option<http::Uri>>,
                crate::config::proxy::Blacklist,
                crate::config::proxy::Proxy<crate::auth::Authentication>,
                crate::config::proxy::Proxy<crate::auth::Credentials>,
                crate::config::DnsCache,
                crate::config::dns::ResolveMap,
                crate::config::dns::Servers,
                crate::config::ssl::Ciphers,
                crate::config::ClientCertificate,
                crate::config::CaCertificate,
                crate::config::SslOption,
                crate::config::CloseConnection,
                crate::config::EnableMetrics,
                crate::config::IpVersion,
            ]
        );
        builder
    }
    fn send(self) -> Result<Response<Body>, Error>
    where
        T: Into<Body>,
    {
        crate::send(self)
    }
    fn send_async(self) -> ResponseFuture<'static>
    where
        T: Into<Body>,
    {
        crate::send_async(self)
    }
}
impl Configurable for http::request::Builder {}
impl ConfigurableBase for http::request::Builder {
    fn configure(self, option: impl Send + Sync + 'static) -> Self {
        self.extension(option)
    }
}