Author: costin
Date: Mon Jul 10 11:42:39 2006
New Revision: 420610

URL: http://svn.apache.org/viewvc?rev=420610&view=rev
Log:
More fixes and enhancements to the micro-tomcat experiment


Added:
    tomcat/sandbox/bin/Coyote-Http11.launch
    tomcat/sandbox/bin/Tomcat6Sandbox.launch
    
tomcat/sandbox/java/org/apache/coyote/servlet/servlets/RequestInfoFilter.java
    tomcat/sandbox/java/org/apache/tomcat/servlets/file/WebdavServlet.java
    tomcat/sandbox/java/org/apache/tomcat/servlets/sec/
    tomcat/sandbox/java/org/apache/tomcat/servlets/sec/IPFilter.java
    tomcat/sandbox/java/org/apache/tomcat/servlets/sec/SimpleIPFilter.java
    tomcat/sandbox/java/org/apache/tomcat/servlets/util/
    tomcat/sandbox/java/org/apache/tomcat/servlets/util/URLEncoder.java
      - copied, changed from r415842, 
tomcat/sandbox/java/org/apache/tomcat/servlets/file/URLEncoder.java
Removed:
    tomcat/sandbox/Tomcat6Sandbox.launch
    tomcat/sandbox/java/org/apache/coyote/servlet/util/RequestUtil.java
    tomcat/sandbox/java/org/apache/tomcat/servlets/file/URLEncoder.java
    tomcat/sandbox/java/org/apache/tomcat/servlets/file/XsltDirServlet.java
    tomcat/sandbox/java/org/apache/tomcat/standalone/SingleMain.java
    tomcat/sandbox/java/org/apache/tomcat/standalone/WebappsMain.java
    tomcat/sandbox/java/org/apache/tomcat/util/log/JdkLoggerConfig.java
    tomcat/sandbox/java/org/apache/tomcat/util/log/JdkLoggerFormatter.java
    tomcat/sandbox/java/org/apache/tomcat/util/threads/ThreadPool.java
    tomcat/sandbox/java/org/apache/tomcat/util/threads/ThreadPoolRunnable.java
    tomcat/sandbox/java/org/apache/tomcat/util/threads/ThreadWithAttributes.java
Modified:
    tomcat/sandbox/build.xml
    
tomcat/sandbox/java/org/apache/commons/logging/LogConfigurationException.java
    tomcat/sandbox/java/org/apache/coyote/servlet/FilterChainImpl.java
    tomcat/sandbox/java/org/apache/coyote/servlet/FilterConfigImpl.java
    tomcat/sandbox/java/org/apache/coyote/servlet/Host.java
    tomcat/sandbox/java/org/apache/coyote/servlet/ServletContextImpl.java
    tomcat/sandbox/java/org/apache/coyote/servlet/ServletRequestImpl.java
    tomcat/sandbox/java/org/apache/coyote/servlet/ServletRequestWrapperImpl.java
    tomcat/sandbox/java/org/apache/coyote/servlet/WebappFilterMapper.java
    tomcat/sandbox/java/org/apache/tomcat/servlets/file/DefaultServlet.java
    tomcat/sandbox/java/org/apache/tomcat/standalone/ETomcat.java
    tomcat/sandbox/java/org/apache/tomcat/util/buf/ByteChunk.java
    tomcat/sandbox/java/org/apache/tomcat/util/net/http11/Http11Processor.java
    tomcat/sandbox/java/org/apache/tomcat/util/net/http11/Http11Protocol.java
    tomcat/sandbox/java/org/apache/tomcat/util/net/nio/NioEndpoint.java
    tomcat/sandbox/java/org/apache/tomcat/util/net/simple/SimpleEndpoint.java
    tomcat/sandbox/resources/coyote-servlet.MF
    tomcat/sandbox/resources/runtime.MF

Added: tomcat/sandbox/bin/Coyote-Http11.launch
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/bin/Coyote-Http11.launch?rev=420610&view=auto
==============================================================================
--- tomcat/sandbox/bin/Coyote-Http11.launch (added)
+++ tomcat/sandbox/bin/Coyote-Http11.launch Mon Jul 10 11:42:39 2006
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" 
value="org.apache.coyote.servlet.CoyoteMain"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="sandbox"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/sandbox"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" 
value="${workspace_loc:sandbox}"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" 
value="true"/>
+</launchConfiguration>

Added: tomcat/sandbox/bin/Tomcat6Sandbox.launch
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/bin/Tomcat6Sandbox.launch?rev=420610&view=auto
==============================================================================
--- tomcat/sandbox/bin/Tomcat6Sandbox.launch (added)
+++ tomcat/sandbox/bin/Tomcat6Sandbox.launch Mon Jul 10 11:42:39 2006
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" 
value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" 
value="org.apache.catalina.startup.Catalina"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="&lt;?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry 
containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER&quot; 
javaProject=&quot;sandbox&quot; path=&quot;1&quot; 
type=&quot;4&quot;/&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry 
id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento
 exportedEntriesOnly=&quot;false&quot; 
