rhymuweb 1.2.1

Common types for the Hypertext Transfer Protocol (HTTP)
Documentation
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),
}