- When receiving, return a PROTOCOL_ERROR. - When sending, return a user error about malformed headers. Closes #36
138 lines
3.2 KiB
Rust
138 lines
3.2 KiB
Rust
use frame::{Reason, StreamId};
|
|
|
|
use std::{error, fmt, io};
|
|
|
|
/// Errors that are received
|
|
#[derive(Debug)]
|
|
pub enum RecvError {
|
|
Connection(Reason),
|
|
Stream { id: StreamId, reason: Reason },
|
|
Io(io::Error),
|
|
}
|
|
|
|
/// Errors caused by sending a message
|
|
#[derive(Debug)]
|
|
pub enum SendError {
|
|
/// User error
|
|
User(UserError),
|
|
|
|
/// Connection error prevents sending.
|
|
Connection(Reason),
|
|
|
|
/// I/O error
|
|
Io(io::Error),
|
|
}
|
|
|
|
/// Errors caused by users of the library
|
|
#[derive(Debug)]
|
|
pub enum UserError {
|
|
/// The stream ID is no longer accepting frames.
|
|
InactiveStreamId,
|
|
|
|
/// The stream is not currently expecting a frame of this type.
|
|
UnexpectedFrameType,
|
|
|
|
/// The payload size is too big
|
|
PayloadTooBig,
|
|
|
|
/// The application attempted to initiate too many streams to remote.
|
|
Rejected,
|
|
|
|
/// The released capacity is larger than claimed capacity.
|
|
ReleaseCapacityTooBig,
|
|
/// The stream ID space is overflowed.
|
|
///
|
|
/// A new connection is needed.
|
|
OverflowedStreamId,
|
|
|
|
/// Illegal headers, such as connection-specific headers.
|
|
MalformedHeaders,
|
|
}
|
|
|
|
// ===== impl RecvError =====
|
|
|
|
impl From<io::Error> for RecvError {
|
|
fn from(src: io::Error) -> Self {
|
|
RecvError::Io(src)
|
|
}
|
|
}
|
|
|
|
impl error::Error for RecvError {
|
|
fn description(&self) -> &str {
|
|
use self::RecvError::*;
|
|
|
|
match *self {
|
|
Connection(ref reason) => reason.description(),
|
|
Stream {
|
|
ref reason, ..
|
|
} => reason.description(),
|
|
Io(ref e) => e.description(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for RecvError {
|
|
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
|
use std::error::Error;
|
|
write!(fmt, "{}", self.description())
|
|
}
|
|
}
|
|
|
|
// ===== impl SendError =====
|
|
|
|
impl error::Error for SendError {
|
|
fn description(&self) -> &str {
|
|
use self::SendError::*;
|
|
|
|
match *self {
|
|
User(ref e) => e.description(),
|
|
Connection(ref reason) => reason.description(),
|
|
Io(ref e) => e.description(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for SendError {
|
|
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
|
use std::error::Error;
|
|
write!(fmt, "{}", self.description())
|
|
}
|
|
}
|
|
|
|
impl From<io::Error> for SendError {
|
|
fn from(src: io::Error) -> Self {
|
|
SendError::Io(src)
|
|
}
|
|
}
|
|
|
|
impl From<UserError> for SendError {
|
|
fn from(src: UserError) -> Self {
|
|
SendError::User(src)
|
|
}
|
|
}
|
|
|
|
// ===== impl UserError =====
|
|
|
|
impl error::Error for UserError {
|
|
fn description(&self) -> &str {
|
|
use self::UserError::*;
|
|
|
|
match *self {
|
|
InactiveStreamId => "inactive stream",
|
|
UnexpectedFrameType => "unexpected frame type",
|
|
PayloadTooBig => "payload too big",
|
|
Rejected => "rejected",
|
|
ReleaseCapacityTooBig => "release capacity too big",
|
|
OverflowedStreamId => "stream ID overflowed",
|
|
MalformedHeaders => "malformed headers",
|
|
}
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for UserError {
|
|
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
|
use std::error::Error;
|
|
write!(fmt, "{}", self.description())
|
|
}
|
|
}
|