Skip to content

Commit 8d974ff

Browse files
remix7531vladimirfomene
authored andcommitted
Expose error message in addition to status in Blocking client
1 parent 615f76f commit 8d974ff

File tree

2 files changed

+70
-24
lines changed

2 files changed

+70
-24
lines changed

src/blocking.rs

Lines changed: 68 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ use ureq::{Agent, Proxy, Response};
2525
use bitcoin::consensus::{deserialize, serialize};
2626
use bitcoin::hashes::hex::FromHex;
2727
use bitcoin::hashes::{sha256, Hash};
28-
use bitcoin::{Block, BlockHash, block::Header as BlockHeader, MerkleBlock, Script, Transaction, Txid};
28+
use bitcoin::{
29+
block::Header as BlockHeader, Block, BlockHash, MerkleBlock, Script, Transaction, Txid,
30+
};
2931

3032
use bitcoin_internals::hex::display::DisplayHex;
3133

@@ -67,11 +69,14 @@ impl BlockingClient {
6769

6870
match resp {
6971
Ok(resp) => Ok(Some(deserialize(&into_bytes(resp)?)?)),
70-
Err(ureq::Error::Status(code, _)) => {
72+
Err(ureq::Error::Status(code, resp)) => {
7173
if is_status_not_found(code) {
7274
return Ok(None);
7375
}
74-
Err(Error::HttpResponse(code))
76+
Err(Error::HttpResponse {
77+
status: code,
78+
message: resp.into_string()?,
79+
})
7580
}
7681
Err(e) => Err(Error::Ureq(e)),
7782
}
@@ -99,11 +104,14 @@ impl BlockingClient {
99104

100105
match resp {
101106
Ok(resp) => Ok(Some(Txid::from_str(&resp.into_string()?)?)),
102-
Err(ureq::Error::Status(code, _)) => {
107+
Err(ureq::Error::Status(code, resp)) => {
103108
if is_status_not_found(code) {
104109
return Ok(None);
105110
}
106-
Err(Error::HttpResponse(code))
111+
Err(Error::HttpResponse {
112+
status: code,
113+
message: resp.into_string()?,
114+
})
107115
}
108116
Err(e) => Err(Error::Ureq(e)),
109117
}
@@ -118,7 +126,10 @@ impl BlockingClient {
118126

119127
match resp {
120128
Ok(resp) => Ok(resp.into_json()?),
121-
Err(ureq::Error::Status(code, _)) => Err(Error::HttpResponse(code)),
129+
Err(ureq::Error::Status(code, resp)) => Err(Error::HttpResponse {
130+
status: code,
131+
message: resp.into_string()?,
132+
}),
122133
Err(e) => Err(Error::Ureq(e)),
123134
}
124135
}
@@ -142,7 +153,10 @@ impl BlockingClient {
142153

143154
match resp {
144155
Ok(resp) => Ok(deserialize(&Vec::from_hex(&resp.into_string()?)?)?),
145-
Err(ureq::Error::Status(code, _)) => Err(Error::HttpResponse(code)),
156+
Err(ureq::Error::Status(code, resp)) => Err(Error::HttpResponse {
157+
status: code,
158+
message: resp.into_string()?,
159+
}),
146160
Err(e) => Err(Error::Ureq(e)),
147161
}
148162
}
@@ -156,7 +170,10 @@ impl BlockingClient {
156170

157171
match resp {
158172
Ok(resp) => Ok(resp.into_json()?),
159-
Err(ureq::Error::Status(code, _)) => Err(Error::HttpResponse(code)),
173+
Err(ureq::Error::Status(code, resp)) => Err(Error::HttpResponse {
174+
status: code,
175+
message: resp.into_string()?,
176+
}),
160177
Err(e) => Err(Error::Ureq(e)),
161178
}
162179
}
@@ -170,11 +187,14 @@ impl BlockingClient {
170187

171188
match resp {
172189
Ok(resp) => Ok(Some(deserialize(&into_bytes(resp)?)?)),
173-
Err(ureq::Error::Status(code, _)) => {
190+
Err(ureq::Error::Status(code, resp)) => {
174191
if is_status_not_found(code) {
175192
return Ok(None);
176193
}
177-
Err(Error::HttpResponse(code))
194+
Err(Error::HttpResponse {
195+
status: code,
196+
message: resp.into_string()?,
197+
})
178198
}
179199
Err(e) => Err(Error::Ureq(e)),
180200
}
@@ -189,11 +209,14 @@ impl BlockingClient {
189209

190210
match resp {
191211
Ok(resp) => Ok(Some(resp.into_json()?)),
192-
Err(ureq::Error::Status(code, _)) => {
212+
Err(ureq::Error::Status(code, resp)) => {
193213
if is_status_not_found(code) {
194214
return Ok(None);
195215
}
196-
Err(Error::HttpResponse(code))
216+
Err(Error::HttpResponse {
217+
status: code,
218+
message: resp.into_string()?,
219+
})
197220
}
198221
Err(e) => Err(Error::Ureq(e)),
199222
}
@@ -208,11 +231,14 @@ impl BlockingClient {
208231

209232
match resp {
210233
Ok(resp) => Ok(Some(deserialize(&Vec::from_hex(&resp.into_string()?)?)?)),
211-
Err(ureq::Error::Status(code, _)) => {
234+
Err(ureq::Error::Status(code, resp)) => {
212235
if is_status_not_found(code) {
213236
return Ok(None);
214237
}
215-
Err(Error::HttpResponse(code))
238+
Err(Error::HttpResponse {
239+
status: code,
240+
message: resp.into_string()?,
241+
})
216242
}
217243
Err(e) => Err(Error::Ureq(e)),
218244
}
@@ -231,11 +257,14 @@ impl BlockingClient {
231257

232258
match resp {
233259
Ok(resp) => Ok(Some(resp.into_json()?)),
234-
Err(ureq::Error::Status(code, _)) => {
260+
Err(ureq::Error::Status(code, resp)) => {
235261
if is_status_not_found(code) {
236262
return Ok(None);
237263
}
238-
Err(Error::HttpResponse(code))
264+
Err(Error::HttpResponse {
265+
status: code,
266+
message: resp.into_string()?,
267+
})
239268
}
240269
Err(e) => Err(Error::Ureq(e)),
241270
}
@@ -250,7 +279,10 @@ impl BlockingClient {
250279

251280
match resp {
252281
Ok(_) => Ok(()), // We do not return the txid?
253-
Err(ureq::Error::Status(code, _)) => Err(Error::HttpResponse(code)),
282+
Err(ureq::Error::Status(code, resp)) => Err(Error::HttpResponse {
283+
status: code,
284+
message: resp.into_string()?,
285+
}),
254286
Err(e) => Err(Error::Ureq(e)),
255287
}
256288
}
@@ -264,7 +296,10 @@ impl BlockingClient {
264296

265297
match resp {
266298
Ok(resp) => Ok(resp.into_string()?.parse()?),
267-
Err(ureq::Error::Status(code, _)) => Err(Error::HttpResponse(code)),
299+
Err(ureq::Error::Status(code, resp)) => Err(Error::HttpResponse {
300+
status: code,
301+
message: resp.into_string()?,
302+
}),
268303
Err(e) => Err(Error::Ureq(e)),
269304
}
270305
}
@@ -298,7 +333,10 @@ impl BlockingClient {
298333
fn process_block_result(response: Result<Response, ureq::Error>) -> Result<BlockHash, Error> {
299334
match response {
300335
Ok(resp) => Ok(BlockHash::from_str(&resp.into_string()?)?),
301-
Err(ureq::Error::Status(code, _)) => Err(Error::HttpResponse(code)),
336+
Err(ureq::Error::Status(code, resp)) => Err(Error::HttpResponse {
337+
status: code,
338+
message: resp.into_string()?,
339+
}),
302340
Err(e) => Err(Error::Ureq(e)),
303341
}
304342
}
@@ -316,7 +354,10 @@ impl BlockingClient {
316354
let map: HashMap<String, f64> = resp.into_json()?;
317355
Ok(map)
318356
}
319-
Err(ureq::Error::Status(code, _)) => Err(Error::HttpResponse(code)),
357+
Err(ureq::Error::Status(code, resp)) => Err(Error::HttpResponse {
358+
status: code,
359+
message: resp.into_string()?,
360+
}),
320361
Err(e) => Err(Error::Ureq(e)),
321362
}?;
322363

@@ -390,7 +431,13 @@ fn into_bytes(resp: Response) -> Result<Vec<u8>, io::Error> {
390431
impl From<ureq::Error> for Error {
391432
fn from(e: ureq::Error) -> Self {
392433
match e {
393-
ureq::Error::Status(code, _) => Error::HttpResponse(code),
434+
ureq::Error::Status(code, resp) => match resp.into_string() {
435+
Ok(msg) => Error::HttpResponse {
436+
status: code,
437+
message: msg,
438+
},
439+
Err(e) => Error::Io(e),
440+
},
394441
e => Error::Ureq(e),
395442
}
396443
}

src/lib.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ pub enum Error {
162162
#[cfg(feature = "async")]
163163
Reqwest(::reqwest::Error),
164164
/// HTTP response error
165-
HttpResponse(u16),
165+
HttpResponse { status: u16, message: String },
166166
/// IO error during ureq response read
167167
Io(io::Error),
168168
/// No header found in ureq response
@@ -223,8 +223,7 @@ mod test {
223223
bitcoin::hashes::Hash,
224224
bitcoin::Amount,
225225
electrsd::{
226-
bitcoind::bitcoincore_rpc::json::AddressType,
227-
bitcoind::bitcoincore_rpc::RpcApi,
226+
bitcoind::bitcoincore_rpc::json::AddressType, bitcoind::bitcoincore_rpc::RpcApi,
228227
electrum_client::ElectrumApi,
229228
},
230229
std::time::Duration,

0 commit comments

Comments
 (0)