Author: bago Date: Fri Sep 16 23:33:39 2011 New Revision: 1171854 URL: http://svn.apache.org/viewvc?rev=1171854&view=rev Log: Added generic ways to declare how a protocol replies to "too long lines" and to "fatal errors". Not sure this is generic enough to correctly support pop3/lmtp/imap, but this may be a first attempt at making it generic.
Modified: james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java james/protocols/trunk/smtp-netty/src/main/java/org/apache/james/protocols/smtp/netty/SMTPChannelUpstreamHandler.java james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java Modified: james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java URL: http://svn.apache.org/viewvc/james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java?rev=1171854&r1=1171853&r2=1171854&view=diff ============================================================================== --- james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java (original) +++ james/protocols/trunk/api/src/main/java/org/apache/james/protocols/api/ProtocolSession.java Fri Sep 16 23:33:39 2011 @@ -77,4 +77,17 @@ public interface ProtocolSession { * @return id */ String getSessionID(); + + /** + * Define a response object to be used as reply for a too long input line + * @return Response + */ + Response newLineTooLongResponse(); + + /** + * Define a response object to be used as reply during a fatal error. + * Connection will be closed after this response. + * @return Response + */ + Response newFatalErrorResponse(); } Modified: james/protocols/trunk/smtp-netty/src/main/java/org/apache/james/protocols/smtp/netty/SMTPChannelUpstreamHandler.java URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp-netty/src/main/java/org/apache/james/protocols/smtp/netty/SMTPChannelUpstreamHandler.java?rev=1171854&r1=1171853&r2=1171854&view=diff ============================================================================== --- james/protocols/trunk/smtp-netty/src/main/java/org/apache/james/protocols/smtp/netty/SMTPChannelUpstreamHandler.java (original) +++ james/protocols/trunk/smtp-netty/src/main/java/org/apache/james/protocols/smtp/netty/SMTPChannelUpstreamHandler.java Fri Sep 16 23:33:39 2011 @@ -24,10 +24,9 @@ import javax.net.ssl.SSLEngine; import org.apache.james.protocols.api.ProtocolHandlerChain; import org.apache.james.protocols.api.ProtocolSession; import org.apache.james.protocols.api.ProtocolSessionFactory; +import org.apache.james.protocols.api.Response; import org.apache.james.protocols.impl.AbstractChannelUpstreamHandler; import org.apache.james.protocols.impl.NettyProtocolTransport; -import org.apache.james.protocols.smtp.SMTPResponse; -import org.apache.james.protocols.smtp.SMTPRetCode; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelFutureListener; import org.jboss.netty.channel.ChannelHandler.Sharable; @@ -75,13 +74,19 @@ public class SMTPChannelUpstreamHandler @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { Channel channel = ctx.getChannel(); + ProtocolSession session = (ProtocolSession) ctx.getAttachment(); if (e.getCause() instanceof TooLongFrameException) { - ctx.getChannel().write(new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, "Line length exceeded. See RFC 2821 #4.5.3.1.")); + Response r = session.newLineTooLongResponse(); + if (r != null) ctx.getChannel().write(r); } else { if (channel.isConnected()) { - ctx.getChannel().write(new SMTPResponse(SMTPRetCode.LOCAL_ERROR, "Unable to process request")).addListener(ChannelFutureListener.CLOSE); + Response r = session.newFatalErrorResponse(); + if (r != null) { + ctx.getChannel().write(r).addListener(ChannelFutureListener.CLOSE); + } else { + ctx.getChannel().close(); + } } - ProtocolSession session = (ProtocolSession) ctx.getAttachment(); if (session != null) { session.getLogger().debug("Unable to process request", e.getCause()); } else { Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java?rev=1171854&r1=1171853&r2=1171854&view=diff ============================================================================== --- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java (original) +++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/SMTPSessionImpl.java Fri Sep 16 23:33:39 2011 @@ -25,6 +25,7 @@ import java.util.Map; import org.apache.james.protocols.api.LineHandler; import org.apache.james.protocols.api.ProtocolTransport; import org.apache.james.protocols.api.AbstractSession; +import org.apache.james.protocols.api.Response; import org.apache.james.protocols.smtp.SMTPConfiguration; import org.apache.james.protocols.smtp.SMTPSession; import org.slf4j.Logger; @@ -184,5 +185,13 @@ public class SMTPSessionImpl extends Abs public int getPushedLineHandlerCount() { return transport.getPushedLineHandlerCount(); } + + public Response newLineTooLongResponse() { + return new SMTPResponse(SMTPRetCode.SYNTAX_ERROR_COMMAND_UNRECOGNIZED, "Line length exceeded. See RFC 2821 #4.5.3.1."); + } + + public Response newFatalErrorResponse() { + return new SMTPResponse(SMTPRetCode.LOCAL_ERROR, "Unable to process request"); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org