Skip to content

Commit

Permalink
Added Experimental/MimeParser test for headers ending with a bare CR
Browse files Browse the repository at this point in the history
  • Loading branch information
jstedfast committed Dec 22, 2024
1 parent 5161d3e commit 6aaf542
Show file tree
Hide file tree
Showing 2 changed files with 192 additions and 10 deletions.
80 changes: 80 additions & 0 deletions UnitTests/ExperimentalMimeParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,86 @@ public async Task TestEmptyHeadersAsync ()
}
}

[Test]
public void TestHeadersEndWithBareCarriageReturn ()
{
var bytes = Encoding.ASCII.GetBytes ("From: <[email protected]>\r\nTo: <[email protected]>\r\nSubject: Test of headers ending with bare carriage-return\r\n\r");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new ExperimentalMimeParser (memory, MimeFormat.Entity);
var headers = parser.ParseHeaders ();

Assert.That (headers.Count, Is.EqualTo (3), "Unexpected header count.");
Assert.That (headers[0].Id, Is.EqualTo (HeaderId.From));
Assert.That (headers[0].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[1].Id, Is.EqualTo (HeaderId.To));
Assert.That (headers[1].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[2].Id, Is.EqualTo (HeaderId.Subject));
Assert.That (headers[2].Value, Is.EqualTo ("Test of headers ending with bare carriage-return"));
}
}

[Test]
public async Task TestHeadersEndWithBareCarriageReturnAsync ()
{
var bytes = Encoding.ASCII.GetBytes ("From: <[email protected]>\r\nTo: <[email protected]>\r\nSubject: Test of headers ending with bare carriage-return\r\n\r");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new ExperimentalMimeParser (memory, MimeFormat.Entity);
var headers = await parser.ParseHeadersAsync ();

Assert.That (headers.Count, Is.EqualTo (3), "Unexpected header count.");
Assert.That (headers[0].Id, Is.EqualTo (HeaderId.From));
Assert.That (headers[0].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[1].Id, Is.EqualTo (HeaderId.To));
Assert.That (headers[1].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[2].Id, Is.EqualTo (HeaderId.Subject));
Assert.That (headers[2].Value, Is.EqualTo ("Test of headers ending with bare carriage-return"));
}
}

[Test]
public void TestHeadersWithBareCarriageReturn ()
{
var bytes = Encoding.ASCII.GetBytes ("From: <[email protected]>\r\nTo: <[email protected]>\r\nSubject: Test of headers ending with bare carriage-return\r\n\rYou might expect this to be a body, but it's really an invalid header.\r\n");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new ExperimentalMimeParser (memory, MimeFormat.Entity);
var headers = parser.ParseHeaders ();

Assert.That (headers.Count, Is.EqualTo (4), "Unexpected header count.");
Assert.That (headers[0].Id, Is.EqualTo (HeaderId.From));
Assert.That (headers[0].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[1].Id, Is.EqualTo (HeaderId.To));
Assert.That (headers[1].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[2].Id, Is.EqualTo (HeaderId.Subject));
Assert.That (headers[2].Value, Is.EqualTo ("Test of headers ending with bare carriage-return"));
Assert.That (headers[3].IsInvalid, Is.True);
Assert.That (headers[3].Field, Is.EqualTo ("\rYou might expect this to be a body, but it's really an invalid header.\r\n"));
}
}

[Test]
public async Task TestHeadersWithBareCarriageReturnAsync ()
{
var bytes = Encoding.ASCII.GetBytes ("From: <[email protected]>\r\nTo: <[email protected]>\r\nSubject: Test of headers ending with bare carriage-return\r\n\rYou might expect this to be a body, but it's really an invalid header.\r\n");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new ExperimentalMimeParser (memory, MimeFormat.Entity);
var headers = await parser.ParseHeadersAsync ();

Assert.That (headers.Count, Is.EqualTo (4), "Unexpected header count.");
Assert.That (headers[0].Id, Is.EqualTo (HeaderId.From));
Assert.That (headers[0].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[1].Id, Is.EqualTo (HeaderId.To));
Assert.That (headers[1].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[2].Id, Is.EqualTo (HeaderId.Subject));
Assert.That (headers[2].Value, Is.EqualTo ("Test of headers ending with bare carriage-return"));
Assert.That (headers[3].IsInvalid, Is.True);
Assert.That (headers[3].Field, Is.EqualTo ("\rYou might expect this to be a body, but it's really an invalid header.\r\n"));
}
}

