improve errors

This commit is contained in:
nora 2022-02-28 16:46:50 +01:00
parent 232c1d2830
commit 2be26f7e49
3 changed files with 68 additions and 10 deletions

View file

@ -16,48 +16,105 @@ pub enum ProtocolError {
#[derive(Debug, thiserror::Error)]
pub enum ConException {
#[error("320 Connection forced")]
ConnectionForced,
#[error("402 Invalid path")]
InvalidPath,
#[error("501 Frame error")]
FrameError,
#[error("503 Command invalid")]
CommandInvalid,
#[error("503 Syntax error | {0:?}")]
#[error("502 Syntax error | {0:?}")]
/// A method was received but there was a syntax error. The string stores where it occurred.
SyntaxError(Vec<String>),
#[error("503 Command invalid")]
CommandInvalid,
#[error("504 Channel error")]
ChannelError,
#[error("505 Unexpected Frame")]
UnexpectedFrame,
#[error("506 Resource Error")]
ResourceError,
#[error("530 Not allowed")]
NotAllowed,
#[error("540 Not implemented. '{0}'")]
NotImplemented(&'static str),
#[error("xxx Not decided yet")]
#[error("541 Internal error")]
InternalError,
#[error("xxx Todo")]
Todo,
}
impl ConException {
pub fn reply_code(&self) -> ReplyCode {
match self {
ConException::ConnectionForced => 320,
ConException::InvalidPath => 402,
ConException::FrameError => 501,
ConException::CommandInvalid => 503,
ConException::SyntaxError(_) => 503,
ConException::ChannelError => 504,
ConException::UnexpectedFrame => 505,
ConException::ResourceError => 506,
ConException::NotAllowed => 530,
ConException::InternalError => 541,
ConException::NotImplemented(_) => 540,
ConException::Todo => 0,
}
}
pub fn reply_text(&self) -> ReplyText {
"cant be bothered yet".to_string() // todo
match self {
ConException::ConnectionForced => "connection-forced",
ConException::InvalidPath => "invalid-path",
ConException::FrameError => "frame-error",
ConException::SyntaxError(_) => "syntax-error",
ConException::CommandInvalid => "command-invalid",
ConException::ChannelError => "channel-error",
ConException::UnexpectedFrame => "unexpected-frame",
ConException::ResourceError => "resource-error",
ConException::NotAllowed => "not-allowed",
ConException::NotImplemented(_) => "not-implemented",
ConException::InternalError => "internal-error",
ConException::Todo => "todo",
}
.to_owned()
}
}
#[derive(Debug, thiserror::Error)]
pub enum ChannelException {}
pub enum ChannelException {
#[error("311 Content too large")]
ContentTooLarge,
#[error("313 No consumers")]
NoConsumers,
#[error("403 Access refused")]
AccessRefused,
#[error("404 Not found")]
NotFound,
#[error("405 Resource locked")]
ResourceLocked,
#[error("406 Precondition failed")]
PreconditionFailed,
}
impl ChannelException {
pub fn reply_code(&self) -> ReplyCode {
todo!()
match self {
ChannelException::ContentTooLarge => 311,
ChannelException::NoConsumers => 313,
ChannelException::AccessRefused => 403,
ChannelException::NotFound => 404,
ChannelException::ResourceLocked => 405,
ChannelException::PreconditionFailed => 406,
}
}
pub fn reply_text(&self) -> ReplyText {
todo!()
match self {
ChannelException::ContentTooLarge => "content-too-large",
ChannelException::NoConsumers => "no-consumers",
ChannelException::AccessRefused => "access-refused",
ChannelException::NotFound => "not-found",
ChannelException::ResourceLocked => "resource-locked",
ChannelException::PreconditionFailed => "precondition-failed",
}
.to_owned()
}
}

View file

@ -102,7 +102,7 @@ impl Connection {
/* do nothing, remove below */
}
Err(TransError::Protocol(ProtocolError::ConException(ex))) => {
warn!(%ex, "Connection exception occured. This indicates a faulty client.");
warn!(%ex, "Connection exception occurred. This indicates a faulty client.");
if let Err(err) = self
.send_method(
ChannelNum::zero(),
@ -262,6 +262,7 @@ impl Connection {
match result {
Ok(()) => {}
Err(TransError::Protocol(ProtocolError::ChannelException(ex))) => {
warn!(%ex, "Channel exception occurred");
self.send_method(
channel,
Method::ChannelClose(ChannelClose {

View file

@ -6,7 +6,7 @@ const connection = await connectAmqp();
const channel = await connection.createChannel();
const reply = await channel.assertQueue(queueName, { durable: true });
const reply = await channel.assertQueue(queueName, { durable: false });
assert(reply.messageCount === 0, 'Message found in queue');
assert(reply.consumerCount === 0, 'Consumer listening on queue');