You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/08/27 19:59:56 UTC

svn commit: r1517898 - in /tomcat/trunk/test/org/apache/coyote/ajp: SimpleAjpClient.java TestAbstractAjpProcessor.java TesterAjpMessage.java

Author: markt
Date: Tue Aug 27 17:59:56 2013
New Revision: 1517898

URL: http://svn.apache.org/r1517898
Log:
Extend the AJP test client to support methods other than GET and implement a simple POST test.

Modified:
    tomcat/trunk/test/org/apache/coyote/ajp/SimpleAjpClient.java
    tomcat/trunk/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java
    tomcat/trunk/test/org/apache/coyote/ajp/TesterAjpMessage.java

Modified: tomcat/trunk/test/org/apache/coyote/ajp/SimpleAjpClient.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/ajp/SimpleAjpClient.java?rev=1517898&r1=1517897&r2=1517898&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/ajp/SimpleAjpClient.java (original)
+++ tomcat/trunk/test/org/apache/coyote/ajp/SimpleAjpClient.java Tue Aug 27 17:59:56 2013
@@ -67,6 +67,11 @@ public class SimpleAjpClient {
      * Create a message to request the given URL.
      */
     public TesterAjpMessage createForwardMessage(String url) {
+        return createForwardMessage(url, 2);
+    }
+
+    public TesterAjpMessage createForwardMessage(String url, int method) {
+
         TesterAjpMessage message = new TesterAjpMessage(AJP_PACKET_SIZE);
         message.reset();
 
@@ -78,7 +83,7 @@ public class SimpleAjpClient {
         message.appendByte(Constants.JK_AJP13_FORWARD_REQUEST);
 
         // HTTP method, GET = 2
-        message.appendByte(0x02);
+        message.appendByte(method);
 
         // Protocol
         message.appendString("http");
@@ -101,26 +106,44 @@ public class SimpleAjpClient {
         // Is ssl
         message.appendByte(0x00);
 
-        // No other headers or attributes
-        message.appendInt(0);
+        return message;
+    }
 
-        // Terminator
-        message.appendByte(0xFF);
 
-        // End the message and set the length
+    public TesterAjpMessage createBodyMessage(byte[] data) {
+
+        TesterAjpMessage message = new TesterAjpMessage(AJP_PACKET_SIZE);
+        message.reset();
+
+        // Set the header bytes
+        message.getBuffer()[0] = 0x12;
+        message.getBuffer()[1] = 0x34;
+
+        message.appendBytes(data, 0, data.length);
         message.end();
 
         return message;
     }
 
+
     /**
      * Sends an TesterAjpMessage to the server and returns the response message.
      */
-    public TesterAjpMessage sendMessage(TesterAjpMessage message)
+    public TesterAjpMessage sendMessage(TesterAjpMessage headers)
             throws IOException {
-        // Send the message
+        return sendMessage(headers, null);
+    }
+
+    public TesterAjpMessage sendMessage(TesterAjpMessage headers,
+            TesterAjpMessage body) throws IOException {
+        // Send the headers
         socket.getOutputStream().write(
-                message.getBuffer(), 0, message.getLen());
+                headers.getBuffer(), 0, headers.getLen());
+        if (body != null) {
+            // Send the body of present
+            socket.getOutputStream().write(
+                    body.getBuffer(), 0, body.getLen());
+        }
         // Read the response
         return readMessage();
     }

Modified: tomcat/trunk/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java?rev=1517898&r1=1517897&r2=1517898&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java (original)
+++ tomcat/trunk/test/org/apache/coyote/ajp/TestAbstractAjpProcessor.java Tue Aug 27 17:59:56 2013
@@ -16,11 +16,12 @@
  */
 package org.apache.coyote.ajp;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import java.io.File;
 
+import org.junit.Assert;
 import org.junit.Test;
 
+import org.apache.catalina.Context;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 
@@ -56,8 +57,7 @@ public class TestAbstractAjpProcessor ex
         tomcat.start();
 
         // Must have a real docBase - just use temp
-        org.apache.catalina.Context ctx =
-            tomcat.addContext("", System.getProperty("java.io.tmpdir"));
+        Context ctx = tomcat.addContext("", System.getProperty("java.io.tmpdir"));
         Tomcat.addServlet(ctx, "helloWorld", new HelloWorldServlet());
         ctx.addServletMapping("/", "helloWorld");
 
@@ -70,6 +70,8 @@ public class TestAbstractAjpProcessor ex
         validateCpong(ajpClient.cping());
 
         TesterAjpMessage forwardMessage = ajpClient.createForwardMessage("/");
+        // Complete the message - no extra headers required.
+        forwardMessage.end();
 
         // Two requests
         for (int i = 0; i < 2; i++) {
@@ -90,6 +92,51 @@ public class TestAbstractAjpProcessor ex
         ajpClient.disconnect();
     }
 
+
+
+    @Test
+    public void testSimplePost() throws Exception {
+
+        Tomcat tomcat = getTomcatInstance();
+
+        // Use the normal Tomcat ROOT context
+        File root = new File("test/webapp");
+        tomcat.addWebapp("", root.getAbsolutePath());
+
+        tomcat.start();
+
+        SimpleAjpClient ajpClient = new SimpleAjpClient();
+        ajpClient.setPort(getPort());
+        ajpClient.connect();
+
+        validateCpong(ajpClient.cping());
+
+        TesterAjpMessage forwardMessage =
+                ajpClient.createForwardMessage("/echo-params.jsp", 4);
+        forwardMessage.addHeader(0xA008, "9");
+        forwardMessage.addHeader(0xA007, "application/x-www-form-urlencoded");
+        forwardMessage.end();
+
+        TesterAjpMessage bodyMessage =
+                ajpClient.createBodyMessage("test=data".getBytes());
+
+        TesterAjpMessage responseHeaders =
+                ajpClient.sendMessage(forwardMessage, bodyMessage);
+
+        // Expect 3 messages: headers, body, end
+        validateResponseHeaders(responseHeaders, 200);
+        // Skip the body
+        TesterAjpMessage responseBody = ajpClient.readMessage();
+        validateResponseBody(responseBody, "test - data");
+        validateResponseEnd(ajpClient.readMessage(), true);
+
+        // Double check the connection is still open
+        validateCpong(ajpClient.cping());
+
+        ajpClient.disconnect();
+    }
+
+
     /**
      * Process response header packet and checks the status. Any other data is
      * ignored.
@@ -97,20 +144,20 @@ public class TestAbstractAjpProcessor ex
     private void validateResponseHeaders(TesterAjpMessage message,
             int expectedStatus) throws Exception {
         // First two bytes should always be AB
-        assertEquals((byte) 'A', message.buf[0]);
-        assertEquals((byte) 'B', message.buf[1]);
+        Assert.assertEquals((byte) 'A', message.buf[0]);
+        Assert.assertEquals((byte) 'B', message.buf[1]);
 
         // Set the start position and read the length
         message.processHeader(false);
 
         // Check the length
-        assertTrue(message.len > 0);
+        Assert.assertTrue(message.len > 0);
 
         // Should be a header message
-        assertEquals(0x04, message.readByte());
+        Assert.assertEquals(0x04, message.readByte());
 
         // Check status
-        assertEquals(expectedStatus, message.readInt());
+        Assert.assertEquals(expectedStatus, message.readInt());
 
         // Read the status message
         message.readString();
@@ -132,51 +179,52 @@ public class TestAbstractAjpProcessor ex
      */
     private void validateResponseBody(TesterAjpMessage message,
             String expectedBody) throws Exception {
-        assertEquals((byte) 'A', message.buf[0]);
-        assertEquals((byte) 'B', message.buf[1]);
+
+        Assert.assertEquals((byte) 'A', message.buf[0]);
+        Assert.assertEquals((byte) 'B', message.buf[1]);
 
         // Set the start position and read the length
         message.processHeader(false);
 
         // Should be a body chunk message
-        assertEquals(0x03, message.readByte());
+        Assert.assertEquals(0x03, message.readByte());
 
         int len = message.readInt();
-        assertTrue(len > 0);
+        Assert.assertTrue(len > 0);
         String body = message.readString(len);
 
-        assertEquals(expectedBody, body);
+        Assert.assertTrue(body.contains(expectedBody));
     }
 
     private void validateResponseEnd(TesterAjpMessage message,
             boolean expectedReuse) {
-        assertEquals((byte) 'A', message.buf[0]);
-        assertEquals((byte) 'B', message.buf[1]);
+        Assert.assertEquals((byte) 'A', message.buf[0]);
+        Assert.assertEquals((byte) 'B', message.buf[1]);
 
         message.processHeader(false);
 
         // Should be an end body message
-        assertEquals(0x05, message.readByte());
+        Assert.assertEquals(0x05, message.readByte());
 
         // Check the length
-        assertEquals(2, message.getLen());
+        Assert.assertEquals(2, message.getLen());
 
         boolean reuse = false;
         if (message.readByte() > 0) {
             reuse = true;
         }
 
-        assertEquals(Boolean.valueOf(expectedReuse), Boolean.valueOf(reuse));
+        Assert.assertEquals(Boolean.valueOf(expectedReuse), Boolean.valueOf(reuse));
     }
 
     private void validateCpong(TesterAjpMessage message) throws Exception {
         // First two bytes should always be AB
-        assertEquals((byte) 'A', message.buf[0]);
-        assertEquals((byte) 'B', message.buf[1]);
+        Assert.assertEquals((byte) 'A', message.buf[0]);
+        Assert.assertEquals((byte) 'B', message.buf[1]);
         // CPONG should have a message length of 1
         // This effectively checks the next two bytes
-        assertEquals(1, message.getLen());
+        Assert.assertEquals(1, message.getLen());
         // Data should be the value 9
-        assertEquals(9, message.buf[4]);
+        Assert.assertEquals(9, message.buf[4]);
     }
 }

Modified: tomcat/trunk/test/org/apache/coyote/ajp/TesterAjpMessage.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/ajp/TesterAjpMessage.java?rev=1517898&r1=1517897&r2=1517898&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/ajp/TesterAjpMessage.java (original)
+++ tomcat/trunk/test/org/apache/coyote/ajp/TesterAjpMessage.java Tue Aug 27 17:59:56 2013
@@ -16,6 +16,9 @@
  */
 package org.apache.coyote.ajp;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Extends {@link AjpMessage} to provide additional methods for reading from the
  * message.
@@ -24,6 +27,9 @@ package org.apache.coyote.ajp;
  */
 public class TesterAjpMessage extends AjpMessage {
 
+    private final List<Header> headers = new ArrayList<>();
+
+
     public TesterAjpMessage(int packetSize) {
         super(packetSize);
     }
@@ -68,8 +74,29 @@ public class TesterAjpMessage extends Aj
         }
     }
 
+
+    public void addHeader(int code, String value) {
+        headers.add(new Header(code, value));
+    }
+
+
+    public void addHeader(String name, String value) {
+        headers.add(new Header(name, value));
+    }
+
+
     @Override
     public void end() {
+        // Add the header count
+        appendInt(headers.size());
+
+        for (Header header : headers) {
+            header.append(this);
+        }
+
+        // Terminator
+        appendByte(0xFF);
+
         len = pos;
         int dLen = len - 4;
 
@@ -80,4 +107,39 @@ public class TesterAjpMessage extends Aj
     }
 
 
+    @Override
+    public void reset() {
+        super.reset();
+        headers.clear();
+    }
+
+
+
+
+    private static class Header {
+        private final int code;
+        private final String name;
+        private final String value;
+
+        public Header(int code, String value) {
+            this.code = code;
+            this.name = null;
+            this.value = value;
+        }
+
+        public Header(String name, String value) {
+            this.code = 0;
+            this.name = name;
+            this.value = value;
+        }
+
+        public void append(TesterAjpMessage message) {
+            if (code == 0) {
+                message.appendString(name);
+            } else {
+                message.appendInt(code);
+            }
+            message.appendString(value);
+        }
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org