[Test]
public void TestPartialByteOrderMarkEOF ()
{
Expand Down
122 changes: 112 additions & 10 deletions UnitTests/MimeParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,10 @@ public void TestHeaderParser ()
var bytes = Encoding.ASCII.GetBytes ("Header-1: value 1\r\nHeader-2: value 2\r\nHeader-3: value 3\r\n\r\n");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);

try {
var headers = HeaderList.Load (memory);
var headers = parser.ParseHeaders ();
string value;

Assert.That (headers.Count, Is.EqualTo (3), "Unexpected header count.");
Expand Down Expand Up @@ -109,8 +111,10 @@ public async Task TestHeaderParserAsync ()
var bytes = Encoding.ASCII.GetBytes ("Header-1: value 1\r\nHeader-2: value 2\r\nHeader-3: value 3\r\n\r\n");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);

try {
var headers = await HeaderList.LoadAsync (memory);
var headers = await parser.ParseHeadersAsync ();
string value;

Assert.That (headers.Count, Is.EqualTo (3), "Unexpected header count.");
Expand Down Expand Up @@ -138,8 +142,10 @@ public void TestTruncatedHeaderName ()
var bytes = Encoding.ASCII.GetBytes ("Header-1");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);

try {
var headers = HeaderList.Load (memory);
var headers = parser.ParseHeaders ();
Assert.Fail ("Parsing headers should fail.");
} catch (FormatException) {
} catch (Exception ex) {
Expand All @@ -154,8 +160,10 @@ public async Task TestTruncatedHeaderNameAsync ()
var bytes = Encoding.ASCII.GetBytes ("Header-1");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);

try {
var headers = await HeaderList.LoadAsync (memory);
var headers = await parser.ParseHeadersAsync ();
Assert.Fail ("Parsing headers should fail.");
} catch (FormatException) {
} catch (Exception ex) {
Expand All @@ -170,8 +178,10 @@ public void TestTruncatedHeader ()
var bytes = Encoding.ASCII.GetBytes ("Header-1: value 1");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);

try {
var headers = HeaderList.Load (memory);
var headers = parser.ParseHeaders ();

Assert.That (headers.Count, Is.EqualTo (1), "Unexpected header count.");

Expand All @@ -190,8 +200,10 @@ public async Task TestTruncatedHeaderAsync ()
var bytes = Encoding.ASCII.GetBytes ("Header-1: value 1");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);

try {
var headers = await HeaderList.LoadAsync (memory);
var headers = await parser.ParseHeadersAsync ();

Assert.That (headers.Count, Is.EqualTo (1), "Unexpected header count.");

Expand All @@ -210,8 +222,10 @@ public void TestSingleHeaderNoTerminator ()
var bytes = Encoding.ASCII.GetBytes ("Header-1: value 1\r\n");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);

try {
var headers = HeaderList.Load (memory);
var headers = parser.ParseHeaders ();

Assert.That (headers.Count, Is.EqualTo (1), "Unexpected header count.");

Expand All @@ -230,8 +244,10 @@ public async Task TestSingleHeaderNoTerminatorAsync ()
var bytes = Encoding.ASCII.GetBytes ("Header-1: value 1\r\n");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);

try {
var headers = await HeaderList.LoadAsync (memory);
var headers = await parser.ParseHeadersAsync ();

Assert.That (headers.Count, Is.EqualTo (1), "Unexpected header count.");

Expand All @@ -250,8 +266,10 @@ public void TestEmptyHeaders ()
var bytes = Encoding.ASCII.GetBytes ("\r\n");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);

try {
var headers = HeaderList.Load (memory);
var headers = parser.ParseHeaders ();

Assert.That (headers.Count, Is.EqualTo (0), "Unexpected header count.");
} catch (Exception ex) {
Expand All @@ -266,8 +284,10 @@ public async Task TestEmptyHeadersAsync ()
var bytes = Encoding.ASCII.GetBytes ("\r\n");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);

try {
var headers = await HeaderList.LoadAsync (memory);
var headers = await parser.ParseHeadersAsync ();

Assert.That (headers.Count, Is.EqualTo (0), "Unexpected header count.");
} catch (Exception ex) {
Expand All @@ -276,6 +296,88 @@ public async Task TestEmptyHeadersAsync ()
}
}

