use self::chartype::{chartype, CharType, CR, LF};
use message::Message;
-use parser::header;
-use types::Header;
+use parser::{header, top_line};
+use types::{Header, TopLine};
impl Header {
fn parse(line: UnparsedLine) -> Option<(Header, UnparsedLine)> {
let length = new_message.body_length();
if length == 0 {
- if let Some(message) = Message::new(new_message) {
+ if let Some(message) = new_message.into_message(None) {
debug!("Got message without body: {:?}", message);
return Ok(Some(message));
return Ok(None);
} else {
let body = buf.split_to(length);
- if let Some(message) = Message::new_with_body(new_message, body) {
+ if let Some(message) = new_message.into_message(Some(body)) {
debug!("Got message with body: {:?}", message);
return Ok(Some(message));
body_length
}
+
+ pub fn into_message(self, body: Option<BytesMut>) -> Option<Message> {
+ match top_line(self.top_line.clone().as_bytes()) {
+ nom::IResult::Done(_, TopLine::RequestLine(r)) => {
+ Some(Message::request(r, self.top_line, self.headers, body))
+ }
+ nom::IResult::Done(_, TopLine::StatusLine(s)) => {
+ Some(Message::response(s, self.top_line, self.headers, body))
+ }
+ result => {
+ warn!("Failed to parse top line: {:?}", result);
+ None
+ }
+ }
+ }
}
impl Decoder for SipCodec {
if length > buf.len() {
return Ok(None);
- } else if let Some(message) =
- Message::new_with_body(self.message.take().unwrap(), buf.split_to(length))
+ } else if let Some(message) = self
+ .message
+ .take()
+ .unwrap()
+ .into_message(Some(buf.split_to(length)))
{
return Ok(Some(message));
} else {
use bytes::BytesMut;
-use nom;
-use codec::{PartialMessage, UnparsedLine};
-use parser::top_line;
-use types::{Header, Method, RequestLine, StatusLine, TopLine};
+use codec::UnparsedLine;
+use types::{Header, Method, RequestLine, StatusLine};
#[derive(Debug)]
pub enum Message {
}
impl Message {
- pub fn new(message: PartialMessage) -> Option<Message> {
- Message::parse(message, None)
+ pub fn request(
+ request: RequestLine,
+ up_request: UnparsedLine,
+ headers: Vec<(Header, UnparsedLine)>,
+ body: Option<BytesMut>,
+ ) -> Message {
+ Message::Request(Request {
+ headers: headers,
+ request_line: (request, up_request.clone()),
+ body: body,
+ })
}
- 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 response(
+ status: StatusLine,
+ up_status: UnparsedLine,
+ headers: Vec<(Header, UnparsedLine)>,
+ body: Option<BytesMut>,
+ ) -> Message {
+ Message::Response(Response {
+ headers: headers,
+ status_line: (status, up_status.clone()),
+ body: body,
+ })
}
pub fn as_bytes<'a>(&'a self) -> &'a [u8] {