Skip to main content

async_http_range_reader/
error.rs

1use std::sync::Arc;
2
3/// Error type used for [`crate::AsyncHttpRangeReader`]
4#[derive(Clone, Debug, thiserror::Error)]
5#[non_exhaustive]
6pub enum AsyncHttpRangeReaderError {
7    /// The server does not support range requests
8    #[error("range requests are not supported")]
9    HttpRangeRequestUnsupported,
10
11    /// Other HTTP error
12    #[error(transparent)]
13    HttpError(#[from] Arc<reqwest_middleware::Error>),
14
15    /// An error occurred during transport
16    #[error("an error occurred during transport: {0}")]
17    TransportError(#[source] Arc<reqwest_middleware::Error>),
18
19    /// An IO error occurred
20    #[error("io error occurred: {0}")]
21    IoError(#[source] Arc<std::io::Error>),
22
23    /// Content-Range header is missing from response
24    #[error("content-range header is missing from response")]
25    ContentRangeMissing,
26
27    /// Content-Length header is missing from response
28    #[error("content-length header is missing from response")]
29    ContentLengthMissing,
30
31    /// The file is too large for this platform.
32    ///
33    /// This happens when using a file >4GB on a 32-bit platform.
34    #[error(
35        "file of {} bytes exceeds the platform limit of {} bytes",
36        _0,
37        usize::MAX
38    )]
39    FileTooLarge(u64),
40
41    /// An internal lock was poisoned by a panic
42    #[error("range cache lock poisoned")]
43    LockPoisoned,
44
45    /// Error from `http-content-range`
46    #[error("invalid Content-Range header: {0}")]
47    ContentRangeParser(String),
48
49    /// The server returned an invalid range response
50    #[error(
51        "request and response range mismatch, \
52        expected {expected_start}-{expected_end_inclusive}/{expected_complete_length}, \
53        got {actual_start}-{actual_end_inclusive}/{actual_complete_length}"
54    )]
55    RangeMismatch {
56        expected_start: u64,
57        expected_end_inclusive: u64,
58        expected_complete_length: usize,
59        actual_start: u64,
60        actual_end_inclusive: u64,
61        actual_complete_length: u64,
62    },
63
64    /// The server returned more bytes than the range request asked for
65    #[error("range response returned more than the expected {expected} bytes")]
66    ResponseTooLong { expected: u64 },
67
68    /// The server returned fewer bytes than the range request asked for
69    #[error("expected {expected} bytes from range response, got {actual}")]
70    ResponseTooShort { expected: u64, actual: u64 },
71
72    /// The download task stopped before completing the requested range
73    #[error("range download task stopped before completing the requested range")]
74    DownloadTaskStopped,
75}
76
77impl From<std::io::Error> for AsyncHttpRangeReaderError {
78    fn from(err: std::io::Error) -> Self {
79        AsyncHttpRangeReaderError::IoError(Arc::new(err))
80    }
81}
82
83impl From<reqwest_middleware::Error> for AsyncHttpRangeReaderError {
84    fn from(err: reqwest_middleware::Error) -> Self {
85        AsyncHttpRangeReaderError::TransportError(Arc::new(err))
86    }
87}
88
89impl From<reqwest::Error> for AsyncHttpRangeReaderError {
90    fn from(err: reqwest::Error) -> Self {
91        AsyncHttpRangeReaderError::TransportError(Arc::new(err.into()))
92    }
93}