You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2008/04/23 19:21:24 UTC
svn commit: r650941 - in
/tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters:
CoyoteServer.java EchoAdapter.java MapperAdapter.java MessageReader.java
SleepAdapter.java StaticAdapter.java
Author: costin
Date: Wed Apr 23 10:21:20 2008
New Revision: 650941
URL: http://svn.apache.org/viewvc?rev=650941&view=rev
Log:
Few more fixes and adapters to help testing.
Added:
tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/EchoAdapter.java (with props)
tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/SleepAdapter.java (with props)
Modified:
tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/CoyoteServer.java
tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/MapperAdapter.java
tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/MessageReader.java
tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/StaticAdapter.java
Modified: tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/CoyoteServer.java
URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/CoyoteServer.java?rev=650941&r1=650940&r2=650941&view=diff
==============================================================================
--- tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/CoyoteServer.java (original)
+++ tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/CoyoteServer.java Wed Apr 23 10:21:20 2008
@@ -5,7 +5,9 @@
import org.apache.coyote.Adapter;
import org.apache.coyote.ProtocolHandler;
import org.apache.coyote.http11.Http11NioProtocol;
+import org.apache.coyote.http11.simple.SimpleProtocolHandler;
import org.apache.juli.JdkLoggerConfig;
+import org.apache.tomcat.util.buf.BufferInfo;
import org.apache.tomcat.util.modeler.Registry;
@@ -14,25 +16,37 @@
*
*/
public class CoyoteServer {
- int port = 8800;
- String args[];
+ protected int port = 8800;
+ protected String args[]; // saved to allow additional param extraction
+ protected boolean daemon = false;
+ /**
+ * Note indicating the response is COMET.
+ */
+ public static final int COMET_RES_NOTE = 2;
+ public static final int COMET_REQ_NOTE = 2;
+
+ public static final int ADAPTER_RES_NOTE = 1;
+ public static final int ADAPTER_REQ_NOTE = 1;
+
protected ProtocolHandler proto;
- Registry registry;
+ protected Registry registry;
protected Adapter adapter;
- int maxThreads = 20;
+ protected int maxThreads = 20;
+ boolean started = false;
- public CoyoteServer() {
+
+ public CoyoteServer() {
}
public CoyoteServer(int i) {
- port = i;
+ setPort(i);
}
public CoyoteServer(int i, Adapter adapter) {
- port = i;
+ setPort(i);
addAdapter("/", adapter);
}
@@ -71,9 +85,12 @@
start();
}
+ public void setDaemon(boolean b) {
+ daemon = b;
+ }
+
public void init() {
- new JdkLoggerConfig();
- initJMX();
+ JdkLoggerConfig.loadCustom();
}
protected void initAdapters() {
@@ -83,7 +100,11 @@
}
public void stop() throws Exception {
+ if (!started) {
+ return;
+ }
proto.destroy();
+ started = false;
}
/**
@@ -100,32 +121,67 @@
}
}
- public void setPort() {
+ public void setPort(int port) {
+ initJMX();
this.port = port;
}
-
+
/**
*/
- public static ProtocolHandler getDefaultConnector(int port) {
+ public static ProtocolHandler getDefaultConnector(int port, boolean daemon) {
+// try {
+// Library.initialize("tcnative-1");
+// Http11AprProtocol proto = new Http11AprProtocol();
+// proto.setCompression("on");
+// proto.setCompressionMinSize(32);
+// proto.setPort(port);
+// proto.getEndpoint().setDaemon(daemon);
+// return proto;
+// } catch (Exception e) {
+// e.printStackTrace();
+// //throw new RuntimeException(e);
+// }
+
+ SimpleProtocolHandler proto = new SimpleProtocolHandler();
+ proto.setPort(port);
+ proto.setDaemon(daemon);
+
+ return proto;
+ }
+
+ public void setNioConnector() {
Http11NioProtocol proto = new Http11NioProtocol();
proto.setCompression("on");
proto.setCompressionMinSize(32);
proto.setPort(port);
- proto.getEndpoint().setDaemon(false);
- return proto;
+ proto.getEndpoint().setDaemon(daemon);
+ setConnector(proto);
+ }
+
+ public void setConnector(ProtocolHandler h) {
+ this.proto = h;
}
public void start() {
try {
- proto = getDefaultConnector(port);
+ if (started) {
+ return;
+ }
+ if (proto == null) {
+ proto = getDefaultConnector(port, daemon);
+ }
initAdapters();
registry.registerComponent(adapter, ":name=adapter" + (port), null);
+ registry.registerComponent(BufferInfo.get(), ":name=BufferInfo" + port,
+ "BufferInfo");
proto.setAdapter(adapter);
registry.registerComponent(proto, ":name=ep-" + port, null);
- proto.start();
proto.init();
+ proto.start();
+
+ started = true;
} catch (Throwable e) {
e.printStackTrace();
}
@@ -135,6 +191,10 @@
ManagementFactory.getPlatformMBeanServer();
registry = Registry.getRegistry(null, null);
+ }
+
+ public boolean getStarted() {
+ return started;
}
}
Added: tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/EchoAdapter.java
URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/EchoAdapter.java?rev=650941&view=auto
==============================================================================
--- tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/EchoAdapter.java (added)
+++ tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/EchoAdapter.java Wed Apr 23 10:21:20 2008
@@ -0,0 +1,46 @@
+package org.apache.coyote.adapters;
+
+import java.util.logging.Logger;
+
+import org.apache.coyote.Adapter;
+import org.apache.coyote.Request;
+import org.apache.coyote.Response;
+import org.apache.coyote.client.AsyncHttp;
+import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.net.SocketStatus;
+
+/**
+ * Response is plain/text, copy of the received request
+ */
+public class EchoAdapter implements Adapter {
+ Logger log = Logger.getLogger("coyote.static");
+
+ String contentType = "text/plain";
+
+
+ public EchoAdapter() {
+ }
+
+ public void service(Request req, final Response res) throws Exception {
+ ByteChunk reqBuf = new ByteChunk(1024);
+ reqBuf.append("REQ HEAD:\n");
+ AsyncHttp.serializeRequest(req, reqBuf);
+ reqBuf.append("CONTENT_LENGTH:")
+ .append(Integer.toString(req.getContentLength()))
+ .append("\n");
+
+ res.setStatus(200);
+ res.setContentLength(reqBuf.getLength());
+ res.setContentType(contentType);
+
+ res.sendHeaders();
+
+ res.doWrite(reqBuf);
+ }
+
+ public boolean event(Request req, Response res, SocketStatus status)
+ throws Exception {
+ return false;
+ }
+
+}
\ No newline at end of file
Propchange: tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/EchoAdapter.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/MapperAdapter.java
URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/MapperAdapter.java?rev=650941&r1=650940&r2=650941&view=diff
==============================================================================
--- tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/MapperAdapter.java (original)
+++ tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/MapperAdapter.java Wed Apr 23 10:21:20 2008
@@ -185,12 +185,17 @@
}
// Final processing
- MessageWriter.getWriter(req, res, 0).flush();
- res.finish();
-
- req.recycle();
- res.recycle();
+ // TODO: only if not commet, this doesn't work with the
+ // other connectors since we don't have the info
+ // TODO: add this note in the nio/apr connectors
+ // TODO: play nice with TomcatLite, other adapters that flush/close
+ if (res.getNote(CoyoteServer.COMET_RES_NOTE) == null) {
+ MessageWriter.getWriter(req, res, 0).flush();
+ res.finish();
+ req.recycle();
+ res.recycle();
+ }
}
public Mapper getMapper() {
Modified: tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/MessageReader.java
URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/MessageReader.java?rev=650941&r1=650940&r2=650941&view=diff
==============================================================================
--- tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/MessageReader.java (original)
+++ tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/MessageReader.java Wed Apr 23 10:21:20 2008
@@ -66,13 +66,13 @@
/**
- * The byte buffer.
+ * The byte buffer. More data may be added to it while reading.
*/
private ByteChunk bb;
/**
- * The chunk buffer.
+ * The chunk buffer, will be filled in from the bb.
*/
private CharChunk cb;
@@ -100,13 +100,6 @@
*/
private boolean closed = false;
-
- /**
- * Byte chunk used to input bytes.
- */
- private ByteChunk inputChunk = new ByteChunk();
-
-
/**
* Encoding to use.
*/
@@ -120,9 +113,10 @@
/**
- * List of encoders.
+ * Cached encoders.
*/
- protected HashMap encoders = new HashMap();
+ protected HashMap<String, B2CConverter> encoders =
+ new HashMap<String, B2CConverter>();
/**
@@ -156,9 +150,7 @@
* Default constructor. Allocate the buffer with the default buffer size.
*/
public MessageReader() {
-
this(DEFAULT_BUFFER_SIZE);
-
}
@@ -168,7 +160,6 @@
* @param size Buffer size to use
*/
public MessageReader(int size) {
-
this.size = size;
bb = new ByteChunk(size);
bb.setLimit(size);
@@ -178,7 +169,6 @@
cb.setOptimizedWrite(false);
cb.setCharInputChannel(this);
cb.setCharOutputChannel(this);
-
}
@@ -323,7 +313,10 @@
enc = s;
}
-
+ /**
+ * Called when a read(char[]) operation is lacking data. It will read
+ * bytes.
+ */
public int realReadChars(char cbuf[], int off, int len)
throws IOException {
@@ -451,18 +444,8 @@
}
- public void checkConverter()
- throws IOException {
-
- if (!gotEnc)
- setConverter();
-
- }
-
-
protected void setConverter()
throws IOException {
-
if (coyoteRequest != null)
enc = coyoteRequest.getCharacterEncoding();
@@ -471,33 +454,8 @@
enc = DEFAULT_ENCODING;
conv = (B2CConverter) encoders.get(enc);
if (conv == null) {
- if (packageDefinitionEnabled && System.getSecurityManager() != null) {
- //SecurityUtil.isPackageProtectionEnabled()){
- try{
- conv = (B2CConverter)AccessController.doPrivileged(
- new PrivilegedExceptionAction(){
-
- public Object run() throws IOException{
- return new B2CConverter(enc);
- }
-
- }
- );
- }catch(PrivilegedActionException ex){
- Exception e = ex.getException();
- if (e instanceof IOException)
- throw (IOException)e;
- }
- } else {
- conv = new B2CConverter(enc);
- }
- encoders.put(enc, conv);
+ conv = new B2CConverter(enc);
+ encoders.put(enc, conv);
}
-
}
-
- private static boolean packageDefinitionEnabled =
- (System.getProperty("package.definition") == null &&
- System.getProperty("package.access") == null) ? false : true;
-
}
Added: tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/SleepAdapter.java
URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/SleepAdapter.java?rev=650941&view=auto
==============================================================================
--- tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/SleepAdapter.java (added)
+++ tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/SleepAdapter.java Wed Apr 23 10:21:20 2008
@@ -0,0 +1,57 @@
+package org.apache.coyote.adapters;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import org.apache.coyote.ActionCode;
+import org.apache.coyote.Request;
+import org.apache.coyote.Response;
+import org.apache.tomcat.util.net.SocketStatus;
+
+/**
+ * Test adapters that sleeps.
+ */
+public class SleepAdapter extends StaticAdapter {
+ long t1;
+ long t2;
+ long t3;
+ long t4;
+
+ public SleepAdapter() {
+ }
+
+ public SleepAdapter sleep(long t1, long t2, long t3,
+ long t4) {
+ this.t1 = t1;
+ this.t2 = t2;
+ this.t3 = t3;
+ this.t4 = t4;
+ return this;
+ }
+
+ public SleepAdapter sleep(long t1) {
+ return sleep(t1, t1, t1, t1);
+ }
+
+ public void service(Request req, final Response res) throws Exception {
+ Thread.currentThread().sleep(t1);
+ res.setStatus(200);
+ if (!chunked) {
+ res.setContentLength(mb.length() * 2);
+ }
+ res.setContentType(contentType);
+ res.sendHeaders();
+
+ Thread.currentThread().sleep(t2);
+
+ res.doWrite(mb);
+ res.action(ActionCode.ACTION_CLIENT_FLUSH, res);
+
+ Thread.currentThread().sleep(t3);
+
+ res.doWrite(mb);
+
+ Thread.currentThread().sleep(t4);
+ }
+
+}
\ No newline at end of file
Propchange: tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/SleepAdapter.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/StaticAdapter.java
URL: http://svn.apache.org/viewvc/tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/StaticAdapter.java?rev=650941&r1=650940&r2=650941&view=diff
==============================================================================
--- tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/StaticAdapter.java (original)
+++ tomcat/sandbox/tomcat-lite/coyote-extensions/org/apache/coyote/adapters/StaticAdapter.java Wed Apr 23 10:21:20 2008
@@ -20,8 +20,6 @@
public class StaticAdapter implements Adapter {
Logger log = Logger.getLogger("coyote.static");
ByteChunk mb = new ByteChunk();
- int len = 4096;
- byte[] data;
boolean chunked = false;
@@ -29,7 +27,7 @@
public StaticAdapter() {
- init();
+ setDefault(4096);
}
public StaticAdapter chunked() {
@@ -37,6 +35,25 @@
return this;
}
+ public StaticAdapter setData(byte[] data) {
+ mb.recycle();
+ mb.setBytes(data, 0, data.length);
+ return this;
+ }
+
+ public StaticAdapter setData(CharSequence data) {
+ mb.recycle();
+ try {
+ mb.append(data);
+ } catch (IOException e) {
+ }
+ return this;
+ }
+
+ public void setContentType(String ct) {
+ this.contentType = ct;
+ }
+
public void setFile(String path) {
try {
FileInputStream fis = new FileInputStream(path);
@@ -48,14 +65,13 @@
while ((rd = fis.read(b)) > 0) {
mb.append(b, 0, rd);
}
- len = mb.getLength();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
- public void init() {
- data = new byte[len];
+ private void setDefault(int len) {
+ byte[] data = new byte[len];
for (int i = 0; i < len; i++) {
data[i] = 'A';
}
@@ -66,7 +82,7 @@
res.setStatus(200);
if (!chunked) {
- res.setContentLength(len);
+ res.setContentLength(mb.length());
}
res.setContentType(contentType);
res.sendHeaders();
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org