1+ use std:: net:: { IpAddr , SocketAddr } ;
2+ use log:: { debug, trace} ;
3+ use reqwest:: Url ;
4+ use serde:: de:: DeserializeOwned ;
5+
6+
7+
8+ pub async fn request < ' de , B > (
9+ server_address : IpAddr ,
10+ port : u16 ,
11+ url : & str ,
12+ headers : & Vec < ( & str , & str ) > ,
13+ query_params : & Vec < ( & str , & str ) > ) -> Result < B , doh_common:: error:: Error >
14+ where B : DeserializeOwned {
15+
16+ let address = SocketAddr :: new ( server_address, port) ;
17+
18+ let url = Url :: parse ( url) ?;
19+
20+ let client = reqwest:: ClientBuilder :: new ( )
21+ . resolve ( url. domain ( ) . unwrap ( ) , address)
22+ . user_agent ( "???" )
23+ . brotli ( true )
24+ . gzip ( true )
25+ . build ( ) ?;
26+
27+ let mut request_builder = client. get ( url) ;
28+
29+ for ( key, value) in headers {
30+ request_builder = request_builder. header ( key. to_string ( ) , value. to_string ( ) ) ;
31+ }
32+
33+ request_builder = request_builder. query ( query_params) ;
34+
35+ let request = request_builder. build ( ) ?;
36+
37+ let response = client. execute ( request) . await ?;
38+
39+ let status = response. status ( ) ;
40+
41+ if status. is_success ( ) {
42+
43+ //debug!("Response body: {}", body.clone());
44+
45+ let body = response. bytes ( ) . await ?;
46+
47+ debug ! ( "response body: {}" , String :: from_utf8_lossy( & body. to_vec( ) ) ) ;
48+
49+ let obj : B = serde_json:: from_slice ( & body) ?;
50+
51+ Ok ( obj)
52+ } else {
53+
54+ let body = response. bytes ( ) . await ?;
55+
56+ debug ! ( "response status {:?}: {:?}" , status, String :: from_utf8_lossy( & body. to_vec( ) ) ) ;
57+
58+ Err ( doh_common:: error:: Error :: UpstreamError )
59+
60+ }
61+ }
62+
63+
64+ // pub fn request<'de, B>(server_address: IpAddr,
65+ // port: u16,
66+ // url: &str,
67+ // headers: &Vec<(&str, &str)>,
68+ // query_params: &Vec<(&str, &str)>) -> Result<B, doh_common::error::Error>
69+ // where B: DeserializeOwned {
70+ //
71+ // let address = SocketAddr::new(server_address, port);
72+ //
73+ // let agent = ureq::AgentBuilder::new()
74+ // .user_agent("??????????????????????????")
75+ // .resolver(move |addr: &str| match addr {
76+ // _ => Ok(vec![address])
77+ // })
78+ // .build();
79+ //
80+ // let mut request = agent.get(&url);
81+ //
82+ // for (key, value) in headers {
83+ // request = request.set(key, value);
84+ // }
85+ //
86+ // for (key, value) in query_params {
87+ // request = request.query(key, value)
88+ // }
89+ //
90+ // let response = request.call()?;
91+ // let status = response.status();
92+ //
93+ // if status > 199 && status < 300 {
94+ //
95+ // let body = response.into_string()?;
96+ //
97+ // debug!("Response body: {}", body.clone());
98+ //
99+ // let obj: B = serde_json::from_str::<B>(&body)
100+ // .inspect_err(|er| {
101+ //
102+ // error!("Error deserializing: {}", er);
103+ //
104+ // })?;
105+ //
106+ // Ok(obj)
107+ // } else {
108+ //
109+ // let body = response.into_string()?;
110+ //
111+ // debug!("Response status {}: {}", status, body.clone());
112+ //
113+ // Err(doh_common::error::Error::UpstreamError)
114+ // }
115+ // }
0 commit comments