diff --git a/vmime/net/imap/IMAPParser.hpp b/vmime/net/imap/IMAPParser.hpp index 0b90829e..8c7fcb60 100644 --- a/vmime/net/imap/IMAPParser.hpp +++ b/vmime/net/imap/IMAPParser.hpp @@ -975,6 +975,7 @@ public: public: const string& value() const { return (m_value); } + void setValue(const string& val) { m_value = val; } }; @@ -2940,7 +2941,23 @@ public: size_t pos = *currentPos; - m_string1 = parser.get (line, &pos); + if (!parser.isStrict()) + { + // Some servers send an instead of a here: + // eg. ... (CHARSET "X-UNKNOWN") ... + if (!(m_string1 = parser.get (line, &pos, true))) + { + std::auto_ptr at(parser.get (line, &pos)); + + m_string1 = new xstring(); + m_string1->setValue(at->value()); + } + } + else + { + m_string1 = parser.get (line, &pos); + } + parser.check (line, &pos); m_string2 = parser.get (line, &pos); @@ -4453,9 +4470,21 @@ public: size_t pos = *currentPos; parser.check >(line, &pos); - parser.check (line, &pos); - m_resp_text = parser.get (line, &pos); + if (!parser.isStrict()) + { + // Some servers do not send SPACE when response text is empty + if (parser.check (line, &pos, true)) + m_resp_text = parser.get (line, &pos); + else + m_resp_text = new IMAPParser::resp_text(); // empty + } + else + { + parser.check (line, &pos); + + m_resp_text = parser.get (line, &pos); + } parser.check (line, &pos);