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

Reply via email to