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)> {
}
#[derive(Clone, Debug)]
-struct UnparsedLine {
+pub struct UnparsedLine {
value: BytesMut,
}
self.value.extend_from_slice(value);
}
- fn as_bytes(&self) -> &[u8] {
+ pub fn as_bytes(&self) -> &[u8] {
&self.value
}
}
}
#[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 {
}
}
-#[derive(Debug)]
-pub enum Message {
- Request(Request),
- Response(Response),
-}
-
-#[derive(Debug)]
-pub struct Response {
- status_line: (StatusLine, UnparsedLine),
- headers: Vec<(Header, UnparsedLine)>,
- body: Option<BytesMut>,
-}
-
-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<BytesMut>,
-}
-
-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> {
- Message::parse(message, None)
- }
-
- fn parse(message: PartialMessage, body: Option<BytesMut>) -> Option<Message> {
- 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> {
- 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;
--- /dev/null
+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> {
+ Message::parse(message, None)
+ }
+
+ pub fn new_with_body(message: PartialMessage, body: BytesMut) -> Option<Message> {
+ Message::parse(message, Some(body))
+ }
+
+ pub fn parse(message: PartialMessage, body: Option<BytesMut>) -> Option<Message> {
+ 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<BytesMut>,
+}
+
+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<BytesMut>,
+}
+
+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
+ }
+}