project=&quot;sandbox&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
+<listEntry value="&lt;?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;runtimeClasspathEntry 
path=&quot;3&quot; projectName=&quot;tomcat6&quot; 
type=&quot;1&quot;/&gt;&#10;"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" 
value="start"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="sandbox"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" 
value="-Dcom.sun.management.jmxremote"/>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/sandbox"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" 
value="${workspace_loc:tomcat6/build}"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" 
value="true"/>
+</launchConfiguration>

Modified: tomcat/sandbox/build.xml
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/build.xml?rev=420610&r1=420609&r2=420610&view=diff
==============================================================================
--- tomcat/sandbox/build.xml (original)
+++ tomcat/sandbox/build.xml Mon Jul 10 11:42:39 2006
@@ -10,7 +10,7 @@
 
   <property name="tc.base" location=".." />
 
-    <!-- Source dependencies -->
+  <!-- Source dependencies -->
   <property name="target.vm"     value="1.5"/>
   <property name="source.vm"     value="1.5"/>
 
@@ -41,8 +41,6 @@
 
   <property name="tc6.classes" location="${tc6.home}/.settings/output"/>
 
-  <!-- ======================= Single-jar minimal tomcat =========== -->
-
   <path id="runtime-deps" >  
     <pathelement location="${base.path}/tomcat-deps/jasper-compiler-jdt.jar" />
   </path>
@@ -85,6 +83,7 @@
     <mkdir dir="${sandbox.home}/classes" />
     <javac destdir="${sandbox.home}/classes" source="${source.vm}" 
       target="${target.vm}"
+      includeJavaRuntime="false"
       deprecation="false" 
       debug="false"  >
       <src path="${sandbox.home}/java" />
@@ -92,31 +91,15 @@
         <path refid="runtime-deps" />        
         <pathelement location="${tc6.classes}"/>
       </classpath>
+      <exclude name="org/apache/tomcat/standalone/**"/>
     </javac>
     <copy todir="${sandbox.home}/classes" >
       <fileset dir="${sandbox.home}/java" includes="**/*.properties **/*.xml"/>
     </copy>
   </target>
 
-  <target name="compile-tc6">
-    <mkdir dir="${tc6.classes}" />
-    <javac destdir="${tc6.classes}" 
-      source="${source.vm}" 
-      target="${target.vm}"
-      deprecation="false" 
-      debug="false"  >
-      <src path="${tc6.home}/java" />
-      <classpath>
-        <path refid="runtime-deps" />        
-      </classpath>
-    </javac>
-    <copy todir="${tc6.classes}" >
-      <fileset dir="${tc6.home}/java" includes="**/*.properties **/*.xml"/>
-    </copy>
-  </target>
-
   <target name="compile" 
-    depends="compile-sandbox,compile-tc6"/>
+    depends="compile-sandbox"/>
 
   <target name="clean-compile">
     <delete dir="${sandbox.home}/classes" includes="**"/>
@@ -133,26 +116,10 @@
     <jar jarfile="runtime/tomcat-runtime.jar" 
          manifest="resources/runtime.MF">
       <fileset dir="${tc6.classes}" >
-        <exclude name="org/apache/tomcat/util/buf/**"/>
-        <exclude name="org/apache/coyote/http11/*"/>
-        <exclude name="org/apache/tomcat/util/buf/**"/>
-        <exclude name="org/apache/tomcat/util/net/jsse/**"/>
-        <exclude name="org/apache/tomcat/util/threads/Expirer**"/>
-        <exclude name="org/apache/tomcat/util/threads/Reaper**"/>
-        <exclude name="org/apache/tomcat/util/threads/ThreadPoolListener.*"/>
-        <exclude name="org/apache/tomcat/util/threads/ThreadPool.*"/>
-        <exclude name="org/apache/tomcat/util/threads/Control**"/>
-        <exclude name="org/apache/tomcat/util/threads/Monitor**"/>
-        <exclude name="org/apache/tomcat/util/net/**"/>
         <exclude name="org/apache/jasper/**"/>
       </fileset>
       <fileset dir="${sandbox.home}/classes" >
-        <exclude name="org/apache/tomcat/util/net/Leader**"/>
-        <exclude name="org/apache/tomcat/util/net/Master**"/>
-        <exclude name="org/apache/tomcat/util/net/SSL**"/>
-        <exclude name="org/apache/tomcat/util/net/jsse/**"/>
-        <exclude name="org/apache/tomcat/util/net/ServerSocketFactory**"/>
-        <exclude name="org/apache/tomcat/util/net/Default**"/>
+        <include name="org/apache/tomcat/standalone/**"/>
       </fileset>
     </jar>
 
@@ -161,29 +128,30 @@
   <target name="coyote-servlet.jar" depends="compile,pack_coyote-servlet.jar"/>
   
   <target name="pack_coyote-servlet.jar" >
-    <jar destfile="runtime/coyote-servlet.jar" 
manifest="resources/coyote-servlet.MF">
+    <jar destfile="coyote-servlet.jar" manifest="resources/coyote-servlet.MF">
       <fileset dir="classes" >
