Don't add null to SmtpResponse.details()

Motivation:

If the remote server returns an invalid response in the form "000 \r\n"
(i.e. a three digit code, then space, but no details), null is added
as a singletonList to the response being constructed.

This seems unexpected and it would be easier to handle an empty
details list in client code.

Modifications:

If detail is null (because frame.isReadable() returned false after
reading the separator), initialise DefaultSmtpResponse with an empty
list instead of a list containing a single null value.

Result:

When encountering this malformed server response, a DefaultSmtpResponse
with a code but no details will be created.
This commit is contained in:
Michael O'Brien 2017-05-23 11:44:29 +01:00 committed by Norman Maurer
parent 2db4f2557d
commit 12a5754569
2 changed files with 17 additions and 1 deletions

View File

@ -68,9 +68,13 @@ public final class SmtpResponseDecoder extends LineBasedFrameDecoder {
if (detail != null) { if (detail != null) {
details.add(detail); details.add(detail);
} }
} else {
if (detail == null) {
details = Collections.emptyList();
} else { } else {
details = Collections.singletonList(detail); details = Collections.singletonList(detail);
} }
}
return new DefaultSmtpResponse(code, details); return new DefaultSmtpResponse(code, details);
case '-': case '-':
// Multi-line response. // Multi-line response.

View File

@ -43,6 +43,18 @@ public class SmtpResponseDecoderTest {
assertNull(channel.readInbound()); assertNull(channel.readInbound());
} }
@Test
public void testDecodeOneLineResponseNoDetails() {
EmbeddedChannel channel = newChannel();
assertTrue(channel.writeInbound(newBuffer("250 \r\n")));
assertTrue(channel.finish());
SmtpResponse response = channel.readInbound();
assertEquals(250, response.code());
List<CharSequence> sequences = response.details();
assertEquals(0, sequences.size());
}
@Test @Test
public void testDecodeOneLineResponseChunked() { public void testDecodeOneLineResponseChunked() {
EmbeddedChannel channel = newChannel(); EmbeddedChannel channel = newChannel();