diff --git a/imap/src/proto/rfc3501/mod.rs b/imap/src/proto/rfc3501/mod.rs index 5cb28e7..fcdf80d 100644 --- a/imap/src/proto/rfc3501/mod.rs +++ b/imap/src/proto/rfc3501/mod.rs @@ -340,9 +340,10 @@ pub(crate) fn is_resp_specials(c: u8) -> bool { c == b']' } rule!(pub resp_specials : u8 => satisfy(is_resp_specials)); rule!(pub resp_text : ResponseText => alt(( - // FUCK YOU GMAIL - map(delimited(byte(b'['), resp_text_code, byte(b']')), - |code| ResponseText { code: Some(code), info: Bytes::from(b"") }), + map(pair( + delimited(byte(b'['), resp_text_code, byte(b']')), + opt(preceded(SP, text)), + ), |(code, info)| ResponseText { code: Some(code), info: info.unwrap_or_else(|| Bytes::from(b"")) }), map(pair( opt(terminated(delimited(byte(b'['), resp_text_code, byte(b']')), SP)), diff --git a/imap/src/proto/rfc3501/tests.rs b/imap/src/proto/rfc3501/tests.rs index 70bb9de..2a9d682 100644 --- a/imap/src/proto/rfc3501/tests.rs +++ b/imap/src/proto/rfc3501/tests.rs @@ -102,7 +102,6 @@ fn test_gmail_is_shit() { let res = response(Bytes::from(b"* OK [HIGHESTMODSEQ 694968]\r\n")) .unwrap() .1; - eprintln!("{:?}", res); assert!(matches!(res, Response::Condition(Condition { status: Status::Ok, @@ -111,4 +110,12 @@ fn test_gmail_is_shit() { }) if c == Bytes::from(b"HIGHESTMODSEQ") && d == Bytes::from(b"694968") && e.is_empty() )); + + let res = resp_text(Bytes::from(b"[PERMANENTFLAGS (\\Answered \\Flagged \\Draft \\Deleted \\Seen $NotPhishing $Phishing \\*)] Flags permitted.\r".to_vec())).unwrap().1; + eprintln!("{:?}", res); + eprintln!(); + + let res = response(Bytes::from(b"* OK [PERMANENTFLAGS (\\Answered \\Flagged \\Draft \\Deleted \\Seen $NotPhishing $Phishing \\*)] Flags permitted.\r\n".to_vec())).unwrap().1; + eprintln!("{:?}", res); + assert!(matches!(res, Response::Condition(_))); }