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: [email protected]
For additional commands, e-mail: [email protected]