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:
parent
2db4f2557d
commit
12a5754569
@ -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.
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user