From 12809fd0bf5b1d258beca01b2acd3036476a52d0 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 7 Jul 2013 14:57:02 -0400 Subject: [PATCH] Message Format - Relaxed message parsing slightly. --- src/Msg.cpp | 27 +++++++++++++-------------- test/msg.t.cpp | 8 +++++++- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/Msg.cpp b/src/Msg.cpp index 7cd45ff10..dec21dbb3 100644 --- a/src/Msg.cpp +++ b/src/Msg.cpp @@ -145,26 +145,25 @@ bool Msg::parse (const std::string& input) _header.clear (); _payload = ""; - std::vector lines; - split (lines, input.substr (0, input.size ()), '\n'); + std::string::size_type separator = input.find ("\n\n"); + if (separator == std::string::npos) + throw std::string ("ERROR: Malformed message"); + // Parse header. + std::vector lines; + split (lines, input.substr (0, separator), '\n'); std::vector ::iterator i; - bool tripped = false; for (i = lines.begin (); i != lines.end (); ++i) { - if (*i == "") - tripped = true; - else if (tripped) - _payload += *i + "\n"; - else - { - std::string::size_type delim = i->find (": "); - if (delim != std::string::npos) - _header[i->substr (0, delim)] = i->substr (delim + 2); - else + std::string::size_type delimiter = i->find (':'); + if (delimiter == std::string::npos) throw std::string ("ERROR: Malformed message header '") + *i + "'"; + + _header[trim (i->substr (0, delimiter))] = trim (i->substr (delimiter + 1)); } - } + + // Parse payload. + _payload = input.substr (separator + 2); return true; } diff --git a/test/msg.t.cpp b/test/msg.t.cpp index 70f75804a..134ce74b8 100644 --- a/test/msg.t.cpp +++ b/test/msg.t.cpp @@ -36,7 +36,7 @@ Context context; //////////////////////////////////////////////////////////////////////////////// int main (int argc, char** argv) { - UnitTest t (8); + UnitTest t (12); Msg m; t.is (m.serialize (), std::string ("client: ") + PACKAGE_STRING + "\n\n\n", "Msg::serialize '' --> '\\n\\n'"); @@ -55,6 +55,12 @@ int main (int argc, char** argv) t.is (m2.get ("foo"), "bar", "Msg::get"); t.is (m2.get ("name"), "value", "Msg::get"); t.is (m2.getPayload (), "payload\n", "Msg::getPayload"); + + Msg m3; + t.ok (m3.parse ("foo:bar\nname: value\n\npayload\n"), "Msg::parse ok"); + t.is (m3.get ("foo"), "bar", "Msg::get"); + t.is (m3.get ("name"), "value", "Msg::get"); + t.is (m3.getPayload (), "payload\n", "Msg::getPayload"); return 0; }