-        <include name="org/apache/commons/**"/>
+        <include name="org/apache/commons/logging/*.class"/>
         <include name="org/apache/coyote/servlet/**"/>
+        <include name="org/apache/tomcat/servlets/**"/>
         <include name="org/apache/tomcat/util/buf/**"/>
         <include name="org/apache/tomcat/util/loader/**"/>
-        <include name="org/apache/tomcat/util/log/**"/>
         <include name="org/apache/tomcat/util/net/**"/>
-        <include name="org/apache/tomcat/util/threads/**"/>
-        <include name="org/apache/tomcat/servlets/file/**"/>
       </fileset>
       <fileset dir="${tc6.classes}" >
         <include name="javax/servlet/*"/>
         <include name="javax/servlet/http/*"/>
         <include name="org/apache/coyote/*"/>
-        <include name="org/apache/coyote/http11/Constants**"/>
-        <include name="org/apache/coyote/http11/*Filter.class"/>
+        <include name="org/apache/coyote/http11/Constants.class"/>
+        <include name="org/apache/coyote/http11/InputFilter.class"/>
+        <include name="org/apache/coyote/http11/OutputFilter.class"/>
         <include name="org/apache/coyote/http11/LocalStrings.properties"/>
         <include name="org/apache/coyote/http11/filters/**"/>
         <include name="org/apache/tomcat/util/collections/*"/>
-        <include name="org/apache/tomcat/util/net/URL*"/>
-        <include name="org/apache/tomcat/util/http/**"/>
+        <include name="org/apache/tomcat/util/http/*"/>
+        <include 
name="org/apache/tomcat/util/http/res/LocalStrings.properties"/>
         <include name="org/apache/tomcat/util/res/**"/>
+        <include name="org/apache/tomcat/util/*"/>
+        <include name="org/apache/tomcat/util/net/URL*"/>
         <include name="org/apache/tomcat/util/*"/>
       </fileset>
     </jar>

Modified: 
tomcat/sandbox/java/org/apache/commons/logging/LogConfigurationException.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/commons/logging/LogConfigurationException.java?rev=420610&r1=420609&r2=420610&view=diff
==============================================================================
--- 
tomcat/sandbox/java/org/apache/commons/logging/LogConfigurationException.java 
(original)
+++ 
tomcat/sandbox/java/org/apache/commons/logging/LogConfigurationException.java 
Mon Jul 10 11:42:39 2006
@@ -33,9 +33,7 @@
      * Construct a new exception with <code>null</code> as its detail message.
      */
     public LogConfigurationException() {
-
         super();
-
     }
 
 
@@ -45,9 +43,7 @@
      * @param message The detail message
      */
     public LogConfigurationException(String message) {
-
         super(message);
-
     }
 
 
@@ -58,9 +54,7 @@
      * @param cause The underlying cause
      */
     public LogConfigurationException(Throwable cause) {
-
-        this((cause == null) ? null : cause.toString(), cause);
-
+        this( ((cause == null) ? null : cause.toString()), cause);
     }
 
 
@@ -72,7 +66,7 @@
      */
     public LogConfigurationException(String message, Throwable cause) {
 
-        super(message + " (Caused by " + cause + ")");
+        super(message);
         this.cause = cause; // Two-argument version requires JDK 1.4 or later
 
     }

Modified: tomcat/sandbox/java/org/apache/coyote/servlet/FilterChainImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/coyote/servlet/FilterChainImpl.java?rev=420610&r1=420609&r2=420610&view=diff
==============================================================================
--- tomcat/sandbox/java/org/apache/coyote/servlet/FilterChainImpl.java 
(original)
+++ tomcat/sandbox/java/org/apache/coyote/servlet/FilterChainImpl.java Mon Jul 
10 11:42:39 2006
@@ -42,32 +42,19 @@
  * @version $Revision: 303523 $ $Date: 2004-11-22 08:35:18 -0800 (Mon, 22 Nov 
2004) $
  */
 
