Fix phrase parser again
parent
5f52caf931
commit
99fab60990
|
@ -601,8 +601,10 @@ pub fn phrase(input: &[u8]) -> IResult<&[u8], Vec<u8>> {
|
||||||
let mut ptr = 0;
|
let mut ptr = 0;
|
||||||
|
|
||||||
while ptr < input.len() {
|
while ptr < input.len() {
|
||||||
|
let mut flag = false;
|
||||||
// Check if word is encoded.
|
// Check if word is encoded.
|
||||||
while let IResult::Done(rest, v) = encoded_word(&input[ptr..]) {
|
while let IResult::Done(rest, v) = encoded_word(&input[ptr..]) {
|
||||||
|
flag = true;
|
||||||
input = rest;
|
input = rest;
|
||||||
ptr = 0;
|
ptr = 0;
|
||||||
acc.extend(v);
|
acc.extend(v);
|
||||||
|
@ -616,22 +618,31 @@ pub fn phrase(input: &[u8]) -> IResult<&[u8], Vec<u8>> {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if flag && ptr < input.len() && ptr != 0 {
|
||||||
|
acc.push(b' ');
|
||||||
|
}
|
||||||
let end = input[ptr..].find(b"=?");
|
let end = input[ptr..].find(b"=?");
|
||||||
|
|
||||||
let end = end.unwrap_or_else(|| input.len() - ptr) + ptr;
|
let end = end.unwrap_or_else(|| input.len() - ptr) + ptr;
|
||||||
let prev_ptr = ptr;
|
let ascii_s = ptr;
|
||||||
|
let ascii_e;
|
||||||
|
|
||||||
while ptr < end && !(is_whitespace!(input[ptr])) {
|
while ptr < end && !(is_whitespace!(input[ptr])) {
|
||||||
ptr += 1;
|
ptr += 1;
|
||||||
}
|
}
|
||||||
acc.extend(ascii_token(&input[prev_ptr..ptr]).to_full_result().unwrap());
|
ascii_e = ptr;
|
||||||
while ptr < input.len() && (is_whitespace!(input[ptr])) {
|
while ptr < input.len() && (is_whitespace!(input[ptr])) {
|
||||||
ptr += 1;
|
ptr += 1;
|
||||||
}
|
}
|
||||||
if ptr >= input.len() {
|
if ptr >= input.len() {
|
||||||
|
acc.extend(ascii_token(&input[ascii_s..ascii_e]).to_full_result().unwrap());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
acc.push(b' ');
|
acc.extend(ascii_token(&input[ascii_s..ascii_e]).to_full_result().unwrap());
|
||||||
}
|
if ptr != ascii_e {
|
||||||
|
acc.push(b' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
return IResult::Done(&[], acc);
|
return IResult::Done(&[], acc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -642,10 +653,14 @@ use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_subject() {
|
fn test_subject() {
|
||||||
|
let words = b"=?iso-8859-7?B?W215Y291cnNlcy5udHVhLmdyIC0gyvXs4fTp6t4g6uHpIMri4e306ere?=
|
||||||
|
=?iso-8859-7?B?INb18+nq3l0gzd3hIMHt4erv3+358+c6IMzF0c/TIMHQz9TFy8XTzMHU?=
|
||||||
|
=?iso-8859-7?B?2c0gwiDUzC4gysHNLiDFzsXUwdPH0yAyMDE3LTE4OiDTx8zFydnTxw==?=";
|
||||||
|
assert!("[mycourses.ntua.gr - Κυματική και Κβαντική Φυσική] Νέα Ανακοίνωση: ΜΕΡΟΣ ΑΠΟΤΕΛΕΣΜΑΤΩΝ Β ΤΜ. ΚΑΝ. ΕΞΕΤΑΣΗΣ 2017-18: ΣΗΜΕΙΩΣΗ" == std::str::from_utf8(&phrase(words.trim()).to_full_result().unwrap()).unwrap());
|
||||||
let words = b"=?UTF-8?Q?=CE=A0=CF=81=CF=8C=CF=83=CE=B8=CE=B5?= =?UTF-8?Q?=CF=84=CE=B7_=CE=B5=CE=BE=CE=B5=CF=84?= =?UTF-8?Q?=CE=B1=CF=83=CF=84=CE=B9=CE=BA=CE=AE?=";
|
let words = b"=?UTF-8?Q?=CE=A0=CF=81=CF=8C=CF=83=CE=B8=CE=B5?= =?UTF-8?Q?=CF=84=CE=B7_=CE=B5=CE=BE=CE=B5=CF=84?= =?UTF-8?Q?=CE=B1=CF=83=CF=84=CE=B9=CE=BA=CE=AE?=";
|
||||||
assert!("Πρόσθετη εξεταστική" == std::str::from_utf8(&phrase(words.trim()).to_full_result().unwrap()).unwrap());
|
assert!("Πρόσθετη εξεταστική" == std::str::from_utf8(&phrase(words.trim()).to_full_result().unwrap()).unwrap());
|
||||||
let words = b"[Advcomparch] =?utf-8?b?zqPPhc68z4DOtc+BzrnPhs6/z4HOrCDPg861IGZs?=\n\t=?utf-8?b?dXNoIM67z4zOs8+JIG1pc3ByZWRpY3Rpb24gzrrOsc+Ezqwgz4TOt869?=\n\t=?utf-8?b?IM61zrrPhM6tzrvOtc+Dzrcgc3RvcmU=?=";
|
let words = b"[Advcomparch] =?utf-8?b?zqPPhc68z4DOtc+BzrnPhs6/z4HOrCDPg861IGZs?=\n\t=?utf-8?b?dXNoIM67z4zOs8+JIG1pc3ByZWRpY3Rpb24gzrrOsc+Ezqwgz4TOt869?=\n\t=?utf-8?b?IM61zrrPhM6tzrvOtc+Dzrcgc3RvcmU=?=";
|
||||||
assert!("[Advcomparch] Συμπεριφορά σε flush λόγω misprediction κατά την εκτέλεση store" == std::str::from_utf8(&phrase(words.trim()).to_full_result().unwrap()).unwrap());
|
assert!("[Advcomparch] Συμπεριφορά σε flush λόγω misprediction κατά την εκτέλεση store" == std::str::from_utf8(&phrase(words.trim()).to_full_result().unwrap()).unwrap());
|
||||||
let words = b"Re: [Advcomparch] =?utf-8?b?zqPPhc68z4DOtc+BzrnPhs6/z4HOrCDPg861IGZs?=
|
let words = b"Re: [Advcomparch] =?utf-8?b?zqPPhc68z4DOtc+BzrnPhs6/z4HOrCDPg861IGZs?=
|
||||||
=?utf-8?b?dXNoIM67z4zOs8+JIG1pc3ByZWRpY3Rpb24gzrrOsc+Ezqwgz4TOt869?=
|
=?utf-8?b?dXNoIM67z4zOs8+JIG1pc3ByZWRpY3Rpb24gzrrOsc+Ezqwgz4TOt869?=
|
||||||
=?utf-8?b?IM61zrrPhM6tzrvOtc+Dzrcgc3RvcmU=?=";
|
=?utf-8?b?IM61zrrPhM6tzrvOtc+Dzrcgc3RvcmU=?=";
|
||||||
|
@ -653,13 +668,13 @@ fn test_subject() {
|
||||||
let words = b"sdf";
|
let words = b"sdf";
|
||||||
assert!("sdf" == std::str::from_utf8(&phrase(words).to_full_result().unwrap()).unwrap());
|
assert!("sdf" == std::str::from_utf8(&phrase(words).to_full_result().unwrap()).unwrap());
|
||||||
let words = b"=?iso-8859-7?b?U2VnIGZhdWx0IPP05+0g5er03evl8+cg9O/1?= =?iso-8859-7?q?_example_ru_n_=5Fsniper?=";
|
let words = b"=?iso-8859-7?b?U2VnIGZhdWx0IPP05+0g5er03evl8+cg9O/1?= =?iso-8859-7?q?_example_ru_n_=5Fsniper?=";
|
||||||
assert!("Seg fault στην εκτέλεση του example ru n _sniper" == std::str::from_utf8(&phrase(words).to_full_result().unwrap()).unwrap());
|
assert!("Seg fault στην εκτέλεση του example ru n _sniper" == std::str::from_utf8(&phrase(words).to_full_result().unwrap()).unwrap());
|
||||||
let words = b"Re: [Advcomparch]
|
let words = b"Re: [Advcomparch]
|
||||||
=?iso-8859-7?b?U2VnIGZhdWx0IPP05+0g5er03evl8+cg9O/1?=
|
=?iso-8859-7?b?U2VnIGZhdWx0IPP05+0g5er03evl8+cg9O/1?=
|
||||||
=?iso-8859-7?q?_example_ru_n_=5Fsniper?=";
|
=?iso-8859-7?q?_example_ru_n_=5Fsniper?=";
|
||||||
|
|
||||||
//TODO Fix this
|
//TODO Fix this
|
||||||
assert!("Re: [Advcomparch] Seg fault στην εκτέλεση του example run_sniper" == std::str::from_utf8(&phrase(words).to_full_result().unwrap()).unwrap());
|
assert!("Re: [Advcomparch] Seg fault στην εκτέλεση του example run_sniper" == std::str::from_utf8(&phrase(words).to_full_result().unwrap()).unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -700,43 +715,39 @@ fn test_attachments() {
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_addresses() {
|
fn test_addresses() {
|
||||||
|
{
|
||||||
|
let s = b"=?iso-8859-7?B?0/Th/fHv8iDM4ev03ebv8g==?= <maltezos@central.ntua.gr>";
|
||||||
|
let r = mailbox(s).unwrap().1;
|
||||||
|
match r {
|
||||||
|
Address::Mailbox(ref m) => assert!("Σταύρος Μαλτέζος" == std::str::from_utf8(&m.display_name.display_bytes(&m.raw)).unwrap() && std::str::from_utf8(&m.address_spec.display_bytes(&m.raw)).unwrap() == "maltezos@central.ntua.gr"),
|
||||||
|
_ => assert!(false),
|
||||||
|
}
|
||||||
|
}
|
||||||
{
|
{
|
||||||
let s = b"user@domain";
|
let s = b"user@domain";
|
||||||
let r = mailbox(s).unwrap().1;
|
let r = mailbox(s).unwrap().1;
|
||||||
match r {
|
match r {
|
||||||
Address::Mailbox(ref m) => {
|
Address::Mailbox(ref m) => assert!(m.display_name.display_bytes(&m.raw) == b""
|
||||||
assert!(m.display_name.display_bytes(s) == b"" && m.address_spec.display_bytes(s) == b"user@domain");
|
&& m.address_spec.display_bytes(&m.raw) == b"user@domain"),
|
||||||
},
|
|
||||||
_ => assert!(false),
|
_ => assert!(false),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
let s = b"Name <user@domain>";
|
let s = b"Name <user@domain>";
|
||||||
eprintln!("{:?}", display_addr(s).unwrap());
|
|
||||||
let r = display_addr(s).unwrap().1;
|
let r = display_addr(s).unwrap().1;
|
||||||
match r {
|
match r {
|
||||||
Address::Mailbox(ref m) => {
|
Address::Mailbox(ref m) => assert!(b"Name" == m.display_name.display_bytes(&m.raw) &&
|
||||||
println!(
|
b"user@domain" == m.address_spec.display_bytes(&m.raw)),
|
||||||
"----\n`{}`, `{}`\n----",
|
_ => {},
|
||||||
m.display_name.display(&m.raw),
|
|
||||||
m.address_spec.display(&m.raw)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
let s = b"user@domain";
|
let s = b"user@domain";
|
||||||
let r = mailbox(s).unwrap().1;
|
let r = mailbox(s).unwrap().1;
|
||||||
match r {
|
match r {
|
||||||
Address::Mailbox(ref m) => {
|
Address::Mailbox(ref m) => assert!(b"" == m.display_name.display_bytes(&m.raw) &&
|
||||||
println!(
|
b"user@domain" ==m.address_spec.display_bytes(&m.raw)),
|
||||||
"----\n`{}`, `{}`\n----",
|
_ => {},
|
||||||
m.display_name.display(&m.raw),
|
|
||||||
m.address_spec.display(&m.raw)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue