1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
use std::str::Utf8Error;

/// This is the enumeration of all the different kinds of errors which this
/// crate generates.
#[derive(Debug, thiserror::Error)]
pub enum Error {
    /// There was an error attempting to decode the body.
    #[error("unable to decode response body")]
    BadContentEncoding(#[source] std::io::Error),

    /// The attached bytes did not parse as valid chunk size text.
    #[error("chunk size line is not valid text")]
    ChunkSizeLineNotValidText {
        /// These are the bytes that did not parse as valid chunk size text.
        chunk_size_line: Vec<u8>,

        /// This is the source of the parsing error.
        #[source]
        source: Utf8Error,
    },

    /// An error occurred with the message headers.
    #[error("Error in headers")]
    Headers(#[source] rhymessage::Error),

    /// A chunk size in the body was invalid.
    #[error("invalid chunk size value")]
    InvalidChunkSize(std::num::ParseIntError),

    /// The attached bytes appeared after the end of a chunk
    /// in the place where a carriage-return and line-feed were expected.
    #[error("unexpected extra junk at the end of a chunk")]
    InvalidChunkTerminator(Vec<u8>),

    /// The `Content-Length` header value is not valid.
    #[error("invalid Content-Length header value")]
    InvalidContentLength(std::num::ParseIntError),

    /// The status code in the status line is not valid.
    #[error("invalid status code")]
    InvalidStatusCode(std::num::ParseIntError),

    /// The message is too large to fit within the configured size limit.
    #[error("message exceeds maximum size limit")]
    MessageTooLong,

    /// No delimiter was found to parse the method from the attached HTTP
    /// request line.
    #[error("unable to find method delimiter in request line")]
    RequestLineNoMethodDelimiter(String),

    /// The method could not be parsed from the HTTP request line attached.
    /// Either there is extra whitespace, or the method is an empty string.
    #[error("unable to parse method from request line")]
    RequestLineNoMethodOrExtraWhitespace(String),

    /// No delimiter was found to parse the target URI from the attached HTTP
    /// request line.
    #[error("unable to find target URI delimiter in request line")]
    RequestLineNoTargetDelimiter(String),

    /// The target URI could not be parsed from the HTTP request line attached.
    /// Either there is extra whitespace, or the target URI is an empty string.
    #[error("unable to parse target URI from request line")]
    RequestLineNoTargetOrExtraWhitespace(String),

    /// The attached bytes did not parse as valid text for the HTTP request
    /// line.
    #[error("request line is not valid text")]
    RequestLineNotValidText {
        /// These are the bytes that did not parse as valid request line text.
        request_line: Vec<u8>,

        /// This is the source of the parsing error.
        #[source]
        source: Utf8Error,
    },

    /// The protocol is unrecognized or could not be parsed from the HTTP
    /// request line attached.
    #[error("unrecognized protocol in request line")]
    RequestLineProtocol(String),

    /// The attached bytes are the beginning of the request line, whose length
    /// exceeds the request line limit.
    #[error("request line too long")]
    RequestLineTooLong(Vec<u8>),

    /// The request line contained an invalid target URI.
    #[error("invalid request target URI")]
    RequestTargetUriInvalid(#[from] rhymuri::Error),

    /// The attached status code was out of range.
    #[error("status code is out of range")]
    StatusCodeOutOfRange(usize),

    /// No delimiter was found to parse the protocol from the attached HTTP
    /// status line.
    #[error("unable to find protocol delimiter in status line")]
    StatusLineNoProtocolDelimiter(String),

    /// No delimiter was found to parse the status code from the attached HTTP
    /// status line.
    #[error("unable to parse status code from status line")]
    StatusLineNoStatusCodeDelimiter(String),

    /// The attached bytes did not parse as valid text for the HTTP status
    /// line.
    #[error("status line is not valid text")]
    StatusLineNotValidText {
        /// These are the bytes that did not parse as valid status line text.
        status_line: Vec<u8>,

        /// This is the source of the parsing error.
        #[source]
        source: Utf8Error,
    },

    /// The protocol is unrecognized or could not be parsed from the HTTP
    /// status line attached.
    #[error("unrecognized protocol in status line")]
    StatusLineProtocol(String),

    /// An error occurred during string formatting.
    #[error("error during string format")]
    StringFormat(#[from] std::io::Error),

    /// An error occurred with the message trailer.
    #[error("Error in trailer")]
    Trailer(#[source] rhymessage::Error),
}