1 16 17 package org.apache.ajp.test; 18 19 import java.io.IOException ; 20 import java.io.InputStream ; 21 import java.io.OutputStream ; 22 import java.net.ServerSocket ; 23 import java.net.Socket ; 24 25 import junit.framework.Test; 26 import junit.framework.TestCase; 27 import junit.framework.TestSuite; 28 29 import org.apache.ajp.Ajp13; 30 import org.apache.ajp.Ajp13Packet; 31 import org.apache.ajp.RequestHandler; 32 import org.apache.tomcat.util.http.BaseRequest; 33 import org.apache.tomcat.util.http.MimeHeaders; 34 35 public class TestAjp13 extends TestCase { 36 37 private static org.apache.commons.logging.Log log= 38 org.apache.commons.logging.LogFactory.getLog( TestAjp13.class ); 39 40 Ajp13Server server = null; 41 42 public TestAjp13(String name) { 43 super(name); 44 } 45 46 public static Test suite() { 47 return new TestSuite(TestAjp13.class); 48 } 49 50 protected void setUp() { 51 println("setup..."); 52 53 server = new Ajp13Server(); 54 server.start(); 55 } 56 57 protected void tearDown() { 58 println("tear down..."); 59 60 server.shutdown(); 61 } 62 63 public void test1() throws Exception { 64 println("running test1"); 65 66 Socket s = new Socket ("localhost", 8009); 67 68 Ajp13Packet p = new Ajp13Packet(Ajp13.MAX_PACKET_SIZE); 69 p.appendInt(0x1234); 70 p.appendInt(0); 71 p.setByteOff(4); 72 p.appendByte(RequestHandler.JK_AJP13_FORWARD_REQUEST); 73 p.appendByte((byte)2); 74 p.appendString("http"); 75 p.appendString("/test_uri"); 76 p.appendString("remote_addr"); 77 p.appendString("remote_host"); 78 p.appendString("server_name"); 79 p.appendInt(80); 80 p.appendBool(false); 81 p.appendInt(3); 82 p.appendString("my header"); 83 p.appendString("my header value"); 84 p.appendInt((0xA0 << 8) + RequestHandler.SC_REQ_AUTHORIZATION); 85 p.appendString("some auth string"); 86 p.appendInt((0xA0 << 8) + RequestHandler.SC_REQ_USER_AGENT); 87 p.appendString("TestAjp13 User Agent"); 88 p.appendByte(RequestHandler.SC_A_ARE_DONE); 89 90 int len = p.getByteOff() - 4; 91 p.setByteOff(2); 92 p.appendInt(len); 93 94 OutputStream os = s.getOutputStream(); 95 os.write(p.getBuff(), 0, len + 4); 96 97 InputStream is = s.getInputStream(); 98 99 println("decoding response..."); 100 101 boolean done = false; 102 while (!done) { 103 int b1, b2; 104 106 b1 = is.read(); 108 assertTrue("byte 1 was " + (char)b1, b1 == (int)'A'); 109 b2 = is.read(); 110 assertTrue("byte 2 was " + (char)b2, b2 == (int)'B'); 111 112 println("b1 = " + (char)b1 + "; b2 = " + (char)b2); 113 114 b1 = is.read(); 116 b1 &= 0xFF; 117 b2 = is.read(); 118 b2 &= 0xFF; 119 120 int l = (b1 << 8) + b2; 121 122 println("length = " + l); 123 124 byte[] buf = new byte[l]; 126 int n = 0; 127 int off = 0; 128 int total = 0; 129 while ((n = is.read(buf, off, l - off)) != -1 && (l - off != 0)) { 130 total += n; 131 off += n; 132 } 133 134 println("read " + total); 135 136 assertTrue("total read was " + total + 137 ", should have been " + l, 138 total == l); 139 140 141 142 int code = (int)buf[0]; 143 144 switch (code) { 145 case 3: 146 println("AJP13_SEND_BODY_CHUNK "); 147 break; 148 case 4: 149 println("AJP13_SEND_HEADERS "); 150 break; 151 case 5: 152 println("AJP13_END_RESPONSE "); 153 done = true; 154 break; 155 case 6: 156 println("AJP13_GET_BODY_CHUNK "); 157 break; 158 default: 159 assertTrue("invalid prefix code: " + code, false); 160 break; 161 } 162 } 163 164 println("shutting down socket..."); 165 s.shutdownOutput(); 166 s.shutdownInput(); 167 s.close(); 168 169 println("done test1..."); 170 } 171 172 protected static void println(String msg) { 173 if (log.isDebugEnabled()) 174 log.debug("[TestAjp13] " + msg); 175 } 176 177 public static void main(String [] args) throws Exception { 178 } 179 } 180 181 182 class Ajp13Server extends Thread { 183 184 boolean shutdown = false; 185 186 void shutdown() { 187 this.shutdown = true; 188 this.interrupt(); 189 } 190 191 public void run() { 192 try { 193 ServerSocket server = new ServerSocket (8009); 194 TestAjp13.println("Ajp13Server running..."); 195 Socket socket = server.accept(); 196 Ajp13 ajp13 = new Ajp13(); 197 MimeHeaders headers = new MimeHeaders(); 198 BaseRequest request = new BaseRequest(); 199 ajp13.setSocket(socket); 200 201 boolean moreRequests = true; 202 while (moreRequests && !shutdown) { 203 204 int status = 0; 205 try { 206 status = ajp13.receiveNextRequest(request); 207 } catch (IOException e) { 208 if (shutdown) { 209 TestAjp13.println("Ajp13Server told to shutdown"); 210 break; 211 } 212 TestAjp13.println("process: ajp13.receiveNextRequest -> " + e); 213 } 214 215 if( status==-2) { 216 break; 224 } 225 226 if( status == 999 ) 228 { 229 request.recycle(); 230 continue; 231 } 232 233 if( status != 200 ) 234 break; 235 236 TestAjp13.println(request.toString()); 237 238 String message = 239 "<html><body><pre>" + 240 "hello from ajp13: " + 241 System.getProperty("line.separator") + 242 request.toString() + 243 "</pre></body></html>"; 244 245 headers.addValue("content-type").setString( "text/html"); 246 headers.addValue("content-length").setInt(message.length()); 247 headers.addValue("my-header").setString( "my value"); 248 ajp13.sendHeaders(200, headers); 249 250 byte[] b = message.getBytes(); 251 ajp13.doWrite(b, 0, b.length); 252 253 ajp13.finish(); 254 255 request.recycle(); 256 headers.recycle(); 257 } 258 259 try { 260 ajp13.close(); 261 } catch (IOException e) { 262 TestAjp13.println("process: ajp13.close ->" + e); 263 } 264 265 try { 266 socket.close(); 267 } catch (IOException e) { 268 TestAjp13.println("process: socket.close ->" + e); 269 } 270 socket = null; 271 272 TestAjp13.println("process: done"); 273 274 } catch (Exception e) { 275 e.printStackTrace(); 276 throw new RuntimeException (e.toString()); 277 } 278 } 279 } 280 281 | Popular Tags |