[Test]
[Ignore ("This should be handled the same as ExperimentalMimeParser")]
public void TestHeadersEndWithBareCarriageReturn ()
{
var bytes = Encoding.ASCII.GetBytes ("From: <[email protected]>\r\nTo: <[email protected]>\r\nSubject: Test of headers ending with bare carriage-return\r\n\r");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);
var headers = parser.ParseHeaders ();

Assert.That (headers.Count, Is.EqualTo (3), "Unexpected header count.");
Assert.That (headers[0].Id, Is.EqualTo (HeaderId.From));
Assert.That (headers[0].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[1].Id, Is.EqualTo (HeaderId.To));
Assert.That (headers[1].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[2].Id, Is.EqualTo (HeaderId.Subject));
Assert.That (headers[2].Value, Is.EqualTo ("Test of headers ending with bare carriage-return"));
}
}

[Test]
[Ignore ("This should be handled the same as ExperimentalMimeParser")]
public async Task TestHeadersEndWithBareCarriageReturnAsync ()
{
var bytes = Encoding.ASCII.GetBytes ("From: <[email protected]>\r\nTo: <[email protected]>\r\nSubject: Test of headers ending with bare carriage-return\r\n\r");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);
var headers = await parser.ParseHeadersAsync ();

Assert.That (headers.Count, Is.EqualTo (3), "Unexpected header count.");
Assert.That (headers[0].Id, Is.EqualTo (HeaderId.From));
Assert.That (headers[0].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[1].Id, Is.EqualTo (HeaderId.To));
Assert.That (headers[1].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[2].Id, Is.EqualTo (HeaderId.Subject));
Assert.That (headers[2].Value, Is.EqualTo ("Test of headers ending with bare carriage-return"));
}
}

[Test]
public void TestHeadersWithBareCarriageReturn ()
{
var bytes = Encoding.ASCII.GetBytes ("From: <[email protected]>\r\nTo: <[email protected]>\r\nSubject: Test of headers ending with bare carriage-return\r\n\rYou might expect this to be a body, but it's really an invalid header.\r\n");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);
var headers = parser.ParseHeaders ();

Assert.That (headers.Count, Is.EqualTo (4), "Unexpected header count.");
Assert.That (headers[0].Id, Is.EqualTo (HeaderId.From));
Assert.That (headers[0].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[1].Id, Is.EqualTo (HeaderId.To));
Assert.That (headers[1].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[2].Id, Is.EqualTo (HeaderId.Subject));
Assert.That (headers[2].Value, Is.EqualTo ("Test of headers ending with bare carriage-return"));
Assert.That (headers[3].IsInvalid, Is.True);
Assert.That (headers[3].Field, Is.EqualTo ("\rYou might expect this to be a body, but it's really an invalid header.\r\n"));
}
}

[Test]
public async Task TestHeadersWithBareCarriageReturnAsync ()
{
var bytes = Encoding.ASCII.GetBytes ("From: <[email protected]>\r\nTo: <[email protected]>\r\nSubject: Test of headers ending with bare carriage-return\r\n\rYou might expect this to be a body, but it's really an invalid header.\r\n");

using (var memory = new MemoryStream (bytes, false)) {
var parser = new MimeParser (memory, MimeFormat.Entity);
var headers = await parser.ParseHeadersAsync ();

Assert.That (headers.Count, Is.EqualTo (4), "Unexpected header count.");
Assert.That (headers[0].Id, Is.EqualTo (HeaderId.From));
Assert.That (headers[0].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[1].Id, Is.EqualTo (HeaderId.To));
Assert.That (headers[1].Value, Is.EqualTo ("<[email protected]>"));
Assert.That (headers[2].Id, Is.EqualTo (HeaderId.Subject));
Assert.That (headers[2].Value, Is.EqualTo ("Test of headers ending with bare carriage-return"));
Assert.That (headers[3].IsInvalid, Is.True);
Assert.That (headers[3].Field, Is.EqualTo ("\rYou might expect this to be a body, but it's really an invalid header.\r\n"));
}
}

[Test]
public void TestPartialByteOrderMarkEOF ()
{
Expand Down

0 comments on commit 6aaf542

Please sign in to comment.