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