Refactor errors (#46)
This patch does a bunch of refactoring, mostly around error types, but it also
paves the way to allow `Codec` to be used standalone.
* `Codec` (and `FramedRead` / `FramedWrite`) is broken out into a codec module.
* An h2-codec crate is created that re-exports the frame and codec modules.
* New error types are introduced in the internals:
  * `RecvError` represents errors caused by trying to receive a frame.
  * `SendError` represents errors caused by trying to send a frame.
  * `UserError` is an enum of potential errors caused by invalid usage
    by the user of the lib.
  * `ProtoError` is either a `Reason` or an `io::Error`. However it doesn't
    specify connection or stream level.
  * `h2::Error` is an opaque error type and is the only error type exposed
    by the public API (used to be `ConnectionError`).
There are misc code changes to enable this as well. The biggest is a new "sink"
API for `Codec`. It provides buffer which queues up a frame followed by flush
which writes everything that is queued. This departs from the `Sink` trait in
order to provide more accurate error values. For example, buffer can never fail
(but it will panic if `poll_ready` is not called first).
			
			
This commit is contained in:
		| @@ -1,5 +1,4 @@ | ||||
| use hpack; | ||||
| use error::{ConnectionError, Reason}; | ||||
|  | ||||
| use bytes::Bytes; | ||||
|  | ||||
| @@ -33,6 +32,7 @@ mod head; | ||||
| mod headers; | ||||
| mod ping; | ||||
| mod priority; | ||||
| mod reason; | ||||
| mod reset; | ||||
| mod settings; | ||||
| mod stream_id; | ||||
| @@ -45,6 +45,7 @@ pub use self::head::{Head, Kind}; | ||||
| pub use self::headers::{Headers, PushPromise, Continuation, Pseudo}; | ||||
| pub use self::ping::Ping; | ||||
| pub use self::priority::{Priority, StreamDependency}; | ||||
| pub use self::reason::Reason; | ||||
| pub use self::reset::Reset; | ||||
| pub use self::settings::Settings; | ||||
| pub use self::stream_id::StreamId; | ||||
| @@ -113,15 +114,6 @@ impl<T> fmt::Debug for Frame<T> { | ||||
| /// Errors that can occur during parsing an HTTP/2 frame. | ||||
| #[derive(Debug, Clone, PartialEq, Eq)] | ||||
| pub enum Error { | ||||
|     /// A full frame header was not passed. | ||||
|     Short, | ||||
|  | ||||
|     /// An unsupported value was set for the flag value. | ||||
|     BadFlag, | ||||
|  | ||||
|     /// An unsupported value was set for the frame kind. | ||||
|     BadKind, | ||||
|  | ||||
|     /// A length value other than 8 was set on a PING message. | ||||
|     BadFrameSize, | ||||
|  | ||||
| @@ -129,19 +121,6 @@ pub enum Error { | ||||
|     /// length of the payload. | ||||
|     TooMuchPadding, | ||||
|  | ||||
|     /// The payload length specified by the frame header was shorter than | ||||
|     /// necessary for the parser settings specified and the frame type. | ||||
|     /// | ||||
|     /// This happens if, for instance, the priority flag is set and the | ||||
|     /// header length is shorter than a stream dependency. | ||||
|     /// | ||||
|     /// `PayloadLengthTooShort` should be treated as a protocol error. | ||||
|     PayloadLengthTooShort, | ||||
|  | ||||
|     /// The payload length specified by the frame header of a settings frame | ||||
|     /// was not a round multiple of the size of a single setting. | ||||
|     PartialSettingLength, | ||||
|  | ||||
|     /// An invalid setting value was provided | ||||
|     InvalidSettingValue, | ||||
|  | ||||
| @@ -173,14 +152,3 @@ pub enum Error { | ||||
|     /// Failed to perform HPACK decoding | ||||
|     Hpack(hpack::DecoderError), | ||||
| } | ||||
|  | ||||
| // ===== impl Error ===== | ||||
|  | ||||
| impl From<Error> for ConnectionError { | ||||
|     fn from(src: Error) -> ConnectionError { | ||||
|         match src { | ||||
|             // TODO: implement | ||||
|             _ => ConnectionError::Proto(Reason::ProtocolError), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user