You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by gt...@apache.org on 2016/12/06 13:52:51 UTC

activemq git commit: https://issues.apache.org/jira/browse/AMQ-6526 - fix Stomp operation in ProtocolException. closes #217

Repository: activemq
Updated Branches:
  refs/heads/master e3d698b9d -> 9e3577894


https://issues.apache.org/jira/browse/AMQ-6526 - fix <Unknown> Stomp operation in ProtocolException.
closes #217


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/9e357789
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/9e357789
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/9e357789

Branch: refs/heads/master
Commit: 9e3577894327d8c78bc52bb5f77650af0ceb095b
Parents: e3d698b
Author: Torsten Mielke <tm...@redhat.com>
Authored: Tue Dec 6 14:32:47 2016 +0100
Committer: gtully <ga...@gmail.com>
Committed: Tue Dec 6 13:52:06 2016 +0000

----------------------------------------------------------------------
 .../activemq/transport/stomp/StompCodec.java    |   8 +-
 .../stomp/StompNIOSSLLargeMessageTest.java      | 151 +++++++++++++++++++
 2 files changed, 157 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/9e357789/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/StompCodec.java
----------------------------------------------------------------------
diff --git a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/StompCodec.java b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/StompCodec.java
index 3581d3b..54ec21a 100644
--- a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/StompCodec.java
+++ b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/StompCodec.java
@@ -101,11 +101,15 @@ public class StompCodec {
                    } else {
                        currentCommand.write(b);
                        if (currentCommand.size() > wireFormat.getMaxDataLength()) {
-                           transport.doConsume(new StompFrameError(new ProtocolException("The maximum data length was exceeded", true)));
+                           StompFrameError errorFrame = new StompFrameError(new ProtocolException("The maximum data length was exceeded", true));
+                           errorFrame.setAction(this.action);
+                           transport.doConsume(errorFrame);
                            return;
                        }
                        if (frameSize.incrementAndGet() > wireFormat.getMaxFrameSize()) {
-                           transport.doConsume(new StompFrameError(new ProtocolException("The maximum frame size was exceeded", true)));
+                           StompFrameError errorFrame = new StompFrameError(new ProtocolException("The maximum frame size was exceeded", true));
+                           errorFrame.setAction(this.action);
+                           transport.doConsume(errorFrame);
                            return;
                        }
                    }

http://git-wip-us.apache.org/repos/asf/activemq/blob/9e357789/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompNIOSSLLargeMessageTest.java
----------------------------------------------------------------------
diff --git a/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompNIOSSLLargeMessageTest.java b/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompNIOSSLLargeMessageTest.java
new file mode 100644
index 0000000..d600728
--- /dev/null
+++ b/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompNIOSSLLargeMessageTest.java
@@ -0,0 +1,151 @@
+package org.apache.activemq.transport.stomp;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.net.Socket;
+
+import org.apache.activemq.command.ActiveMQQueue;
+import org.apache.log4j.Appender;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.jms.Connection;
+import javax.jms.Session;
+import javax.net.SocketFactory;
+import javax.net.ssl.SSLSocketFactory;
+
+import org.apache.activemq.util.DefaultTestAppender;
+
+/**
+ * Testcase for AMQ-6526.
+ * Checks if the \<Unknown\> in the Stomp ProtocolException is replaced
+ * with the proper Stomp operation.
+ *
+ */
+public class StompNIOSSLLargeMessageTest extends StompTestSupport {
+
+    protected static final Logger LOG = LoggerFactory.getLogger(StompNIOSSLLargeMessageTest.class);
+    private Connection connection;
+    private Session session;
+    private ActiveMQQueue queue;
+
+    // flag to control if the bug in AMQ-XXXX got reproduced.
+    private boolean gotUnknownOperationInLog = false;
+
+    protected int stompFrameSize = 110000000; //slightly over 105 MB
+
+    // custom Log4J appender so we can filter the logging output in this test.
+    protected Appender appender = new DefaultTestAppender() {
+        //@Override
+        public void doAppend(org.apache.log4j.spi.LoggingEvent event) {
+            if (event.getMessage().toString().contains("<Unknown>") &&
+                event.getMessage().toString().contains("The maximum data length was exceeded")) {
+                gotUnknownOperationInLog = true;
+            }
+        }
+    };
+
+
+    @Override
+    protected boolean isUseTcpConnector() {
+        return false;
+    }
+
+
+    @Override
+    protected boolean isUseNioPlusSslConnector() {
+        return true;
+    }
+
+
+    @Override
+    protected Socket createSocket() throws IOException {
+        SocketFactory factory = SSLSocketFactory.getDefault();
+        return factory.createSocket("127.0.0.1", this.nioSslPort);
+    }
+
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        // register custom Log4J Appender
+        org.apache.log4j.Logger.getRootLogger().addAppender(appender);
+
+        stompConnect();
+        connection = cf.createConnection("system", "manager");
+        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        queue = new ActiveMQQueue(getQueueName());
+        connection.start();
+    }
+
+
+    @Override
+    public void tearDown() throws Exception {
+        // unregister Log4J appender
+        org.apache.log4j.Logger.getRootLogger().removeAppender(appender);
+    }
+
+
+    /**
+     * Sends a Stomp message larger than maxDataLength bytes.
+     * Expects to receive an exception from the broker.
+     * The broker will throw an Stomp ProtocolException of type
+     * "Exception occurred processing: SEND -> 
+     * org.apache.activemq.transport.stomp.ProtocolException: 
+     * The maximum data length was exceeded"
+     * 
+     * Before bug AMQ-6526 this exception would contain \<Unkown\> for the 
+     * operation name. With the fix it should print the Stomp operation.
+     * 
+     * @throws Exception
+     */
+    @Test(timeout = 6000000)
+    public void testSendMessageBytes() throws Exception {
+
+        String frame = "CONNECT\n" + "login:system\n" + "passcode:manager\n" +
+                "accept-version:1.1" + "\n\n" + Stomp.NULL;
+        stompConnection.sendFrame(frame);
+
+        frame = stompConnection.receiveFrame();
+        assertTrue(frame.startsWith("CONNECTED"));
+
+        frame = "SEND\n" +
+                "value:newest" + "\n" +
+                "value:older" + "\n" +
+                "value:oldest" + "\n" +
+                "destination:/queue/" + getQueueName() +
+                "\n\n";
+
+        byte[] buffer = createLargeByteBuffer(stompFrameSize);
+        try {
+            stompConnection.sendFrame(frame, buffer);
+        } catch (Exception ex) {
+            LOG.error(ex.getMessage());
+        }
+        assertFalse("Stomp ProtocolException still contains <Unknown> operation.", gotUnknownOperationInLog);
+    }
+
+
+    /**
+     * Creates a large byte buffer and fills it with char 'X' except for the 
+     * last byte, it gets value 0x0 assigned.
+     * 
+     * @param size - the size of the array to be created.
+     * @return
+    */
+    protected byte[] createLargeByteBuffer(int size) {
+        byte[] buffer = new byte[size];
+        for (int i=0; i<size; i++) {
+            buffer[i] = (char) 'X';
+        }
+        //insert trailing 0x0 
+        buffer[size-1] = 0;
+        LOG.info("Created byte buffer of size {} starting with content {}", 
+            size,
+            new String(buffer,0,20));
+        return buffer;
+    }
+}