11
11
12
12
//! Esplora by way of `reqwest` HTTP client.
13
13
14
- use std:: collections:: HashMap ;
15
- use std:: marker:: PhantomData ;
16
- use std:: str:: FromStr ;
17
14
use bitcoin:: consensus:: { deserialize, serialize, Decodable , Encodable } ;
18
15
use bitcoin:: hashes:: { sha256, Hash } ;
19
16
use bitcoin:: hex:: { DisplayHex , FromHex } ;
20
17
use bitcoin:: Address ;
21
18
use bitcoin:: {
22
19
block:: Header as BlockHeader , Block , BlockHash , MerkleBlock , Script , Transaction , Txid ,
23
20
} ;
21
+ use std:: collections:: HashMap ;
22
+ use std:: marker:: PhantomData ;
23
+ use std:: str:: FromStr ;
24
24
25
- #[ allow( unused_imports) ]
26
- use log:: { debug, error, info, trace} ;
27
-
28
- use async_minreq:: { Method , Request } ;
29
25
use crate :: api:: AddressStats ;
30
26
use crate :: {
31
27
BlockStatus , BlockSummary , Builder , Error , MerkleProof , OutputStatus , Tx , TxStatus ,
32
28
BASE_BACKOFF_MILLIS , RETRYABLE_ERROR_CODES ,
33
29
} ;
30
+ use async_minreq:: { Method , Request } ;
31
+ #[ allow( unused_imports) ]
32
+ use log:: { debug, error, info, trace} ;
34
33
35
34
#[ derive( Debug , Clone ) ]
36
35
pub struct AsyncClient < S = DefaultSleeper > {
@@ -47,15 +46,15 @@ pub struct AsyncClient<S = DefaultSleeper> {
47
46
impl < S : Sleeper > AsyncClient < S > {
48
47
/// Build an async client from a builder
49
48
pub fn from_builder ( builder : Builder ) -> Result < Self , Error > {
50
- Ok ( AsyncClient {
49
+ Ok ( AsyncClient {
51
50
url : builder. base_url ,
52
51
max_retries : builder. max_retries ,
53
52
headers : builder. headers ,
54
53
marker : PhantomData ,
55
54
} )
56
55
}
57
56
58
- pub fn from_client ( url : String , headers : HashMap < String , String > , ) -> Self {
57
+ pub fn from_client ( url : String , headers : HashMap < String , String > ) -> Self {
59
58
AsyncClient {
60
59
url,
61
60
headers,
@@ -78,17 +77,17 @@ impl<S: Sleeper> AsyncClient<S> {
78
77
let url = format ! ( "{}{}" , self . url, path) ;
79
78
let response = self . get_with_retry ( & url) . await ?;
80
79
81
- if response. status_code > 299 {
80
+ if response. status_code > 299 {
82
81
return Err ( Error :: HttpResponse {
83
82
status : response. status_code as u16 ,
84
- message : match response. as_str ( ) {
85
- Ok ( resp) => resp. to_string ( ) ,
86
- Err ( _) => return Err ( Error :: InvalidResponse ) ,
87
- }
83
+ message : match response. as_str ( ) {
84
+ Ok ( resp) => resp. to_string ( ) ,
85
+ Err ( _) => return Err ( Error :: InvalidResponse ) ,
86
+ } ,
88
87
} ) ;
89
88
}
90
89
91
- Ok ( deserialize :: < T > ( & response. as_bytes ( ) ) ?)
90
+ Ok ( deserialize :: < T > ( response. as_bytes ( ) ) ?)
92
91
}
93
92
94
93
/// Make an HTTP GET request to given URL, deserializing to `Option<T>`.
@@ -121,19 +120,20 @@ impl<S: Sleeper> AsyncClient<S> {
121
120
let url = format ! ( "{}{}" , self . url, path) ;
122
121
let response = self . get_with_retry ( & url) . await ?;
123
122
124
- if response. status_code > 299 {
123
+ if response. status_code > 299 {
125
124
return Err ( Error :: HttpResponse {
126
125
status : response. status_code as u16 ,
127
- message : match response. as_str ( ) {
128
- Ok ( resp) => resp. to_string ( ) ,
129
- Err ( _) => return Err ( Error :: InvalidResponse ) ,
130
- } ,
126
+ message : match response. as_str ( ) {
127
+ Ok ( resp) => resp. to_string ( ) ,
128
+ Err ( _) => return Err ( Error :: InvalidResponse ) ,
129
+ } ,
131
130
} ) ;
132
131
}
133
- serde_json:: from_str ( match response. as_str ( ) {
134
- Ok ( resp) => resp,
135
- Err ( _) => return Err ( Error :: InvalidResponse ) ,
136
- } ) . map_err ( Error :: Json )
132
+ serde_json:: from_str ( match response. as_str ( ) {
133
+ Ok ( resp) => resp,
134
+ Err ( _) => return Err ( Error :: InvalidResponse ) ,
135
+ } )
136
+ . map_err ( Error :: Json )
137
137
}
138
138
139
139
/// Make an HTTP GET request to given URL, deserializing to `Option<T>`.
@@ -168,19 +168,19 @@ impl<S: Sleeper> AsyncClient<S> {
168
168
let url = format ! ( "{}{}" , self . url, path) ;
169
169
let response = self . get_with_retry ( & url) . await ?;
170
170
171
- if response. status_code > 299 {
171
+ if response. status_code > 299 {
172
172
return Err ( Error :: HttpResponse {
173
173
status : response. status_code as u16 ,
174
- message : match response. as_str ( ) {
175
- Ok ( resp) => resp. to_string ( ) ,
176
- Err ( _) => return Err ( Error :: InvalidResponse ) ,
177
- }
174
+ message : match response. as_str ( ) {
175
+ Ok ( resp) => resp. to_string ( ) ,
176
+ Err ( _) => return Err ( Error :: InvalidResponse ) ,
177
+ } ,
178
178
} ) ;
179
179
}
180
- let hex_str =match response. as_str ( ) {
181
- Ok ( resp) => resp. to_string ( ) ,
182
- Err ( _) => return Err ( Error :: InvalidResponse ) ,
183
- } ;
180
+ let hex_str = match response. as_str ( ) {
181
+ Ok ( resp) => resp. to_string ( ) ,
182
+ Err ( _) => return Err ( Error :: InvalidResponse ) ,
183
+ } ;
184
184
Ok ( deserialize ( & Vec :: from_hex ( & hex_str) ?) ?)
185
185
}
186
186
@@ -210,19 +210,19 @@ impl<S: Sleeper> AsyncClient<S> {
210
210
let url = format ! ( "{}{}" , self . url, path) ;
211
211
let response = self . get_with_retry ( & url) . await ?;
212
212
213
- if response. status_code > 299 {
213
+ if response. status_code > 299 {
214
214
return Err ( Error :: HttpResponse {
215
215
status : response. status_code as u16 ,
216
- message : match response. as_str ( ) {
217
- Ok ( resp) => resp. to_string ( ) ,
218
- Err ( _) => return Err ( Error :: InvalidResponse ) ,
219
- }
216
+ message : match response. as_str ( ) {
217
+ Ok ( resp) => resp. to_string ( ) ,
218
+ Err ( _) => return Err ( Error :: InvalidResponse ) ,
219
+ } ,
220
220
} ) ;
221
221
}
222
- Ok ( match response. as_str ( ) {
223
- Ok ( resp) => resp. to_string ( ) ,
224
- Err ( _) => return Err ( Error :: InvalidResponse ) ,
225
- } )
222
+ Ok ( match response. as_str ( ) {
223
+ Ok ( resp) => resp. to_string ( ) ,
224
+ Err ( _) => return Err ( Error :: InvalidResponse ) ,
225
+ } )
226
226
}
227
227
228
228
/// Make an HTTP GET request to given URL, deserializing to `Option<T>`.
@@ -257,15 +257,15 @@ impl<S: Sleeper> AsyncClient<S> {
257
257
for ( key, value) in & self . headers {
258
258
request = request. with_header ( key, value) ;
259
259
}
260
-
260
+
261
261
let response = request. send ( ) . await . map_err ( Error :: AsyncMinreq ) ?;
262
- if response. status_code > 299 {
262
+ if response. status_code > 299 {
263
263
return Err ( Error :: HttpResponse {
264
264
status : response. status_code as u16 ,
265
- message : match response. as_str ( ) {
266
- Ok ( resp) => resp. to_string ( ) ,
267
- Err ( _) => return Err ( Error :: InvalidResponse ) ,
268
- }
265
+ message : match response. as_str ( ) {
266
+ Ok ( resp) => resp. to_string ( ) ,
267
+ Err ( _) => return Err ( Error :: InvalidResponse ) ,
268
+ } ,
269
269
} ) ;
270
270
}
271
271
Ok ( ( ) )
@@ -457,7 +457,7 @@ impl<S: Sleeper> AsyncClient<S> {
457
457
let mut attempts = 0 ;
458
458
459
459
loop {
460
- let mut request = Request :: new ( Method :: Get , url) ;
460
+ let mut request = Request :: new ( Method :: Get , url) ;
461
461
for ( key, value) in & self . headers {
462
462
request = request. with_header ( key, value) ;
463
463
}
@@ -493,4 +493,4 @@ impl Sleeper for DefaultSleeper {
493
493
fn sleep ( dur : std:: time:: Duration ) -> Self :: Sleep {
494
494
tokio:: time:: sleep ( dur)
495
495
}
496
- }
496
+ }
0 commit comments