KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > ajp > test > TestAjp13


1 /*
2  * Copyright 1999-2004 The Apache Software Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16
17 package org.apache.ajp.test;
18
19 import java.io.IOException JavaDoc;
20 import java.io.InputStream JavaDoc;
21 import java.io.OutputStream JavaDoc;
22 import java.net.ServerSocket JavaDoc;
23 import java.net.Socket JavaDoc;
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 JavaDoc 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 JavaDoc {
64         println("running test1");
65
66         Socket JavaDoc s = new Socket JavaDoc("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 JavaDoc os = s.getOutputStream();
95         os.write(p.getBuff(), 0, len + 4);
96
97         InputStream JavaDoc is = s.getInputStream();
98
99         println("decoding response...");
100         
101         boolean done = false;
102         while (!done) {
103             int b1, b2;
104             // read a packet
105

106             // first 2 bytes should be AB
107
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             // next is length
115
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             // now get data
125
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 JavaDoc msg) {
173         if (log.isDebugEnabled())
174             log.debug("[TestAjp13] " + msg);
175     }
176
177     public static void main(String JavaDoc[] args) throws Exception JavaDoc {
178     }
179 }
180
181
182 class Ajp13Server extends Thread JavaDoc {
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 JavaDoc server = new ServerSocket JavaDoc(8009);
194             TestAjp13.println("Ajp13Server running...");
195             Socket JavaDoc 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 JavaDoc 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                     // special case - shutdown
217
// XXX need better communication, refactor it
218
// if( !doShutdown(socket.getLocalAddress(),
219
// socket.getInetAddress())) {
220
// moreRequests = false;
221
// continue;
222
// }
223
break;
224                 }
225             
226                 // Special low level request allready handled (ie: PING/PONG)
227
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 JavaDoc 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 JavaDoc e) {
262                 TestAjp13.println("process: ajp13.close ->" + e);
263             }
264
265             try {
266                 socket.close();
267             } catch (IOException JavaDoc e) {
268                 TestAjp13.println("process: socket.close ->" + e);
269             }
270             socket = null;
271
272             TestAjp13.println("process: done");
273
274         } catch (Exception JavaDoc e) {
275             e.printStackTrace();
276             throw new RuntimeException JavaDoc(e.toString());
277         }
278     }
279 }
280
281
Popular Tags