|
1 | | -use crate::http::{BinaryResponse, JsonResponse}; |
| 1 | +use crate::http::{BinaryResponse, HttpClientError, JsonResponse}; |
| 2 | +#[cfg(feature = "rpc-client")] |
| 3 | +use crate::rpc::RpcClientError; |
2 | 4 | use crate::utils::hex_to_work; |
3 | 5 | use crate::{BlockHeaderData, BlockSourceError}; |
4 | 6 |
|
@@ -35,6 +37,48 @@ impl From<io::Error> for BlockSourceError { |
35 | 37 | } |
36 | 38 | } |
37 | 39 |
|
| 40 | +/// Conversion from `HttpClientError` into `BlockSourceError`. |
| 41 | +impl From<HttpClientError> for BlockSourceError { |
| 42 | + fn from(e: HttpClientError) -> BlockSourceError { |
| 43 | + match &e { |
| 44 | + // Transport errors (connection, timeout, etc.) are transient |
| 45 | + HttpClientError::Transport(_) => BlockSourceError::transient(e), |
| 46 | + // HTTP non-2xx errors are transient - e.g. "not found" must not stop polling |
| 47 | + HttpClientError::Http(_) => BlockSourceError::transient(e), |
| 48 | + // I/O errors follow the same logic as std::io::Error |
| 49 | + HttpClientError::Io(io_error) => match io_error.kind() { |
| 50 | + io::ErrorKind::InvalidData => BlockSourceError::persistent(e), |
| 51 | + io::ErrorKind::InvalidInput => BlockSourceError::persistent(e), |
| 52 | + _ => BlockSourceError::transient(e), |
| 53 | + }, |
| 54 | + } |
| 55 | + } |
| 56 | +} |
| 57 | + |
| 58 | +/// Conversion from `RpcClientError` into `BlockSourceError`. |
| 59 | +#[cfg(feature = "rpc-client")] |
| 60 | +impl From<RpcClientError> for BlockSourceError { |
| 61 | + fn from(e: RpcClientError) -> BlockSourceError { |
| 62 | + match &e { |
| 63 | + RpcClientError::Http(http_error) => match http_error { |
| 64 | + HttpClientError::Transport(_) => BlockSourceError::transient(e), |
| 65 | + // HTTP non-2xx errors are transient |
| 66 | + HttpClientError::Http(_) => BlockSourceError::transient(e), |
| 67 | + HttpClientError::Io(io_error) => match io_error.kind() { |
| 68 | + io::ErrorKind::InvalidData => BlockSourceError::persistent(e), |
| 69 | + io::ErrorKind::InvalidInput => BlockSourceError::persistent(e), |
| 70 | + _ => BlockSourceError::transient(e), |
| 71 | + }, |
| 72 | + }, |
| 73 | + // RPC errors are transient |
| 74 | + // e.g. "block not found" should not stop polling |
| 75 | + RpcClientError::Rpc(_) => BlockSourceError::transient(e), |
| 76 | + // Malformed response data is persistent |
| 77 | + RpcClientError::InvalidData(_) => BlockSourceError::persistent(e), |
| 78 | + } |
| 79 | + } |
| 80 | +} |
| 81 | + |
38 | 82 | /// Parses binary data as a block. |
39 | 83 | impl TryInto<Block> for BinaryResponse { |
40 | 84 | type Error = io::Error; |
|
0 commit comments