blob: d35f7beebc5b352585df2cf2160e164633b75403 [file] [log] [blame]
/*
* Copyright 1999,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.coyote.http11;
import org.apache.tomcat.util.buf.MessageBytes;
import org.apache.tomcat.util.buf.ByteChunk;
import org.apache.tomcat.util.http.MimeHeaders;
import org.apache.coyote.ActionCode;
import org.apache.coyote.Adapter;
import org.apache.coyote.Request;
import org.apache.coyote.Response;
/**
* Adapter which will return random responses using pipelining, which means it
* will never try to generate bogus responses.
*
* @author Remy Maucherat
*/
public class RandomAdapter
implements Adapter {
public static final String CRLF = "\r\n";
public static final byte[] b = "0123456789\r\n".getBytes();
public static final ByteChunk bc = new ByteChunk();
/**
* Service method, which dumps the request to the console.
*/
public void service(Request req, Response res)
throws Exception {
double rand = Math.random();
int n = (int) Math.round(10 * rand);
// Temp variables
byte[] buf = null;
int nRead = 0;
StringBuffer sbuf = new StringBuffer();
MimeHeaders headers = req.getMimeHeaders();
int size = headers.size();
switch (n) {
case 0:
// 0) Do nothing
System.out.println("Response 0");
break;
case 1:
// 1) Set content length, and write the appropriate content
System.out.println("Response 1");
res.setContentLength(b.length);
bc.setBytes(b, 0, b.length);
res.doWrite(bc);
break;
case 2:
// 2) Read the request data, and print out the number of bytes
// read
System.out.println("Response 2");
while (nRead >= 0) {
nRead = req.doRead(bc);
buf = ("Read " + nRead + " bytes\r\n").getBytes();
bc.setBytes(buf, 0, buf.length);
res.doWrite(bc);
}
break;
case 3:
// 3) Return 204 (no content), while reading once on input
System.out.println("Response 3");
res.setStatus(204);
nRead = req.doRead(bc);
res.setHeader("Info", "Read " + nRead + " bytes");
break;
case 4:
// 4) Do a request dump
System.out.println("Response 4");
sbuf.append("Request dump:");
sbuf.append(CRLF);
sbuf.append(req.method());
sbuf.append(" ");
sbuf.append(req.unparsedURI());
sbuf.append(" ");
sbuf.append(req.protocol());
sbuf.append(CRLF);
for (int i = 0; i < size; i++) {
sbuf.append(headers.getName(i) + ": ");
sbuf.append(headers.getValue(i).toString());
sbuf.append(CRLF);
}
sbuf.append("Request body:");
sbuf.append(CRLF);
res.action(ActionCode.ACTION_ACK, null);
ByteChunk bc2 = new ByteChunk();
byte[] b2 = sbuf.toString().getBytes();
bc2.setBytes(b2, 0, b2.length);
res.doWrite(bc2);
while (nRead >= 0) {
nRead = req.doRead(bc2);
if (nRead > 0)
res.doWrite(bc2);
}
break;
default:
// Response not implemented yet
System.out.println("Response " + n + " is not implemented yet");
}
/*
StringBuffer buf = new StringBuffer();
buf.append("Request dump:");
buf.append(CRLF);
buf.append(req.method());
buf.append(" ");
buf.append(req.unparsedURI());
buf.append(" ");
buf.append(req.protocol());
buf.append(CRLF);
MimeHeaders headers = req.getMimeHeaders();
int size = headers.size();
for (int i = 0; i < size; i++) {
buf.append(headers.getName(i) + ": ");
buf.append(headers.getValue(i).toString());
buf.append(CRLF);
}
buf.append("Request body:");
buf.append(CRLF);
res.action(ActionCode.ACTION_ACK, null);
ByteChunk bc = new ByteChunk();
byte[] b = buf.toString().getBytes();
bc.setBytes(b, 0, b.length);
res.doWrite(bc);
int nRead = 0;
while (nRead >= 0) {
nRead = req.doRead(bc);
if (nRead > 0)
res.doWrite(bc);
}
*/
}
}