reorder Http errors

Signed-off-by: Luminita Voicu <lumivo@amazon.com>
This commit is contained in:
Luminita Voicu
2021-07-05 14:51:11 +03:00
parent a5fdf928eb
commit 83dcfdd22b

View File

@@ -17,48 +17,48 @@ pub mod ascii {
///Errors associated with a header that is invalid.
#[derive(Debug, PartialEq)]
pub enum HttpHeaderError {
/// The header is misformatted.
InvalidFormat(String),
/// The specified header contains illegal characters.
InvalidUtf8String(Utf8Error),
///The value specified is not valid.
InvalidValue(String, String),
/// The content length specified is longer than the limit imposed by Micro Http.
SizeLimitExceeded(String),
/// The requested feature is not currently supported.
UnsupportedFeature(String, String),
/// The header specified is not supported.
UnsupportedName(String),
/// The value for the specified header is not supported.
UnsupportedValue(String, String),
/// The specified header contains illegal characters.
InvalidUtf8String(Utf8Error),
/// The requested feature is not currently supported.
UnsupportedFeature(String, String),
/// The header is misformatted.
InvalidFormat(String),
///The value specified is not valid.
InvalidValue(String, String),
}
impl Display for HttpHeaderError {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
match self {
Self::SizeLimitExceeded(inner) => {
write!(f, "Invalid content length. Header: {}", inner)
Self::InvalidFormat(header_key) => {
write!(f, "Header is incorrectly formatted. Key: {}", header_key)
}
Self::UnsupportedName(inner) => write!(f, "Unsupported header name. Key: {}", inner),
Self::UnsupportedValue(header_key, header_value) => write!(
f,
"Unsupported value. Key:{}; Value:{}",
header_key, header_value
),
Self::InvalidUtf8String(header_key) => {
write!(f, "Header contains invalid characters. Key: {}", header_key)
}
Self::InvalidValue(header_name, value) => {
write!(f, "Invalid value. Key:{}; Value:{}", header_name, value)
}
Self::SizeLimitExceeded(inner) => {
write!(f, "Invalid content length. Header: {}", inner)
}
Self::UnsupportedFeature(header_key, header_value) => write!(
f,
"Unsupported feature. Key: {}; Value: {}",
header_key, header_value
),
Self::InvalidFormat(header_key) => {
write!(f, "Header is incorrectly formatted. Key: {}", header_key)
}
Self::InvalidValue(header_name, value) => {
write!(f, "Invalid value. Key:{}; Value:{}", header_name, value)
}
Self::UnsupportedName(inner) => write!(f, "Unsupported header name. Key: {}", inner),
Self::UnsupportedValue(header_key, header_value) => write!(
f,
"Unsupported value. Key:{}; Value:{}",
header_key, header_value
),
}
}
}
@@ -68,18 +68,18 @@ impl Display for HttpHeaderError {
pub enum RequestError {
/// No request was pending while the request body was being parsed.
BodyWithoutPendingRequest,
/// Header specified is either invalid or not supported by this HTTP implementation.
HeaderError(HttpHeaderError),
/// No request was pending while the request headers were being parsed.
HeadersWithoutPendingRequest,
/// The HTTP Method is not supported or it is invalid.
InvalidHttpMethod(&'static str),
/// Request URI is invalid.
InvalidUri(&'static str),
/// The HTTP Version in the Request is not supported or it is invalid.
InvalidHttpVersion(&'static str),
/// Header specified is either invalid or not supported by this HTTP implementation.
HeaderError(HttpHeaderError),
/// The Request is invalid and cannot be served.
InvalidRequest,
/// Request URI is invalid.
InvalidUri(&'static str),
/// Overflow occurred when parsing a request.
Overflow,
/// Underflow occurred when parsing a request.
@@ -93,15 +93,15 @@ impl Display for RequestError {
f,
"No request was pending while the request body was being parsed."
),
Self::HeaderError(inner) => write!(f, "Invalid header. Reason: {}", inner),
Self::HeadersWithoutPendingRequest => write!(
f,
"No request was pending while the request headers were being parsed."
),
Self::InvalidHttpMethod(inner) => write!(f, "Invalid HTTP Method: {}", inner),
Self::InvalidUri(inner) => write!(f, "Invalid URI: {}", inner),
Self::InvalidHttpVersion(inner) => write!(f, "Invalid HTTP Version: {}", inner),
Self::HeaderError(inner) => write!(f, "Invalid header. Reason: {}", inner),
Self::InvalidRequest => write!(f, "Invalid request."),
Self::InvalidUri(inner) => write!(f, "Invalid URI: {}", inner),
Self::Overflow => write!(f, "Overflow occurred when parsing a request."),
Self::Underflow => write!(f, "Underflow occurred when parsing a request."),
}
@@ -111,23 +111,23 @@ impl Display for RequestError {
/// Errors associated with a HTTP Connection.
#[derive(Debug)]
pub enum ConnectionError {
/// The request parsing has failed.
ParseError(RequestError),
/// Could not perform a stream operation successfully.
StreamError(std::io::Error),
/// Attempted to read or write on a closed connection.
ConnectionClosed,
/// Attempted to write on a stream when there was nothing to write.
InvalidWrite,
/// The request parsing has failed.
ParseError(RequestError),
/// Could not perform a stream operation successfully.
StreamError(std::io::Error),
}
impl Display for ConnectionError {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
match self {
Self::ParseError(inner) => write!(f, "Parsing error: {}", inner),
Self::StreamError(inner) => write!(f, "Stream error: {}", inner),
Self::ConnectionClosed => write!(f, "Connection closed."),
Self::InvalidWrite => write!(f, "Invalid write attempt."),
Self::ParseError(inner) => write!(f, "Parsing error: {}", inner),
Self::StreamError(inner) => write!(f, "Stream error: {}", inner),
}
}
}
@@ -151,14 +151,14 @@ impl Display for RouteError {
/// Errors pertaining to `HttpServer`.
#[derive(Debug)]
pub enum ServerError {
/// Epoll operations failed.
IOError(std::io::Error),
/// Error from one of the connections.
ConnectionError(ConnectionError),
/// Server maximum capacity has been reached.
ServerFull,
/// Epoll operations failed.
IOError(std::io::Error),
/// Overflow occured while processing messages.
Overflow,
/// Server maximum capacity has been reached.
ServerFull,
/// Underflow occured while processing mesagges.
Underflow,
}
@@ -166,10 +166,10 @@ pub enum ServerError {
impl Display for ServerError {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
match self {
Self::IOError(inner) => write!(f, "IO error: {}", inner),
Self::ConnectionError(inner) => write!(f, "Connection error: {}", inner),
Self::ServerFull => write!(f, "Server is full."),
Self::IOError(inner) => write!(f, "IO error: {}", inner),
Self::Overflow => write!(f, "Overflow occured while processing messages."),
Self::ServerFull => write!(f, "Server is full."),
Self::Underflow => write!(f, "Underflow occured while processing messages."),
}
}
@@ -416,6 +416,23 @@ mod tests {
#[test]
fn test_display_header_error() {
assert_eq!(
format!(
"{}",
RequestError::HeaderError(HttpHeaderError::InvalidFormat("test".to_string()))
),
"Invalid header. Reason: Header is incorrectly formatted. Key: test"
);
let value = String::from_utf8(vec![0, 159]);
assert_eq!(
format!(
"{}",
RequestError::HeaderError(HttpHeaderError::InvalidUtf8String(
value.unwrap_err().utf8_error()
))
),
"Invalid header. Reason: Header contains invalid characters. Key: invalid utf-8 sequence of 1 bytes from index 1"
);
assert_eq!(
format!(
"{}",
@@ -423,6 +440,16 @@ mod tests {
),
"Invalid header. Reason: Invalid content length. Header: test"
);
assert_eq!(
format!(
"{}",
RequestError::HeaderError(HttpHeaderError::UnsupportedFeature(
"test".to_string(),
"test".to_string()
))
),
"Invalid header. Reason: Unsupported feature. Key: test; Value: test"
);
assert_eq!(
format!(
"{}",
@@ -440,37 +467,14 @@ mod tests {
),
"Invalid header. Reason: Unsupported value. Key:test; Value:test"
);
let value = String::from_utf8(vec![0, 159]);
assert_eq!(
format!(
"{}",
RequestError::HeaderError(HttpHeaderError::InvalidUtf8String(
value.unwrap_err().utf8_error()
))
),
"Invalid header. Reason: Header contains invalid characters. Key: invalid utf-8 sequence of 1 bytes from index 1"
);
assert_eq!(
format!(
"{}",
RequestError::HeaderError(HttpHeaderError::UnsupportedFeature(
"test".to_string(),
"test".to_string()
))
),
"Invalid header. Reason: Unsupported feature. Key: test; Value: test"
);
assert_eq!(
format!(
"{}",
RequestError::HeaderError(HttpHeaderError::InvalidFormat("test".to_string()))
),
"Invalid header. Reason: Header is incorrectly formatted. Key: test"
);
}
#[test]
fn test_display_connection_error() {
assert_eq!(
format!("{}", ConnectionError::ConnectionClosed),
"Connection closed."
);
assert_eq!(
format!(
"{}",
@@ -478,6 +482,10 @@ mod tests {
),
"Parsing error: Invalid request."
);
assert_eq!(
format!("{}", ConnectionError::InvalidWrite),
"Invalid write attempt."
);
assert_eq!(
format!(
"{}",
@@ -485,14 +493,6 @@ mod tests {
),
"Stream error: Resource temporarily unavailable (os error 11)"
);
assert_eq!(
format!("{}", ConnectionError::ConnectionClosed),
"Connection closed."
);
assert_eq!(
format!("{}", ConnectionError::InvalidWrite),
"Invalid write attempt."
);
}
#[test]
@@ -504,7 +504,6 @@ mod tests {
),
"Connection error: Connection closed."
);
assert_eq!(format!("{}", ServerError::ServerFull), "Server is full.");
assert_eq!(
format!(
"{}",
@@ -516,6 +515,7 @@ mod tests {
format!("{}", ServerError::Overflow),
"Overflow occured while processing messages."
);
assert_eq!(format!("{}", ServerError::ServerFull), "Server is full.");
assert_eq!(
format!("{}", ServerError::Underflow),
"Underflow occured while processing messages."