-final class FilterChainImpl implements FilterChain {
+public final class FilterChainImpl implements FilterChain {
 
-    public static final int INCREMENT = 10;
+    public static final int INCREMENT = 8;
 
-
-    // ----------------------------------------------------------- Constructors
-
-
-    /**
-     * Construct a new chain instance with no defined filters.
-     */
     public FilterChainImpl() {
-
         super();
-
     }
 
-
-    // ----------------------------------------------------- Instance Variables
-
-
     /**
      * Filters.
      */
     private FilterConfigImpl[] filters = 
-        new FilterConfigImpl[0];
+        new FilterConfigImpl[8];
 
 
     /**
@@ -89,6 +76,9 @@
     private Servlet servlet = null;
 
 
+    private ServletConfigImpl wrapper;
+
+
     /**
      * The string manager for our package.
      */
@@ -96,29 +86,6 @@
       StringManager.getManager("org.apache.coyote.servlet");
 
 
-    /**
-     * The InstanceSupport instance associated with our Wrapper (used to
-     * send "before filter" and "after filter" events.
-     */
-//    private InstanceSupport support = null;
-
-    
-    /**
-     * Static class array used when the SecurityManager is turned on and 
-     * <code>doFilter</code is invoked.
-     */
-    private static Class[] classType = new Class[]{ServletRequest.class, 
-                                                   ServletResponse.class,
-                                                   FilterChain.class};
-                                                   
-    /**
-     * Static class array used when the SecurityManager is turned on and 
-     * <code>service</code is invoked.
-     */                                                 
-    private static Class[] classTypeUsedInService = new Class[]{
-                                                         ServletRequest.class,
-                                                         
ServletResponse.class};
-
     // ---------------------------------------------------- FilterChain Methods
 
 
@@ -184,7 +151,7 @@
      *
      * @param filterConfig The FilterConfig for the servlet to be executed
      */
-    void addFilter(FilterConfigImpl filterConfig) {
+    public void addFilter(FilterConfigImpl filterConfig) {
         if (n == filters.length) {
             FilterConfigImpl[] newFilters =
                 new FilterConfigImpl[n + INCREMENT];
@@ -207,13 +174,32 @@
 
     /**
      * Set the servlet that will be executed at the end of this chain.
-     *
-     * @param servlet The Wrapper for the servlet to be executed
+     * Set by the mapper filter 
      */
-    public void setServlet(Servlet servlet) {
-
+    public void setServlet(ServletConfigImpl wrapper, Servlet servlet) {
+        this.wrapper = wrapper;
         this.servlet = servlet;
-
     }
 
+    // ------ Getters for information ------------ 
+    
+    public int getSize() {
+        return n;
+    }
+    
+    public FilterConfigImpl getFilter(int i) {
+        return filters[i];
+    }
+    
+    public Servlet getServlet() {
+        return servlet;
+    }
+    
+    public ServletConfigImpl getServletConfig() {
+        return wrapper;
+    }
+    
+    public int getPos() {
+        return pos;
+    }
 }

Modified: tomcat/sandbox/java/org/apache/coyote/servlet/FilterConfigImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/coyote/servlet/FilterConfigImpl.java?rev=420610&r1=420609&r2=420610&view=diff
==============================================================================
--- tomcat/sandbox/java/org/apache/coyote/servlet/FilterConfigImpl.java 
(original)
+++ tomcat/sandbox/java/org/apache/coyote/servlet/FilterConfigImpl.java Mon Jul 
10 11:42:39 2006
@@ -42,7 +42,7 @@
  *  
  *  
  */
-final class FilterConfigImpl implements FilterConfig, Serializable {
+public final class FilterConfigImpl implements FilterConfig, Serializable {
 
     public FilterConfigImpl(ServletContextImpl context) {
         super();

Modified: tomcat/sandbox/java/org/apache/coyote/servlet/Host.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/coyote/servlet/Host.java?rev=420610&r1=420609&r2=420610&view=diff
==============================================================================
--- tomcat/sandbox/java/org/apache/coyote/servlet/Host.java (original)
+++ tomcat/sandbox/java/org/apache/coyote/servlet/Host.java Mon Jul 10 11:42:39 
2006
@@ -566,7 +566,9 @@
         // destroy our child containers, if any
         //Container children[] = findChildren();
 //        super.destroy();
-        for (Object child: children.values()) {
+        Iterator valI = children.values().iterator();
+        while (valI.hasNext()) {
+            Object child = valI.next();
            ((ServletContextImpl)child).destroy();
         }
       

Modified: tomcat/sandbox/java/org/apache/coyote/servlet/ServletContextImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/coyote/servlet/ServletContextImpl.java?rev=420610&r1=420609&r2=420610&view=diff
==============================================================================
--- tomcat/sandbox/java/org/apache/coyote/servlet/ServletContextImpl.java 
(original)
+++ tomcat/sandbox/java/org/apache/coyote/servlet/ServletContextImpl.java Mon 
Jul 10 11:42:39 2006
@@ -48,6 +48,7 @@
 import org.apache.coyote.servlet.util.MappingData;
 import org.apache.coyote.servlet.webxml.WebXml;
 import org.apache.tomcat.servlets.file.DefaultServlet;
+import org.apache.tomcat.servlets.file.WebdavServlet;
 import org.apache.tomcat.util.buf.CharChunk;
 import org.apache.tomcat.util.buf.MessageBytes;
 import org.apache.tomcat.util.loader.Repository;
@@ -1070,7 +1071,7 @@
 
         // Add default mappings.
         ServletConfig fileS =
-            facade.createServletWrapper(this, "default", new DefaultServlet());
+            facade.createServletWrapper(this, "default", new WebdavServlet());
         facade.addMapping("/", fileS);
 
         WebXml webXml = new WebXml(this);

Modified: tomcat/sandbox/java/org/apache/coyote/servlet/ServletRequestImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/coyote/servlet/ServletRequestImpl.java?rev=420610&r1=420609&r2=420610&view=diff
==============================================================================
--- tomcat/sandbox/java/org/apache/coyote/servlet/ServletRequestImpl.java 
(original)
+++ tomcat/sandbox/java/org/apache/coyote/servlet/ServletRequestImpl.java Mon 
Jul 10 11:42:39 2006
@@ -45,21 +45,13 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
-//import org.apache.catalina.Globals;
-//import org.apache.catalina.Realm;
-
-//import org.apache.catalina.util.ParameterMap;
-//import org.apache.catalina.util.RequestUtil;
-//import org.apache.catalina.util.StringParser;
-
 import org.apache.coyote.ActionCode;
 import org.apache.coyote.servlet.util.Enumerator;
 import org.apache.coyote.servlet.util.MappingData;
 import org.apache.coyote.servlet.util.MessageReader;
 import org.apache.coyote.servlet.util.ParameterMap;
-import org.apache.coyote.servlet.util.RequestUtil;
+import org.apache.tomcat.servlets.util.RequestUtil;
 import org.apache.coyote.servlet.util.StringParser;
-
 import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.MessageBytes;
 import org.apache.tomcat.util.buf.StringCache;
@@ -737,7 +729,7 @@
     /**
      * Get filter chain associated with the request.
      */
-    public FilterChain getFilterChain() {
+    public FilterChainImpl getFilterChain() {
         return (this.filterChain);
     }
 

Modified: 
tomcat/sandbox/java/org/apache/coyote/servlet/ServletRequestWrapperImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/coyote/servlet/ServletRequestWrapperImpl.java?rev=420610&r1=420609&r2=420610&view=diff
==============================================================================
--- 
tomcat/sandbox/java/org/apache/coyote/servlet/ServletRequestWrapperImpl.java 
(original)
+++ 
tomcat/sandbox/java/org/apache/coyote/servlet/ServletRequestWrapperImpl.java 
Mon Jul 10 11:42:39 2006
@@ -32,7 +32,7 @@
 import javax.servlet.http.HttpSession;
 
 import org.apache.coyote.servlet.util.Enumerator;
-import org.apache.coyote.servlet.util.RequestUtil;
+import org.apache.tomcat.servlets.util.RequestUtil;
 import org.apache.tomcat.util.res.StringManager;
 
 //import org.apache.catalina.Globals;

Modified: tomcat/sandbox/java/org/apache/coyote/servlet/WebappFilterMapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/coyote/servlet/WebappFilterMapper.java?rev=420610&r1=420609&r2=420610&view=diff
==============================================================================
--- tomcat/sandbox/java/org/apache/coyote/servlet/WebappFilterMapper.java 
(original)
+++ tomcat/sandbox/java/org/apache/coyote/servlet/WebappFilterMapper.java Mon 
Jul 10 11:42:39 2006
@@ -21,8 +21,6 @@
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -32,8 +30,7 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
-
-import org.apache.coyote.servlet.util.RequestUtil;
+import org.apache.tomcat.servlets.util.RequestUtil;
 
 /**
  * First filter after the context and servlet are mapped. It will add 
@@ -149,7 +146,7 @@
             filterChain = new FilterChainImpl();
         }
 
-        filterChain.setServlet(servlet);
+        filterChain.setServlet(wrapper, servlet);
 
         // If there are no filter mappings, we are done
         if ((filterMaps.size() == 0))

Added: 
tomcat/sandbox/java/org/apache/coyote/servlet/servlets/RequestInfoFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/coyote/servlet/servlets/RequestInfoFilter.java?rev=420610&view=auto
==============================================================================
--- 
tomcat/sandbox/java/org/apache/coyote/servlet/servlets/RequestInfoFilter.java 
(added)
+++ 
tomcat/sandbox/java/org/apache/coyote/servlet/servlets/RequestInfoFilter.java 
Mon Jul 10 11:42:39 2006
@@ -0,0 +1,86 @@
+/*
+ */
+package org.apache.coyote.servlet.servlets;
+
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.Enumeration;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestWrapper;
+import javax.servlet.ServletResponse;
+import javax.servlet.ServletResponseWrapper;
+
+import org.apache.coyote.servlet.FilterChainImpl;
+import org.apache.coyote.servlet.ServletRequestImpl;
+import org.apache.coyote.servlet.ServletResponseImpl;
+import org.apache.tomcat.util.http.MimeHeaders;
+
+public class RequestInfoFilter implements Filter {
+
+    public void init(FilterConfig filterConfig) throws ServletException {
+    }
+
+    public void doFilter(ServletRequest request, 
+                         ServletResponse response, 
+                         FilterChain chain) 
+            throws IOException, ServletException {
+        
+        PrintStream out = System.err;
+        while (request instanceof ServletRequestWrapper) {
+            request = ((ServletRequestWrapper)request).getRequest();
+        }
+        ServletRequestImpl req = (ServletRequestImpl)request;
+        // TODO: cookies, session, headers
+        out.println("Q(" + 
+                req.getMethod() + " H:" + 
+                req.getServerName() + " L:" +
+                req.getContentLength() + " C:" +
+                req.getContextPath() + " S:" + 
+                req.getServletPath() + " P:" +
+                req.getPathInfo() + " Q:" +
+                req.getQueryString() + " " +
+                ")");
+        FilterChainImpl filterChain = req.getFilterChain();
+        for( int i=0; i<filterChain.getSize(); i++) {
+            out.println("F: " +filterChain.getFilter(i).getFilterName());
+        }
+        out.println("S: " + filterChain.getServletConfig().getServletName());
+        
+        Enumeration headerNames = req.getHeaderNames();
+        while (headerNames.hasMoreElements()) {
+            String hn = (String)headerNames.nextElement();
+            Enumeration headers = req.getHeaders(hn);
+            while(headers.hasMoreElements()) {
+                out.println(hn + ": " + headers.nextElement());
+            }
+        }
+        chain.doFilter(request, response);
+        while (response instanceof ServletResponseWrapper) {
+            response = ((ServletResponseWrapper)response).getResponse();
+        }
+        if ( response instanceof ServletResponseImpl) {
+            ServletResponseImpl res = (ServletResponseImpl)response;
+            out.println("R(" + res.getStatus() + " " +
+                    res.getContentLength() + " " + 
+                    res.getContentType() + " " + 
+                    ")");
+            MimeHeaders headerNames2 = 
res.getCoyoteResponse().getMimeHeaders();
+            for( int i = 0; i < headerNames2.size(); i++ ) {
+                out.println(headerNames2.getName(i) + ": " + 
+                        headerNames2.getValue(i));
+            }
+        } else {
+            out.println("R(Unexpected wrapped object)");
+        }
+        out.println();
+    }
+
+    public void destroy() {
+    }
+
+}

Modified: 
tomcat/sandbox/java/org/apache/tomcat/servlets/file/DefaultServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/sandbox/java/org/apache/tomcat/servlets/file/DefaultServlet.java?rev=420610&r1=420609&r2=420610&view=diff
==============================================================================
--- tomcat/sandbox/java/org/apache/tomcat/servlets/file/DefaultServlet.java 
(original)
+++ tomcat/sandbox/java/org/apache/tomcat/servlets/file/DefaultServlet.java Mon 
Jul 10 11:42:39 2006
@@ -23,7 +23,6 @@
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -46,6 +45,7 @@
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.catalina.util.ServerInfo;
+import org.apache.tomcat.servlets.util.URLEncoder;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -60,25 +60,24 @@
 
 
     // ----------------------------------------------------- Instance Variables
-    /**
-     * HTTP date format.
-     */
-    protected static final SimpleDateFormat format =
-        new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
-
+    
 
     /**
      * Should we generate directory listings?
      */
     protected boolean listings = true;
 
-
     /**
-     * Read only flag. By default, it's set to true.
+     * Array containing the safe characters set.
      */
-    protected boolean readOnly = true;
+    protected static URLEncoder urlEncoder;
 
+    /**
+     * Allow a readme file to be included.
+     */
+    protected String readmeFile = null;
 
+    // TODO: find a better default
     /**
      * The input buffer size to use when serving resources.
      */
@@ -90,31 +89,19 @@
     protected int output = 2048;
 
     /**
-     * Size of file transfer buffer in bytes.
-     */
-    protected static final int BUFFER_SIZE = 4096;
-
-    /**
-     * Array containing the safe characters set.
-     */
-    protected static URLEncoder urlEncoder;
-
-    /**
-     * Allow a readme file to be included.
-     */
-    protected String readmeFile = null;
-
-    /**
      * File encoding to be used when reading static files. If none is specified
      * the platform default is used.
      */
     protected String fileEncoding = null;
+
+    ThreadLocal formatTL = new ThreadLocal();
         
     /**
      * Full range marker.
      */
     protected static ArrayList FULL = new ArrayList();
-    
+
+    // Context base dir
     protected File basePath;
     protected String basePathName;
     
@@ -185,24 +172,14 @@
             ;
         }
         try {
-            value = getServletConfig().getInitParameter("readonly");
-            if (value != null)
-                readOnly = (new Boolean(value)).booleanValue();
-        } catch (Throwable t) {
-            ;
-        }
-        try {
             value = getServletConfig().getInitParameter("output");
             output = Integer.parseInt(value);
         } catch (Throwable t) {
             ;
         }
-        try {
-            value = getServletConfig().getInitParameter("fileEncoding");
-            fileEncoding = value;
-        } catch (Throwable t) {
-            ;
-        }
+        fileEncoding = getServletConfig().getInitParameter("fileEncoding");
+        
+        readmeFile = getServletConfig().getInitParameter("readmeFile");
 
         
         // Sanity check on the specified buffer sizes
@@ -227,7 +204,8 @@
 
     
     /**
-     * Return the relative path associated with this servlet.
+     * Return the relative path associated with this servlet. 
+     * Multiple sources are used - include attribute, servlet path, etc
      *
      * @param request The servlet request we are processing
      */
@@ -260,19 +238,8 @@
             result = "/";
         }
         return (result);
-
     }
 
-
-    /**
-     * Process a GET request for the specified resource.
-     *
-     * @param request The servlet request we are processing
-     * @param response The servlet response we are creating
-     *
-     * @exception IOException if an input/output error occurs
-     * @exception ServletException if a servlet-specified error occurs
-     */
     protected void doGet(HttpServletRequest request,
                          HttpServletResponse response)
         throws IOException, ServletException {
@@ -283,15 +250,6 @@
     }
 
 
-    /**
-     * Process a HEAD request for the specified resource.
-     *
-     * @param request The servlet request we are processing
-     * @param response The servlet response we are creating
-     *
-     * @exception IOException if an input/output error occurs
-     * @exception ServletException if a servlet-specified error occurs
-     */
     protected void doHead(HttpServletRequest request,
                           HttpServletResponse response)
         throws IOException, ServletException {
@@ -302,15 +260,6 @@
     }
 
 
-    /**
-     * Process a POST request for the specified resource.
-     *
-     * @param request The servlet request we are processing
-     * @param response The servlet response we are creating
-     *
-     * @exception IOException if an input/output error occurs
-     * @exception ServletException if a servlet-specified error occurs
-     */
     protected void doPost(HttpServletRequest request,
                           HttpServletResponse response)
         throws IOException, ServletException {
@@ -318,189 +267,6 @@
     }
 
 
-    /**
-     * Process a POST request for the specified resource.
-     *
-     * @param req The servlet request we are processing
-     * @param resp The servlet response we are creating
-     *
-     * @exception IOException if an input/output error occurs
-     * @exception ServletException if a servlet-specified error occurs
-     */
-    protected void doPut(HttpServletRequest req, HttpServletResponse resp)
-        throws ServletException, IOException {
-
-        if (readOnly) {
-            resp.sendError(HttpServletResponse.SC_FORBIDDEN);
-            return;
-        }
-
-        String path = getRelativePath(req);
-
-        if (path.indexOf("..") >= 0) {
-            // not supported, too dangerous
-            // what else to escape ?
-            resp.setStatus(404);
-            return;
-        }
-
-        File resFile = new File(basePath, path);
-        boolean exists = resFile.exists();
-        
-
-        // extra check
-        if (!resFile.getCanonicalPath().startsWith(basePathName)) {
-            //log.info("File outside basedir " + basePathS + " " + f);
-            resp.setStatus(404);
-            return;
-        }
-
-
-        boolean result = true;
-
-        // Temp. content file used to support partial PUT
-        File contentFile = null;
-
-        Range range = parseContentRange(req, resp);
-
-        InputStream resourceInputStream = null;
-
-        // Append data specified in ranges to existing content for this
-        // resource - create a temp. file on the local filesystem to
-        // perform this operation
-        // Assume just one range is specified for now
-        if (range != null) {
-            //contentFile = executePartialPut(req, range, path);
-            //resourceInputStream = new FileInputStream(contentFile);
-            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
-            return;
-        } else {
-            resourceInputStream = req.getInputStream();
-        }
-
-        try {
-            // will override 
-            FileOutputStream fos = new FileOutputStream(resFile);
-            copy(resourceInputStream, fos);
-        } catch(IOException e) {
-            result = false;
-        }
-
-        if (result) {
-            if (exists) {
-                resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
-            } else {
-                resp.setStatus(HttpServletResponse.SC_CREATED);
-            }
-        } else {
-            resp.sendError(HttpServletResponse.SC_CONFLICT);
-        }
-
-    }
-
-
-    /**
-     * Handle a partial PUT.  New content specified in request is appended to
-     * existing content in oldRevisionContent (if present). This code does
-     * not support simultaneous partial updates to the same resource.
-     */
-//    protected File executePartialPut(HttpServletRequest req, Range range,
-//                                     String path)
-//        throws IOException {
-//
-//        // Append data specified in ranges to existing content for this
-//        // resource - create a temp. file on the local filesystem to
-//        // perform this operation
-//        File tempDir = (File) getServletContext().getAttribute
-//            ("javax.servlet.context.tempdir");
-//        // Convert all '/' characters to '.' in resourcePath
-//        String convertedResourcePath = path.replace('/', '.');
-//        File contentFile = new File(tempDir, convertedResourcePath);
-//        if (contentFile.createNewFile()) {
-//            // Clean up contentFile when Tomcat is terminated
-//            contentFile.deleteOnExit();
-//        }
-//
-//        RandomAccessFile randAccessContentFile =
-//            new RandomAccessFile(contentFile, "rw");
-//
-//        Resource oldResource = null;
-//        try {
-//            Object obj = resources.lookup(path);
-//            if (obj instanceof Resource)
-//                oldResource = (Resource) obj;
-//        } catch (NamingException e) {
-//        }
-//
-//        // Copy data in oldRevisionContent to contentFile
-//        if (oldResource != null) {
-//            BufferedInputStream bufOldRevStream =
-//                new BufferedInputStream(oldResource.streamContent(),
-//                                        BUFFER_SIZE);
-//
-//            int numBytesRead;
-//            byte[] copyBuffer = new byte[BUFFER_SIZE];
-//            while ((numBytesRead = bufOldRevStream.read(copyBuffer)) != -1) {
-//                randAccessContentFile.write(copyBuffer, 0, numBytesRead);
-//            }
-//
-//            bufOldRevStream.close();
-//        }
-//
-//        randAccessContentFile.setLength(range.length);
-//
-//        // Append data in request input stream to contentFile
-//        randAccessContentFile.seek(range.start);
-//        int numBytesRead;
-//        byte[] transferBuffer = new byte[BUFFER_SIZE];
-//        BufferedInputStream requestBufInStream =
-//            new BufferedInputStream(req.getInputStream(), BUFFER_SIZE);
-//        while ((numBytesRead = requestBufInStream.read(transferBuffer)) != 
-1) {
-//            randAccessContentFile.write(transferBuffer, 0, numBytesRead);
-//        }
-//        randAccessContentFile.close();
-//        requestBufInStream.close();
-//
-//        return contentFile;
-//
-//    }
-
-
-    /**
-     * Process a POST request for the specified resource.
-     *
-     * @param req The servlet request we are processing
-     * @param resp The servlet response we are creating
-     *
-     * @exception IOException if an input/output error occurs
-     * @exception ServletException if a servlet-specified error occurs
-     */
-    protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
-        throws ServletException, IOException {
-
-        if (readOnly) {
-            resp.sendError(HttpServletResponse.SC_FORBIDDEN);
-            return;
-        }
-
-        String path = getRelativePath(req);
-
-        File resFile = new File(basePath, path);
-
-        boolean exists = resFile.exists();
-
-        if (exists) {
-            boolean result = resFile.delete();
-            if (result) {
-                resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
-            } else {
-                resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
-            }
-        } else {
-            resp.sendError(HttpServletResponse.SC_NOT_FOUND);
-        }
-
-    }
 
 
     /**
@@ -533,15 +299,8 @@
      * @param resourceAttributes The resource information
      */
     protected String getETag(File resourceAttributes) {
-        String result = null;
-//        if ((result = resourceAttributes.getETag(true)) != null) {
-//            return result;
-//        } else if ((result = resourceAttributes.getETag()) != null) {
-//            return result;
-//        } else {
-            return "W/\"" + resourceAttributes.length() + "-"
+        return "W/\"" + resourceAttributes.length() + "-"
                 + resourceAttributes.lastModified() + "\"";
-//        }
     }
 
 
@@ -772,13 +531,15 @@
 
     }
 
-
     protected String lastModifiedHttp(File resFile) {
         String lastModifiedHttp = null;
-        // TODO: use thread local, no sync lock
-        synchronized (format) {
-            lastModifiedHttp = format.format(new Date(resFile.lastModified()));
+        SimpleDateFormat format = (SimpleDateFormat)formatTL.get();
+        if (format == null) {
+            format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", 
+                    Locale.US);
+            formatTL.set(format);
         }
+        lastModifiedHttp = format.format(new Date(resFile.lastModified()));
         return lastModifiedHttp;
     }
 
@@ -1921,5 +1682,68 @@
         }
         return null;
     }
-    
+
+    /**
+     * Return a context-relative path, beginning with a "/", that represents
+     * the canonical version of the specified path after ".." and "." elements
+     * are resolved out.  If the specified path attempts to go outside the
+     * boundaries of the current context (i.e. too many ".." path elements
+     * are present), return <code>null</code> instead.
+     *
+     * @param path Path to be normalized
+     */
+    protected String normalize(String path) {
+
+        if (path == null)
+            return null;
+
+        // Create a place for the normalized path
+        String normalized = path;
+
+        if (normalized == null)
+            return (null);
+
+        if (normalized.equals("/."))
+            return "/";
+
+        // Normalize the slashes and add leading slash if necessary
+        if (normalized.indexOf('\\') >= 0)
+            normalized = normalized.replace('\\', '/');
+        if (!normalized.startsWith("/"))
+            normalized = "/" + normalized;
+
+        // Resolve occurrences of "//" in the normalized path
+        while (true) {
+            int index = normalized.indexOf("//");
+            if (index < 0)
+                break;
+            normalized = normalized.substring(0, index) +
+                normalized.substring(index + 1);
+        }
+
+        // Resolve occurrences of "/./" in the normalized path
+        while (true) {
+            int index = normalized.indexOf("/./");
+            if (index < 0)
+                break;
+            normalized = normalized.substring(0, index) +
+                normalized.substring(index + 2);
+        }
+
+        // Resolve occurrences of "/../" in the normalized path
+        while (true) {
+            int index = normalized.indexOf("/../");
+            if (index < 0)
+                break;
+            if (index == 0)
+                return (null);  // Trying to go outside our context
+            int index2 = normalized.lastIndexOf('/', index - 1);
+            normalized = normalized.substring(0, index2) +
+                normalized.substring(index + 3);
+        }
+
+        // Return the normalized path that we have completed
+        return (normalized);
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to