From: Richard Whitehouse Date: Mon, 22 Oct 2018 13:17:30 +0000 (-0400) Subject: Move Message into a separate module X-Git-Url: https://git.richardwhiuk.com/?a=commitdiff_plain;h=54793ee6fb655f91034526b68b42f55e414d1033;p=rust-sip.git Move Message into a separate module --- diff --git a/src/codec/mod.rs b/src/codec/mod.rs index 63804bb..cb6244a 100644 --- a/src/codec/mod.rs +++ b/src/codec/mod.rs @@ -7,9 +7,9 @@ use tokio_io::codec::{Decoder, Encoder}; mod chartype; use self::chartype::{chartype, CharType, CR, LF}; +use message::Message; use parser::header; -use parser::top_line; -use types::{Header, Method, RequestLine, StatusLine, TopLine}; +use types::Header; impl Header { fn parse(line: UnparsedLine) -> Option<(Header, UnparsedLine)> { @@ -24,7 +24,7 @@ impl Header { } #[derive(Clone, Debug)] -struct UnparsedLine { +pub struct UnparsedLine { value: BytesMut, } @@ -37,7 +37,7 @@ impl UnparsedLine { self.value.extend_from_slice(value); } - fn as_bytes(&self) -> &[u8] { + pub fn as_bytes(&self) -> &[u8] { &self.value } } @@ -197,9 +197,9 @@ impl SipCodec { } #[derive(Debug)] -struct PartialMessage { - headers: Vec<(Header, UnparsedLine)>, - top_line: UnparsedLine, +pub struct PartialMessage { + pub headers: Vec<(Header, UnparsedLine)>, + pub top_line: UnparsedLine, } impl PartialMessage { @@ -223,78 +223,6 @@ impl PartialMessage { } } -#[derive(Debug)] -pub enum Message { - Request(Request), - Response(Response), -} - -#[derive(Debug)] -pub struct Response { - status_line: (StatusLine, UnparsedLine), - headers: Vec<(Header, UnparsedLine)>, - body: Option, -} - -impl Response { - fn as_bytes(&self) -> &[u8] { - return self.status_line.1.as_bytes(); - } -} - -#[derive(Debug)] -pub struct Request { - request_line: (RequestLine, UnparsedLine), - headers: Vec<(Header, UnparsedLine)>, - body: Option, -} - -impl Request { - fn as_bytes(&self) -> &[u8] { - return self.request_line.1.as_bytes(); - } - - pub fn method(&self) -> &Method { - &self.request_line.0.method - } -} - -impl Message { - fn new(message: PartialMessage) -> Option { - Message::parse(message, None) - } - - fn parse(message: PartialMessage, body: Option) -> Option { - match top_line(message.top_line.as_bytes()) { - nom::IResult::Done(_, TopLine::RequestLine(r)) => Some(Message::Request(Request { - headers: message.headers, - request_line: (r, message.top_line.clone()), - body: body, - })), - nom::IResult::Done(_, TopLine::StatusLine(s)) => Some(Message::Response(Response { - headers: message.headers, - status_line: (s, message.top_line.clone()), - body: body, - })), - result => { - warn!("Failed to parse top line: {:?}", result); - None - } - } - } - - fn new_with_body(message: PartialMessage, body: BytesMut) -> Option { - Message::parse(message, Some(body)) - } - - fn as_bytes<'a>(&'a self) -> &'a [u8] { - match self { - &Message::Request(ref r) => r.as_bytes(), - &Message::Response(ref r) => r.as_bytes(), - } - } -} - impl Decoder for SipCodec { type Item = Message; type Error = io::Error; diff --git a/src/lib.rs b/src/lib.rs index 10161b3..1446ef7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,6 +12,7 @@ extern crate log; extern crate nom; mod codec; +mod message; mod parser; pub mod server; mod types; diff --git a/src/message.rs b/src/message.rs new file mode 100644 index 0000000..e3e01e2 --- /dev/null +++ b/src/message.rs @@ -0,0 +1,78 @@ +use bytes::BytesMut; +use nom; + +use codec::{PartialMessage, UnparsedLine}; +use parser::top_line; +use types::{Header, Method, RequestLine, StatusLine, TopLine}; + +#[derive(Debug)] +pub enum Message { + Request(Request), + Response(Response), +} + +impl Message { + pub fn new(message: PartialMessage) -> Option { + Message::parse(message, None) + } + + pub fn new_with_body(message: PartialMessage, body: BytesMut) -> Option { + Message::parse(message, Some(body)) + } + + pub fn parse(message: PartialMessage, body: Option) -> Option { + match top_line(message.top_line.as_bytes()) { + nom::IResult::Done(_, TopLine::RequestLine(r)) => Some(Message::Request(Request { + headers: message.headers, + request_line: (r, message.top_line.clone()), + body: body, + })), + nom::IResult::Done(_, TopLine::StatusLine(s)) => Some(Message::Response(Response { + headers: message.headers, + status_line: (s, message.top_line.clone()), + body: body, + })), + result => { + warn!("Failed to parse top line: {:?}", result); + None + } + } + } + + pub fn as_bytes<'a>(&'a self) -> &'a [u8] { + match self { + &Message::Request(ref r) => r.as_bytes(), + &Message::Response(ref r) => r.as_bytes(), + } + } +} + +#[derive(Debug)] +pub struct Response { + status_line: (StatusLine, UnparsedLine), + headers: Vec<(Header, UnparsedLine)>, + body: Option, +} + +impl Response { + pub fn as_bytes(&self) -> &[u8] { + return self.status_line.1.as_bytes(); + } +} + +#[derive(Debug)] +pub struct Request { + request_line: (RequestLine, UnparsedLine), + headers: Vec<(Header, UnparsedLine)>, + body: Option, +} + +impl Request { + pub fn as_bytes(&self) -> &[u8] { + return self.request_line.1.as_bytes(); + } + + pub fn method(&self) -> &Method { + &self.request_line.0.method + } +} diff --git a/src/server.rs b/src/server.rs index a40b3ce..030952b 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,4 +1,3 @@ -use codec::{Message, SipCodec}; use futures::future; use futures::{Future, Stream}; use std; @@ -7,6 +6,9 @@ use tokio_core::net::TcpListener; use tokio_core::reactor::Handle; use tokio_io::codec::Decoder; +use codec::SipCodec; +use message::Message; + pub struct Sip { listeners: Vec, } @@ -69,10 +71,10 @@ mod tests { extern crate env_logger; use super::Sip; - use codec::Message; use futures; use futures::future::Either; use futures::Future; + use message::Message; use std::net::Shutdown; use std::ops::DerefMut; use std::sync::Arc;