You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by ha...@apache.org on 2001/11/21 18:10:42 UTC

cvs commit: jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/images build.gif code.gif design.gif update.gif

hammant     01/11/21 09:10:42

  Added:       apps/httpproxy .cvsignore build.xml
               apps/httpproxy/src/java/org/apache/avalon/httpproxy
                        AbstractHttpProxyServer.java
                        DefaultHttpAuditingProxyServer.java
                        DefaultHttpAuditingProxyServer.xinfo
                        DefaultHttpFilteringProxyServer.java
                        DefaultHttpFilteringProxyServer.xinfo
                        HttpAuditingProxyHandler.java
                        HttpAuditingProxyServer.java
                        HttpBlockedDomainException.java
                        HttpFilteringProxyHandler.java
                        HttpFilteringProxyServer.java
                        HttpGetRequestWrapper.java
                        HttpPostRequestWrapper.java HttpProxyHandler.java
                        HttpProxyServer.java
                        HttpRequestValidationException.java
                        HttpRequestWrapper.java
               apps/httpproxy/src/manifest httpproxy.mf
               apps/httpproxy/src/xdocs book.xml changes.xml
                        cornerstone.uris demo-httpproxy.xml index.xml
               apps/httpproxy/src/xdocs/dtd changes-v10.dtd characters.ent
                        document-v10.dtd faq-v10.dtd specification-v10.dtd
                        todo-v10.dtd
               apps/httpproxy/src/xdocs/images build.gif code.gif
                        design.gif update.gif
  Log:
  start of removal of httpproxy from demo
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/.cvsignore
  
  Index: .cvsignore
  ===================================================================
  .ant.properties
  prj.el
  emacs-jprj.el
  dist
  build
  docs
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/build.xml
  
  Index: build.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <project default="main" basedir=".">
  
    <!--
      Give user a chance to override without editing this file
      (and without typing -D each time they compile it)
    -->
    <property file=".ant.properties"/>
    <property file="${user.home}/.ant.properties"/>
  
    <property name="name" value="httpproxy"/>
    <property name="Name" value="HTTPProxy"/>
    <property name="version" value="0.7"/>
    <property name="year" value="1999-2001"/>
  
    <property name="build.debug" value="on"/>
    <property name="build.optimize" value="off"/>
    <property name="build.deprecation" value="off"/>
  
    <!-- Set the installation variables for Cornerstone/Phoenix -->
    <property name="phoenix.home" value="../../../jakarta-avalon-phoenix/dist"/>
    <property name="install.dir" value="${phoenix.home}/apps"/>
  
    <!-- Set the properties for intermediate directory -->
    <property name="build.dir" value="build"/>
    <property name="build.lib" value="${build.dir}/lib"/>
    <property name="build.src" value="${build.dir}/src"/>
    <property name="build.classes" value="${build.dir}/classes"/>
    <property name="build.xdocs" value="${build.dir}/xdocs"/>
    <property name="build.context" value="${build.dir}/documentation"/>  
  
    <!-- Set the properties for source directories -->
    <property name="src.dir" value="src"/>
    <property name="java.dir" value="${src.dir}/java"/>
    <property name="manifest.dir" value="${src.dir}/manifest"/>
    <property name="conf.dir" value="${src.dir}/conf"/>
    <property name="tools.dir" value="../../../jakarta-avalon/tools"/>  
    <property name="docs.dir" value="docs"/>
    <property name="xdocs.dir" value="${src.dir}/xdocs"/>  
    <property name="context.dir" value="../../../jakarta-avalon/src/documentation"/>  
    <property name="junit.jar" value="${tools.dir}/lib/junit-3.7.jar"/>
    <property name="tools.jar" value="${java.home}/../lib/tools.jar"/>  
  
    <property name="dist.base" value="distributions"/>
  
    <path id="project.class.path">
      <pathelement path="${java.class.path}" />
      <pathelement location="xerces.jar2"/>  
      <pathelement path="${build.classes}" />
      <pathelement path="../../build/classes" />
  
      <fileset dir="../../lib">
        <include name="*.jar" />
      </fileset>
    </path>
  
    <path id="tools.class.path">
      <pathelement location="${junit.jar}"/>
      <pathelement location="${tools.jar}"/>
      <fileset dir="${tools.dir}/lib"/>
      <fileset dir="${tools.dir}/ext"/>
    </path>
  
    <taskdef name="sar" classname="org.apache.avalon.phoenix.tools.tasks.Sar">
      <classpath refid="project.class.path" />
    </taskdef>
  
    <!-- Help on usage -->
    <target name="help" depends="usage"/>
    <target name="usage">
      <echo message="Run ant -projecthelp to get a list of targets to run"/>
    </target>
  
    <!-- Compiles project -->
    <target name="compile">
    
      <ant antfile="build.xml" dir="../.." target="compile" inheritall="false"/>
  
      <mkdir dir="${build.classes}"/>
  
      <javac srcdir="${java.dir}"
             destdir="${build.classes}"
             debug="${build.debug}"
             optimize="${build.optimize}"
             deprecation="${build.deprecation}">
        <classpath refid="project.class.path" />
      </javac>
  
      <copy todir="${build.classes}">
        <fileset dir="${java.dir}">
          <exclude name="**/test/**"/>
          <exclude name="**/*.java"/>
        </fileset>
      </copy>
  
    </target>
  
    <!-- Jars up project -->
    <target name="jars" depends="compile">
  
      <mkdir dir="${build.lib}"/>
  
      <jar file="${build.lib}/httpproxy.jar"
           manifest="${manifest.dir}/httpproxy.mf">
        <fileset dir="${build.classes}">
          <include name="org/apache/avalon/httpproxy/**"/>
        </fileset>
        <fileset dir="${java.dir}">
          <include name="org/apache/avalon/httpproxy/**/*.xinfo"/>
        </fileset>
      </jar>
  
    </target>
  
    <target name="main" depends="sars" description="Default target to generate build products minus docs"/>
    <target name="all" depends="main,docs" description="Generate build products including docs"/>
   
    <target name="sars" depends="jars">
  
      <sar sarfile="${build.lib}/avalon-httpproxy.sar"
           config="${conf.dir}/httpproxy-config.xml"
           environment="${conf.dir}/httpproxy-environment.xml"
           assembly="${conf.dir}/httpproxy-assembly.xml" >
  
        <lib dir="${build.lib}/">
          <include name="*.jar"/>
        </lib>          
  
        <lib dir="../../build/lib">
          <include name="cornerstone.jar"/>
        </lib>
        
      </sar>
  
    </target>
  
    
    <!-- Performs unit tests -->
    <target name="check" depends="compile" description="Perform any built in tests">
    </target>
  
    <!-- Create the API documentation -->
    <target name="javadocs" description="Generates the Java Docs">
  
      <delete dir="${docs.dir}/api"/>
      <mkdir dir="${docs.dir}/api"/>
  
      <javadoc packagenames="org.apache.*"
               sourcepath="${java.dir}"
               destdir="${docs.dir}/api">
        <classpath refid="project.class.path" />
        <doclet name="com.sun.tools.doclets.standard.Standard">
         <param name="-author"/>
         <param name="-version"/>
         <param name="-doctitle" value="${Name}"/>
         <param name="-windowtitle" value="${Name} API"/>
         <param name="-bottom"
                value="&quot;Copyright &#169; 2001 Apache Jakarta Project. All Rights Reserved.&quot;"/>
        </doclet>
      </javadoc>
    </target>
  
    <!-- Prepares the documentation directory -->
    <target name="xdocs" description="Generates the Docs">
  
      <mkdir dir="${build.context}"/>
      <mkdir dir="${build.xdocs}"/>
      <mkdir dir="${build.dir}/work"/>
  
      <!-- Base pointers for non-xdocs documentation. Override these 
           in .ant.properties to link to local docs -->
      <property name="avalon.base" value="http://jakarta.apache.org/avalon"/>
      <property name="framework.base" value="http://jakarta.apache.org/avalon/framework"/>
      <property name="phoenix.base" value="http://jakarta.apache.org/avalon/phoenix"/>
      <property name="cornerstone.base" value="http://jakarta.apache.org/avalon/cornerstone"/>
      <property name="logkit.base" value="http://jakarta.apache.org/avalon/logkit"/>
      <property name="testlet.base" value="http://jakarta.apache.org/avalon/testlet"/>
  
      <filter token="year" value="${year}"/>
      <filter token="AVALON_BASE" value="${avalon.base}"/>
      <filter token="FRAMEWORK_BASE" value="${framework.base}"/>
      <filter token="PHOENIX_BASE" value="${phoenix.base}"/>
      <filter token="CORNERSTONE_BASE" value="${cornerstone.base}"/>
      <filter token="LOGKIT_BASE" value="${logkit.base}"/>
      <filter token="TESTLET_BASE" value="${testlet.base}"/>
  
      <copy todir="${build.context}" filtering="on">
        <fileset dir="${context.dir}">
          <exclude name="resources/**"/>
          <exclude name="xdocs"/>
        </fileset>
      </copy>
  
      <copy todir="${build.context}/xdocs" filtering="on" overwrite="yes">
        <fileset dir="${xdocs.dir}"/>
      </copy>
  
      <copy todir="${build.context}/resources" filtering="off" overwrite="yes">
        <fileset dir="${context.dir}/resources"/>
        <fileset dir="${xdocs.dir}">
          <include name="**/images/**"/>
        </fileset>
      </copy>
  
      <delete>
        <fileset dir="${docs.dir}">
          <exclude name="api/**"/>
        </fileset>
      </delete>
      <mkdir dir="${docs.dir}"/>
  
      <java classname="org.apache.cocoon.Main" fork="true">
        <arg value="-c${build.context}/"/>
        <arg value="-d${docs.dir}"/>
        <arg value="-w${build.dir}/work"/>
        <arg value="-l${build.dir}/work/cocoon.log"/>
        <arg value="-uINFO"/>
        <arg value="-f${xdocs.dir}/cornerstone.uris"/>
        <classpath refid="tools.class.path"/>
      </java>
    </target>
  
    <target name="docs" depends="javadocs,xdocs"/>
  
  
    <!-- Completely build all dists -->
    <target name="dist" description="Generates the distribution">
  
      <property name="dist.name" value="${Name}-${version}"/>
  
      <mkdir dir="${dist.base}"/>
  
      <antcall target="bin-dist" inheritAll="false">
        <param name="bin.dist.dir" value="${dist.name}" />
      </antcall>
  
      <zip file="${dist.base}/${dist.name}-bin.zip"
           basedir="${dist.name}/.."
           includes="${dist.name}/**"/>
  
      <tar longfile="gnu" tarfile="${dist.base}/${dist.name}-bin.tar">
        <tarfileset dir="${dist.name}/.." username="avalon" group="avalon">
          <include name="${dist.name}/**"/>
        </tarfileset>
      </tar>
  
      <gzip zipfile="${dist.base}/${dist.name}-bin.tar.gz"
            src="${dist.base}/${dist.name}-bin.tar"/>
  
      <delete file="${dist.base}/${dist.name}-bin.tar"/>
      <delete dir="${dist.name}" />
  
      <antcall target="src-dist" inheritAll="false">
        <param name="src.dist.dir" value="${dist.name}" />
      </antcall>
  
      <zip file="${dist.base}/${dist.name}-src.zip"
           basedir="${dist.name}/.."
           includes="${dist.name}/**"/>
  
      <tar longfile="gnu" tarfile="${dist.base}/${dist.name}-src.tar" >
        <tarfileset dir="${dist.name}/.." mode="755" username="avalon" group="avalon">
          <include name="${dist.name}/build.sh"/>
        </tarfileset>
        <tarfileset dir="${dist.name}/.." username="avalon" group="avalon">
          <include name="${dist.name}/**"/>
          <exclude name="${dist.name}/build.sh"/>
        </tarfileset>
      </tar>
  
      <gzip zipfile="${dist.base}/${dist.name}-src.tar.gz"
            src="${dist.base}/${dist.name}-src.tar"/>
      <delete file="${dist.base}/${dist.name}-src.tar"/>
      <delete dir="${dist.name}" />
  
    </target>
  
    <!-- Creates all the .sar files -->  
    <target name="bin-dist" depends="all" >
  
      <!-- bin.dist.dir usually set before this target is called -->
      <property name="bin.dist.dir" value="dist"/>
      <property name="bin.dist.lib" value="${bin.dist.dir}/lib"/>
      <property name="bin.dist.docs" value="${bin.dist.dir}/docs"/>
  
      <mkdir dir="${bin.dist.docs}"/>
      <copy todir="${bin.dist.docs}">
        <fileset dir="${docs.dir}"/>
      </copy>
  
      <!-- Not allowed to distribute glue thus no soaphttpproxy jar -->
      <copy file="${build.lib}/avalon-httpproxy.sar" tofile="${bin.dist.dir}/avalon-httpproxy-${version}.sar"/>
  
      <chmod dir="${bin.dist.dir}" perm="go-rwx" />
    </target>
  
    <target name="src-dist" depends="docs">
      <!-- src.dist.dir has usually already been set -->
      <property name="src.dist.dir" value="dist-src"/>
      <property name="src.dist.src" value="${src.dist.dir}/src"/>
      <property name="src.dist.docs" value="${src.dist.dir}/docs"/>
  
      <mkdir dir="${src.dist.docs}"/>
  
      <copy todir="${src.dist.docs}">
        <fileset dir="${docs.dir}"/>
      </copy>
  
      <copy todir="${src.dist.src}">
        <fileset dir="${src.dir}"/>
      </copy>
      <fixcrlf srcdir="${src.dist.src}/java" includes="**/*.java" eol="lf"/>
  
      <chmod dir="${src.dist.dir}" perm="go-rwx" />
    </target>
  
    <target name="install" depends="main" description="Installs into Phoenix">
      <!-- <fail message="install.dir not specified." unless="install.dir"/> -->
      <echo message="Installing to ${install.dir}" />
      <delete dir="${install.dir}/avalon-httpproxy" />
      <copy file="${build.lib}/avalon-httpproxy.sar" todir="${install.dir}" />
    </target>
  
    <target name="uninstall" description="Uninstalls from Phoenix">
  
      <!-- <fail message="install.dir not specified." unless="install.dir"/> -->
      <delete dir="${install.dir}/avalon-httpproxy/" />
      <delete file="avalon-httpproxy.sar" dir="${install.dir}"/>
    </target>
  
    <target name="clean" description="Cleans up artifacts from build process">
      <delete dir="${build.dir}" />
      <delete>
        <fileset dir="." includes="**/*~" defaultexcludes="no"/>
      </delete>
    </target>
  
    <target name="distclean" depends="clean" description="Cleans up all generated files and directories">
      <delete dir="${docs.dir}" />
      <delete dir="${bin.dist.dir}" />
      <delete dir="${dist.base}" />
    </target>
  
  </project>
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/AbstractHttpProxyServer.java
  
  Index: AbstractHttpProxyServer.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  import java.net.InetAddress;
  import java.net.ServerSocket;
  import java.net.UnknownHostException;
  import org.apache.avalon.framework.activity.Initializable;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.Contextualizable;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.cornerstone.services.connection.ConnectionHandler;
  import org.apache.avalon.cornerstone.services.connection.ConnectionHandlerFactory;
  import org.apache.avalon.cornerstone.services.connection.ConnectionManager;
  import org.apache.avalon.cornerstone.services.sockets.ServerSocketFactory;
  import org.apache.avalon.cornerstone.services.sockets.SocketManager;
  import org.apache.avalon.phoenix.Block;
  import org.apache.avalon.phoenix.BlockContext;
  import org.apache.avalon.phoenix.Service;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public abstract class AbstractHttpProxyServer
      extends AbstractLogEnabled
      implements Block, Contextualizable, Composable, Configurable, Service,
                 Initializable, ConnectionHandlerFactory
  {
      protected SocketManager       m_socketManager;
      protected ConnectionManager   m_connectionManager;
  
      protected String              m_name;
      protected String              m_forwardToAnotherProxy;
      protected int                 m_port;
      protected InetAddress         m_bindTo;
      protected BlockContext        m_context;
  
      public AbstractHttpProxyServer( final String name )
      {
          m_name = name;
      }
  
      public void contextualize( final Context context )
      {
          m_context = (BlockContext)context;
      }
  
      public void configure( final Configuration configuration  )
          throws ConfigurationException
      {
          m_port = configuration.getChild( "listen-port" ).getValueAsInteger( 8000 );
  
          try
          {
              final String bindAddress = configuration.getChild( "bind" ).getValue();
              m_bindTo = InetAddress.getByName( bindAddress );
          }
          catch( final UnknownHostException unhe )
          {
              throw new ConfigurationException( "Malformed bind parameter", unhe );
          }
  
          final Configuration forward = configuration.getChild( "forward-to-another-proxy" );
          m_forwardToAnotherProxy = forward.getValue("");
      }
  
      public void compose( final ComponentManager componentManager )
          throws ComponentException
      {
          getLogger().info( "HttpProxyServer-" + m_name + ".compose()" );
  
          m_socketManager = (SocketManager)componentManager.
              lookup( "org.apache.avalon.cornerstone.services.sockets.SocketManager" );
  
          m_connectionManager = (ConnectionManager)componentManager.
              lookup( "org.apache.avalon.cornerstone.services.connection.ConnectionManager" );
      }
  
      public void initialize()
          throws Exception
      {
          final ServerSocketFactory factory =
              m_socketManager.getServerSocketFactory( "plain" );
          final ServerSocket serverSocket = factory.createServerSocket( m_port, 5, m_bindTo );
  
          m_connectionManager.connect( "HttpProxyListener-" + m_name, serverSocket, this );
  
          // This is only to help newbies.....
          System.out.println(getShortName() + " HTTP Proxy server running.  Configure your browser to proxy through localhost:" + m_port + " to use it");
  
      }
  
      protected abstract String getShortName();
  
      /**
       * Construct an appropriate ConnectionHandler.
       *
       * @return the new ConnectionHandler
       * @exception Exception if an error occurs
       */
      public ConnectionHandler createConnectionHandler()
          throws Exception
      {
          final HttpProxyHandler handler = newHttpProxyHandler();
          setupLogger( handler );
          return handler;
      }
  
      protected abstract HttpProxyHandler newHttpProxyHandler();
  }
  
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/DefaultHttpAuditingProxyServer.java
  
  Index: DefaultHttpAuditingProxyServer.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  import java.net.Socket;
  import org.apache.log.Logger;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public class DefaultHttpAuditingProxyServer
      extends AbstractHttpProxyServer
      implements HttpAuditingProxyServer
  {
      public DefaultHttpAuditingProxyServer()
      {
          super("Auditing");
      }
  
      /**
       * Method createHttpProxyHandler
       * Factory method, overriding that of parent, to create the right handler for
       * an individual request.
       */
      protected HttpProxyHandler newHttpProxyHandler()
      {
          return new HttpAuditingProxyHandler( m_forwardToAnotherProxy );
      }
  
      protected String getShortName()
      {
          return "Auditing";
      }
  
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/DefaultHttpAuditingProxyServer.xinfo
  
  Index: DefaultHttpAuditingProxyServer.xinfo
  ===================================================================
  <?xml version="1.0"?>
  
  <blockinfo>
  
    <!-- section to describe block -->
    <block>
      <version>1.0</version>
    </block>
  
    <!-- services that are offered by this block -->
    <services>
      <service name="org.apache.avalon.httpproxy.HttpAuditingProxyServer" 
               version="1.0" />
    </services>
    <dependencies>
      <dependency>
        <service name="org.apache.avalon.cornerstone.services.connection.ConnectionManager" 
                 version="1.0"/>
      </dependency>
      <dependency>
        <service name="org.apache.avalon.cornerstone.services.sockets.SocketManager" version="1.0"/>
      </dependency>
    </dependencies>  
  
  </blockinfo>
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/DefaultHttpFilteringProxyServer.java
  
  Index: DefaultHttpFilteringProxyServer.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  import java.net.Socket;
  import java.util.HashSet;
  import java.util.Iterator;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.log.Logger;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public class DefaultHttpFilteringProxyServer
      extends AbstractHttpProxyServer
      implements HttpFilteringProxyServer
  {
      // a site may be x.y.z.p.p.hello.com, only check the last two and three parts
      protected HashSet     blockedTwoPartDomains             = new HashSet();
      protected HashSet     blockedThreePartDomains           = new HashSet();
      protected HashSet     cookiesAllowedForTwoPartDomains   = new HashSet();
      protected HashSet     cookiesAllowedForThreePartDomains = new HashSet();
  
      /**
       * Constructor DefaultHttpFilteringProxyServer
       * This is A proxy server that will filter requests.
       */
      public DefaultHttpFilteringProxyServer()
      {
          super( "Filtering" );
      }
  
      public void configure( final Configuration configuration )
          throws ConfigurationException
      {
          super.configure( configuration );
  
          // block listed domains
          final Configuration blockedDomains = configuration.getChild( "blocked-domains" );
          configureBlockedDomains( blockedDomains.getChildren( "blocked-domain" ) );
  
          // mark some domains as having no cookies sent.
          final Configuration cookieDomains = configuration.getChild( "cookies-allowed-domains" );
          configureCookieDomains( cookieDomains.getChildren("cookies-allowed-domain") );
      }
  
      protected void configureBlockedDomains( final Configuration[] domains )
          throws ConfigurationException
      {
          for( int i = 0; i < domains.length; i++ )
          {
              blockAllContentFrom( domains[ i ].getAttribute( "domain-name" ), true );
          }
      }
  
      protected void configureCookieDomains( final Configuration[] domains )
          throws ConfigurationException
      {
          for( int i = 0; i < domains.length; i++ )
          {
              allowCookiesFrom( domains[ i ].getAttribute( "domain-name" ), true );
          }
      }
  
      public boolean domainAllowed( final String domainName )
      {
          return !isDomainInList( domainName,
                                  blockedTwoPartDomains,
                                  blockedThreePartDomains );
      }
  
      public boolean cookieAllowed( final String domainName )
      {
          return isDomainInList( domainName,
                                 cookiesAllowedForTwoPartDomains,
                                 cookiesAllowedForThreePartDomains );
      }
  
      private boolean isDomainInList( String domainName,
                                      final HashSet twoPart,
                                      final HashSet threePart )
      {
          domainName = domainName.toLowerCase();
  
          int dCount = dotCount( domainName );
  
          if( 0 == dCount )
          {
              // no dot, must mean it's inside the intranet.
              return false;
          }
          else
          {
              String domainName2p = domainName;
  
              if( dCount >= 2 )
              {
                  // three or more parts to the domain name.
                  String domainName3p = trimToThreePartDomainName(domainName, dCount);
  
                  if( threePart.contains(domainName3p) )
                  {
                      return true; // it's in the three part list
                  }
  
                  // get rid of first part to make a two part domain name.
                  domainName2p = domainName3p.substring( domainName3p.indexOf('.') + 1,
                                                         domainName3p.length() );
              }
  
              if( twoPart.contains( domainName2p ) )
              {
                  return true; // it's in the two part list.
              }
          }
  
          return false; // default (Homer's two favorite words).
      }
  
      /**
       * Method createHttpProxyHandler
       * Factory method, overriding that of parent, to create the right handler for
       * an individual request.
       */
      protected HttpProxyHandler newHttpProxyHandler()
      {
          return new HttpFilteringProxyHandler( this, m_forwardToAnotherProxy );
      }
  
      public void blockAllContentFrom( final String domainName, final boolean onOff )
      {
          addOrRemoveFromList( domainName,
                               onOff,
                               blockedTwoPartDomains,
                               blockedThreePartDomains );
          getLogger().debug( "blockAllContentFrom " + domainName );
      }
  
      public void allowCookiesFrom( final String domainName,
                                    final boolean onOff )
      {
          addOrRemoveFromList( domainName,
                               onOff,
                               cookiesAllowedForTwoPartDomains,
                               cookiesAllowedForThreePartDomains );
          getLogger().debug( "allowCookiesFrom " + domainName );
      }
  
      private void addOrRemoveFromList( String domainName,
                                        final boolean onOff,
                                        final HashSet twoPart,
                                        final HashSet threePart )
      {
          domainName = domainName.toLowerCase();
  
          int dCount = dotCount( domainName );
  
          if( onOff )
          {
              if( 1 == dCount ) twoPart.add(domainName);
              else if( dCount >= 2 )
              {
                  threePart.add( trimToThreePartDomainName( domainName, dCount ) );
              }
          }
          else
          {
              if( 1 == dCount ) twoPart.remove( domainName );
              else if( dCount >= 2 )
              {
                  threePart.remove( trimToThreePartDomainName( domainName, dCount ) );
              }
          }
      }
  
      private int dotCount( final String domainName )
      {
          int count = 0;
          int ix = domainName.indexOf('.', 0);
  
          while( -1 != ix )
          {
              count++;
              ix = domainName.indexOf( '.', ix + 1 );
          }
  
          return count;
      }
  
      private String trimToThreePartDomainName( final String domainName, int dotCount )
      {
          if( 2 == dotCount ) return domainName;
          else
          {
              int bIx = 0;
  
              while( dotCount-- > 2 )
              {
                  bIx = domainName.indexOf('.', bIx) + 1;
              }
  
              return domainName.substring( bIx, domainName.length() );
          }
      }
  
      public String[] getBlockedDomains()
      {
          return new String[] {"TODO"}; // TODO PH
      }
  
      /**
       * List the domains for which cookies are not sent.
       */
      public String[] getCookieSuppressedDomains()
      {
          return new String[] {"TODO"}; // TODO PH
      }
  
      protected String getShortName()
      {
          return "Filtering";
      }
  
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/DefaultHttpFilteringProxyServer.xinfo
  
  Index: DefaultHttpFilteringProxyServer.xinfo
  ===================================================================
  <?xml version="1.0"?>
  
  <blockinfo>
  
    <!-- section to describe block -->
    <block>
      <version>1.0</version>
    </block>
  
    <!-- services that are offered by this block -->
    <services>
      <service name="org.apache.avalon.httpproxy.HttpFilteringProxyServer" 
               version="1.0" />
    </services>
    <dependencies>
      <dependency>
        <service name="org.apache.avalon.cornerstone.services.connection.ConnectionManager" 
                 version="1.0"/>
      </dependency>
      <dependency>
        <service name="org.apache.avalon.cornerstone.services.sockets.SocketManager" version="1.0"/>
      </dependency>
    </dependencies>  
  
  
  </blockinfo>
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpAuditingProxyHandler.java
  
  Index: HttpAuditingProxyHandler.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  import java.net.Socket;
  import org.apache.log.Logger;
  
  /**
   * This handles an individual incoming request.  It outputs a greeting as html.
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public class HttpAuditingProxyHandler
      extends HttpProxyHandler
  {
      protected HttpAuditingProxyHandler( final String forwardToAnotherProxy )
      {
          super( forwardToAnotherProxy);
      }
  
      protected void validateRequest()
          throws HttpRequestValidationException
      {
          // no validate, just log.
          getLogger().info("Connection to " + httpRequestWrapper.getURL());
      }
  }
  
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpAuditingProxyServer.java
  
  Index: HttpAuditingProxyServer.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public interface HttpAuditingProxyServer
      extends HttpProxyServer
  {
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpBlockedDomainException.java
  
  Index: HttpBlockedDomainException.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public class HttpBlockedDomainException
      extends HttpRequestValidationException
  {
      /**
       * Constructor HttpBlockedDomainException
       * The domain in question is not allowed to be connected to given the
       * rules of the filter.
       */
      public HttpBlockedDomainException( final String domainName )
      {
          super( "Access to " + domainName + "has been blocked" );
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpFilteringProxyHandler.java
  
  Index: HttpFilteringProxyHandler.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  import java.net.URL;
  import java.util.StringTokenizer;
  
  /**
   * This handles an individual incoming request.  It outputs a greeting as html.
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public class HttpFilteringProxyHandler
      extends HttpProxyHandler
  {
      // used for callbacks
      protected HttpFilteringProxyServer   proxyServer;
  
      /**
       * Constructor HttpFilteringProxyHandler
       *
       */
      protected HttpFilteringProxyHandler( final HttpFilteringProxyServer proxyServer,
                                           final String forwardToAnotherProxy )
      {
          super( forwardToAnotherProxy );
  
          // used for callbacks
          this.proxyServer = proxyServer;
      }
  
      /**
       * Method validateRequest
       * Check to see whether domain name in blocked list.
       *
       * @throws HttpRequestValidationException
       *
       */
      protected void validateRequest()
          throws HttpRequestValidationException
      {
          final String domainName = httpRequestWrapper.getServerName();
  
          if( !proxyServer.domainAllowed( domainName ) )
          {
              throw new HttpBlockedDomainException( domainName );
              // perhaps this should be:
              // 1) test for image as mime type
              // 2) return 1x1 gif instead.
          }
      }
  
      /**
       * Method getOutgoingHttpRequest
       * Overrides that of parent, adding cookie removal functionality for the
       * filtering proxy server.
       *
       * @param anotherProxy
       *
       * @return a String with the http request with ow without cookie
       *
       */
      public String getOutgoingHttpRequest( final boolean anotherProxy )
      {
          final String domainName = httpRequestWrapper.getServerName();
          final String httpRequest = super.getOutgoingHttpRequest( anotherProxy );
  
          if( !proxyServer.cookieAllowed( domainName ) )
          {
              final String request =
                  getHttpRequestWithoutCookie( httpRequest, httpRequestWrapper.getURL() );
              return request.trim() + "\r\n\r\n";
          }
          else
          {
              return httpRequest;
          }
      }
  
      private String getHttpRequestWithoutCookie( final String httpRequest, final URL url )
      {
          final StringBuffer newHttpRequest = new StringBuffer();
          final StringTokenizer rqstTokens = new StringTokenizer( httpRequest, "\n\r" );
  
          while( rqstTokens.hasMoreTokens() )
          {
              final String line = rqstTokens.nextToken();
  
              if( !line.startsWith("Cookie:") )
              {
                  newHttpRequest.append( line ).append( "\r\n" );
              }
              else
              {
                  getLogger().info( "Cookie supressed for url :" + url.toString() );
              }
          }
  
          return newHttpRequest.toString().trim() + "\n\r";
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpFilteringProxyServer.java
  
  Index: HttpFilteringProxyServer.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public interface HttpFilteringProxyServer
      extends HttpProxyServer
  {
      /**
       * Method blockAllContentFrom No requests will reach this site.
       */
      void blockAllContentFrom( String domainName, boolean onOff );
  
      /**
       * Method allowCookiesFrom Allows Cookies to be sent to this site.
       * This is kinda redundant with some of the features of Netscape 4.x and 6.x
       */
      void allowCookiesFrom( String domainName, boolean onOff );
  
      /**
       * Method domainAllowed Check to see whether the appl domain should be blocked
       */
      boolean domainAllowed( String domainName );
  
      /**
       * Method cookieAllowed Check to see whether the appl domain can be sent cookies
       */
      boolean cookieAllowed( String domainName );
  
      /**
       * List the domains that are completely blocked.
       */
      String[] getBlockedDomains();
  
      /**
       * List the domains for which cookies are not sent.
       */
      String[] getCookieSuppressedDomains();
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpGetRequestWrapper.java
  
  Index: HttpGetRequestWrapper.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  import java.io.IOException;
  import java.io.InputStream;
  import org.apache.avalon.framework.logger.Logger;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public class HttpGetRequestWrapper
      extends HttpRequestWrapper
  {
      protected HttpGetRequestWrapper( final Logger logger, final String rq )
          throws IOException
      {
          super( logger, rq );
      }
  
      protected HttpGetRequestWrapper( final Logger logger, final InputStream is )
          throws IOException
      {
          super( logger );
  
          String wholeBuffer = "GET";
          byte[] bytes = new byte[ SEGLEN ];
          int bytesRead = is.read( bytes );
  
          do
          {
              wholeBuffer += new String( bytes, 0, bytesRead );
  
              if( !wholeBuffer.endsWith( EOF ) )
              {
                  bytesRead = is.read( bytes );
              }
          }
          while( !wholeBuffer.endsWith( EOF ) );
  
          super.setRequest( wholeBuffer );
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpPostRequestWrapper.java
  
  Index: HttpPostRequestWrapper.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  import java.io.IOException;
  import java.io.InputStream;
  import org.apache.avalon.framework.logger.Logger;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public class HttpPostRequestWrapper 
      extends HttpRequestWrapper
  {
      protected HttpPostRequestWrapper( final Logger logger, final String rq )
          throws IOException
      {
          super( logger, rq );
      }
  
      protected HttpPostRequestWrapper( final Logger logger, final InputStream is )
          throws IOException
      {
          super( logger );
  
          String wholeBuffer = "POST";
  
          is.read( new byte[1] ); // T from post
  
          byte[] bytes = new byte[SEGLEN];
          int bytesRead = is.read( bytes );
          int contLen;
          int lenAfterContent;
  
          do
          {
              wholeBuffer += new String( bytes, 0, bytesRead );
  
              String tmpRqst = wholeBuffer.toUpperCase();
  
              contLen = getContentLength( tmpRqst );
              lenAfterContent = getLengthAfterContent( tmpRqst );
  
              if( -1 == wholeBuffer.indexOf( EOF ) )
              {
                  bytesRead = is.read( bytes );
              }
          }
          while( ( lenAfterContent < contLen ) &&
                 ( -1 == wholeBuffer.indexOf( EOF ) ) );
  
          super.setRequest( wholeBuffer );
      }
  
      private int getContentLength( final String rqst )
      {
          int firstDigit = rqst.indexOf("CONTENT-LENGTH:") + 16;
  
          if( -1 != firstDigit )
          {
              final int lastDigit = rqst.indexOf( "\n", firstDigit );
              return Integer.parseInt( rqst.substring( firstDigit, lastDigit ).trim() );
          }
  
          return 0;
      }
  
      private int getLengthAfterContent( final String rqst )
      {
          int firstDigit = rqst.indexOf( "CONTENT-LENGTH:" ) + 16;
  
          if( -1 != firstDigit )
          {
              return rqst.length() - firstDigit;
          }
  
          return 0;
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpProxyHandler.java
  
  Index: HttpProxyHandler.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  import java.io.*;
  import java.net.ConnectException;
  import java.net.Socket;
  import java.net.SocketException;
  import java.net.UnknownHostException;
  import org.apache.avalon.framework.component.Component;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.cornerstone.services.connection.ConnectionHandler;
  
  /**
   * This handles an individual incoming request.  It returns a bytes etc from remote server.
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public abstract class HttpProxyHandler
      extends AbstractLogEnabled
      implements Component, ConnectionHandler
  {
      protected Socket              clientSocket;
      protected Socket              serverSocket;
      protected String              clientHost;
      protected String              clientIP;
      protected String              forwardToAnotherProxy;
      protected HttpRequestWrapper  httpRequestWrapper;
  
      protected HttpProxyHandler( final String forwardToAnotherProxy )
      {
          this.forwardToAnotherProxy = forwardToAnotherProxy;
      }
  
      /**
       * Handle a connection.
       * This handler is responsible for processing connections as they occur.
       *
       * @param socket the connection
       * @exception IOException if an error reading from socket occurs
       */
      public void handleConnection( final Socket socket )
          throws IOException
      {
          this.clientSocket = socket;
          clientHost = clientSocket.getInetAddress().getHostName();
          clientIP = clientSocket.getInetAddress().getHostAddress();
  
          try
          {
              httpRequestWrapper =
                  HttpRequestWrapper.createHttpRequestWrapper( getLogger(),
                                                               clientSocket.getInputStream() );
  
              validateRequest();
              forwardRequest();
          }
          catch( final HttpRequestValidationException hrve )
          {
              write403Page();
              getLogger().info( hrve.getMessage() );
          }
          catch( final SocketException se )
          {
              getLogger().debug( "Socket to " + clientHost + " closed remotely.", se );
          }
          catch( final InterruptedIOException iioe )
          {
              getLogger().debug( "Socket to " + clientHost + " timeout.", iioe );
          }
          catch( final IOException ioe )
          {
              getLogger().debug( "Exception in proxy handling socket to " + clientHost, ioe );
          }
          catch( final Exception e )
          {
              getLogger().debug( "Exception in proxy opening socket", e );
          }
          finally
          {
              try { clientSocket.close(); }
              catch( final IOException ioe )
              {
                  getLogger().error( "Exception closing client socket ", ioe );
              }
  
              if( null != serverSocket )
              {
                  try { serverSocket.close(); }
                  catch( final IOException ioe )
                  {
                      getLogger().error( "Exception closing server socket ", ioe );
                  }
              }
          }
      }
  
      protected Socket makeOutgoingSocket()
          throws IOException
      {
          if( !forwardToAnotherProxy.equals("") )
          {
              int colon = forwardToAnotherProxy.indexOf(':');
              String toName = forwardToAnotherProxy.substring(0, colon);
              int toPort = Integer.
                  parseInt( forwardToAnotherProxy.substring( colon + 1,
                                                             forwardToAnotherProxy.length() ) );
  
              return new Socket( toName, toPort );
          }
          else
          {
              return new Socket( httpRequestWrapper.getServerInetAddress(),
                                 httpRequestWrapper.getServerPort() );
          }
      }
  
      public String getOutgoingHttpRequest( final boolean anotherProxy )
      {
          if( anotherProxy )
          {
              return httpRequestWrapper.getNakedHttpRequest().trim() + "\r\n\r\n";
          }
          else
          {
              return httpRequestWrapper.getHttpRequest().trim() + "\r\n\r\n";
          }
      }
  
      public final void forwardRequest()
          throws IOException
      {
          String request = getOutgoingHttpRequest( ( !forwardToAnotherProxy.equals("") ) );
  
          try
          {
              serverSocket = makeOutgoingSocket();
  
              serverSocket.getOutputStream().write( request.getBytes() );
  
              byte[] page = new byte[2048];
              int pLength;
              BufferedOutputStream bufToClient =
                  new BufferedOutputStream( clientSocket.getOutputStream() );
              InputStream serverIS = serverSocket.getInputStream();
  
              do
              {
                  pLength = serverIS.read( page );
  
                  if( -1 != pLength )
                  {
                      bufToClient.write( page, 0, pLength );
                  }
              }
              while( -1 != pLength );
  
              bufToClient.close();
          }
          catch( final Exception e )
          {
              // general catch is deliberate, see writeErrorPage(..)
              writeErrorPage( e );
          }
      }
  
      private void writeErrorPage( final Exception e )
          throws IOException
      {
          final PrintWriter output = new PrintWriter( clientSocket.getOutputStream() );
  
          output.println( "<html><body>Unable to reach <b>" + httpRequestWrapper.getServerName() +
                          ":" + httpRequestWrapper.getServerPort() + "</b> at the moment." );
          output.println( "<br />This Message is bought to you by the Avalon demo proxy server." );
          output.println( "<br />If you had a direct connection to the net, you would not see " +
                          "this message, your browser would instead tell you it could not reach" +
                          " the site.<br />");
  
          if( e instanceof UnknownHostException )
          {
              output.println( "<br />The probable cause is that the domain name does not exist," +
                              " of the route to it is severed." );
          }
          else if( e instanceof ConnectException )
          {
              output.println( "<br />The probable cause is that the machine at domain name is" +
                              " not running a service at the port number in question (HTTP or" +
                              " any other)." );
          }
          else
          {
              output.println( "<br />The cause is unknown, this may help though: " +
                              e.getMessage() );
          }
  
          output.println( "</body></head>" );
          output.flush();
          output.close();
      }
  
      // Block the resource, buy using http code 403.
      // "403 Forbidden Resource is not available, regardless of authorization."
      private void write403Page()
      {
          try
          {
              final PrintWriter output = new PrintWriter( clientSocket.getOutputStream() );
  
              output.println( "<html><head><title>Blocked</title></head>" +
                              "<body>Blocked</body></html>" );
              output.flush();
              output.close();
          }
          catch( final IOException ioe ) {}
      }
      protected abstract void validateRequest()
          throws HttpRequestValidationException;
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpProxyServer.java
  
  Index: HttpProxyServer.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  import org.apache.avalon.phoenix.Service;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public interface HttpProxyServer
  {
      // nothing here yet, but there could be a way of chaining proxy servers
      // without sockets.....
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpRequestValidationException.java
  
  Index: HttpRequestValidationException.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public class HttpRequestValidationException
      extends Exception
  {
      /**
       * Constructor HttpRequestValidationException
       * Thrown when somethod failed during the handlers validation stage.
       */
      public HttpRequestValidationException( final String message )
      {
          super( message );
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/java/org/apache/avalon/httpproxy/HttpRequestWrapper.java
  
  Index: HttpRequestWrapper.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.avalon.httpproxy;
  
  import java.io.IOException;
  import java.io.InputStream;
  import java.net.InetAddress;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.net.UnknownHostException;
  import org.apache.avalon.framework.logger.Logger;
  
  /**
   * @author  Paul Hammant <Pa...@yahoo.com>
   * @version 1.0
   */
  public class HttpRequestWrapper
  {
      protected final static String     EOF        = "\r\n\r\n";
      protected final static int        SEGLEN     = 2048;
  
      protected final Logger            m_logger;
      protected String                  m_request;
      protected URL                     m_url;
  
      protected HttpRequestWrapper( final Logger logger )
      {
          m_logger = logger;
      }
  
      protected HttpRequestWrapper( final Logger logger, final String request )
          throws IOException
      {
          this( logger );
          setRequest( request );
      }
  
      protected void setRequest( final String request )
          throws IOException
      {
          m_request = request;
  
          try
          {
              m_url = new URL( getURLFromHttpHeader() );
          }
          catch( final MalformedURLException mfue )
          {
              m_logger.error( "URL from http header is malformed", mfue );
          }
      }
  
      public final URL getURL()
      {
          return m_url;
      }
  
      /**
       * Method getServerInetAddress
       * The server's internet address.
       */
      public final InetAddress getServerInetAddress()
          throws UnknownHostException
      {
          return InetAddress.getByName( m_url.getHost() );
      }
  
      private String getURLFromHttpHeader()
      {
          try
          {
              int hostStart = m_request.indexOf( " " ) + 1;
  
              return m_request.substring( hostStart,
                                          m_request.indexOf( " ", hostStart ) );
          }
          catch( final StringIndexOutOfBoundsException sioobe )
          {
              m_logger.error( "Unable to find URL in http header", sioobe );
          }
  
          return null;
      }
  
      /**
       * Method getServerName
       * The server's domain name
       */
      public String getServerName()
      {
          return m_url.getHost();
      }
  
      /**
       * Method getServerPort
       * The port on the server where the http requests should be sent.
       */
      public int getServerPort()
      {
          final int port = m_url.getPort();
  
          return ((port == -1) ? 80 : port);
      }
  
      /**
       * Method getNakedHttpRequest
       * Used to forward requests to another proxy server
       */
      public final String getNakedHttpRequest()
      {
          return m_request;
      }
  
      /**
       * Method getHttpRequest
       * Get the address without the proxy extras
       */
      public String getHttpRequest()
      {
          // strip out proxy info.
          int hostEnd = 1 +
              m_request.indexOf( "/", m_request.indexOf( "//" ) + 2 );
  
          return
              m_request.substring( 0, m_request.indexOf("http://") ) + "/" +
              m_request.substring( hostEnd, m_request.length() );
      }
  
      /**
       * Method createHttpRequestWrapper
       * Factory to create the right sub class of HttpRequestWrapper.
       *
       */
      static HttpRequestWrapper createHttpRequestWrapper( final Logger logger,
                                                          final InputStream is )
          throws IOException
      {
          byte[] threeBytes = new byte[3];
          int bytes = is.read( threeBytes );
  
          if( 3 != bytes )
          {
              throw new RuntimeException( "not three bytes?" );
          }
  
          final String reqType = new String( threeBytes, 0, bytes );
  
          if( reqType.equals("POS") )
          {
              return new HttpPostRequestWrapper( logger, is );
          }
          else
          {
              return new HttpGetRequestWrapper( logger, is );
          }
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/manifest/httpproxy.mf
  
  Index: httpproxy.mf
  ===================================================================
  Manifest-Version: 1.0
  Created-By: Apache Avalon Project
  
  Name: org/apache/avalon/httpproxy/DefaultHttpAuditingProxyServer.class
  Avalon-Block: true
  
  Name: org/apache/avalon/httpproxy/DefaultHttpFilteringProxyServer.class
  Avalon-Block: true
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/book.xml
  
  Index: book.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <book software="Cornerstone"
        title="Cornerstone HypersonicSQL block Documentation"
        copyright="@year@ The Apache Software Foundation">
  
    <project label="Back to Avalon" href="@AVALON_BASE@" />
  
    <menu label="About">
      <menu-item label="Overview" href="index.html"/>
    </menu>
  
  </book>
  
  
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/changes.xml
  
  Index: changes.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <!DOCTYPE changes SYSTEM "dtd/changes-v10.dtd">
  
  <changes title="HypersonicSQL block - History of Changes">
    <devs>
      <person name="Paul Hammant" email="Paul_Hammant@yahoo.com" id="PH"/>
    </devs>
  
  <release version="?.?" date="Oct 2001">
      <action dev="PH" type="add">
        Added initial release.
      </action>
  </release>
  
  </changes>
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/cornerstone.uris
  
  Index: cornerstone.uris
  ===================================================================
  index.html
  demo-httpproxy.html
  images/add.jpg
  images/fix.jpg
  images/remove.jpg
  images/update.jpg
  images/header.gif
  images/jakarta-logo.gif
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/demo-httpproxy.xml
  
  Index: demo-httpproxy.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <!DOCTYPE document SYSTEM "dtd/document-v10.dtd">
  
  <document>
    <header>
      <title>Cornerstone Developer Documentation</title>
      <subtitle>The 'HTTP Proxy' Example Application</subtitle>
      <authors>
        <person name="Paul Hammant" email="Paul_Hammant@yahoo.org"/>
      </authors>
    </header>
    <body>
      <s1 title="Introduction">
        <p>
          HTTP Proxy is a conventional HTTP proxy server that a browser would use to access the internet from behind a firewall.  There are two components that are variations on the same theme and use the same code base:
        </p>
        <ol>
          <li>
            <strong>Auditing HTTP Proxy</strong>  This logs the requests that it deals with.
          </li>
          <li>
            <strong>Filtering HTTP Proxy</strong>  This filters the requests that go out and blocks some of them based on some configurable rules.
          </li>
        </ol>
        <p>
          One can be chained into the other such that you could filter and audit.
        </p>
      </s1>
      <s1 title="Packaging of SAR">
        <p>
          It's much the same as the previous demo <link href="demo-helloworld.html">HelloWorld</link> in that it's a socket listener type app.  The assembly.xml file has a section for the configuration of this component and it's zipped up into bar form in the same way.
        </p>
      </s1>
      <s1 title="Concepts shown here, not in HelloWorld">
        <p>
          Apart from using it's own log, the main difference with this demo is that it provides a mechanism by why the proxy server could be configured by another component that marked it as a dependancy.  A number of methods provide a way for that block to configure settings at runtime as well as query them:
        </p>
  <source>
  public interface HttpFilteringProxyServer
      extends HttpProxyServer
  {
      /**
       * Method blockAllContentFrom No requests will reach this site.
       */
      void blockAllContentFrom( String domainName, boolean onOff );
  
      /**
       * Method allowCookiesFrom Allows Cookies to be sent to this site.
       * This is kinda redundant with some of the features of Netscape 4.x and 6.x
       */
      void allowCookiesFrom( String domainName, boolean onOff );
  
      /**
       * Method domainAllowed Check to see whether the appl domain should be blocked
       */
      boolean domainAllowed( String domainName );
  
      /**
       * Method cookieAllowed Check to see whether the appl domain can be sent cookies
       */
      boolean cookieAllowed( String domainName );
  
      /**
       * List the domains that are completely blocked.
       */
      String[] getBlockedDomains();
  
      /**
       * List the domains for which cookies are not sent.
       */
      String[] getCookieSuppressedDomains();
  }
  </source>
      </s1>
      <s1 title="Status of demo">
        <p>
          The component is in demo status and would take some extra work to get it working to a level where it could be used for real as a proxy server.
        </p>
      </s1>
    </body>
    <footer>
      <legal>
        Copyright (c) @year@ The Jakarta Apache Project All rights reserved.
        $Revision: 1.1 $ $Date: 2001/11/21 17:10:42 $
      </legal>
    </footer>
  </document>
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/index.xml
  
  Index: index.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <!DOCTYPE document SYSTEM "dtd/document-v10.dtd">
  
  <document>
    <header>
      <title>Cornerstone Developer Documentation</title>
      <subtitle>Introduction</subtitle>
      <authors>
        <person name="Avalon Documentation Team" email="avalon-dev@jakarta.apache.org"/>
      </authors>
    </header>
    <body>
      <s1 title="Introduction">
        <p>
          Cornerstone is a set of services for the Phoenix kernel. It contains "blocks"
          that plug into Phoenix. Example blocks include ConnectionManager, SocketManager,
          Scheduler etc.
        </p>
      </s1>
    </body>
    <footer>
      <legal>
        Copyright (c) @year@ The Jakarta Apache Project All rights reserved.
        $Revision: 1.1 $ $Date: 2001/11/21 17:10:42 $
      </legal>
    </footer>
  </document>
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/dtd/changes-v10.dtd
  
  Index: changes-v10.dtd
  ===================================================================
  <!-- ===================================================================
  
       Apache Changes DTD (Version 1.0)
  
  PURPOSE:
    This DTD was developed to create a simple yet powerful document
    type for software development changes for use with the Apache projects.
    It is an XML-compliant DTD and it's maintained by the Apache XML
    project.
  
  TYPICAL INVOCATION:
  
    <!DOCTYPE document PUBLIC
         "-//APACHE//DTD Changes Vx.yz//EN"
         "http://xml.apache.org/DTD/changes-vxyz.dtd">
  
    where
  
      x := major version
      y := minor version
      z := status identifier (optional)
  
  NOTES:
    It is important, expecially in open developped software projects, to keep
    track of software changes both to give users indications of bugs that might
    have been resolved, as well, and not less important, to provide credits
    for the support given to the project. It is considered vital to provide
    adequate payback using recognition and credits to let users and developers
    feel part of the community, thus increasing development power.
  
  AUTHORS:
    Stefano Mazzocchi <st...@apache.org>
  
  FIXME:
  
  CHANGE HISTORY:
    19991129 Initial version. (SM)
    20000316 Added bugfixing attribute. (SM)
  
  COPYRIGHT:
    Copyright (c) @year@ The Apache Software Foundation.
  
    Permission to copy in any form is granted provided this notice is
    included in all copies. Permission to redistribute is granted
    provided this file is distributed untouched in all its parts and
    included files.
  
  ==================================================================== -->
  
  <!-- =============================================================== -->
  <!-- Extend the Documentation DTD -->
  <!-- =============================================================== -->
  
  <!-- FIXME (SM): this is hardcoding. Find a better way of doing this
       possibly using public identifiers -->
  <!ENTITY % document-dtd SYSTEM "document-v10.dtd">
  %document-dtd;
  
  <!-- =============================================================== -->
  <!-- Common entities -->
  <!-- =============================================================== -->
  
  <!ENTITY % types "add|remove|update|fix">
  
  <!-- =============================================================== -->
  <!-- Document Type Definition -->
  <!-- =============================================================== -->
  
  <!ELEMENT changes (devs, release*)>
  <!ATTLIST changes %common.att;
                    %title.att;>
  
      <!ELEMENT devs (person+)>
      <!ATTLIST devs %common.att;>
  
      <!ELEMENT release (action+)>
      <!ATTLIST release %common.att;
                        version  CDATA  #REQUIRED
                        date     CDATA  #REQUIRED>
  
          <!ELEMENT action (%content.mix;)*>
          <!ATTLIST action %common.att;
                           dev  IDREF  #REQUIRED
                           type (%types;)  #IMPLIED
                           due-to CDATA #IMPLIED
                           due-to-email CDATA #IMPLIED
                           fixes-bug CDATA #IMPLIED>
  
  <!-- =============================================================== -->
  <!-- End of DTD -->
  <!-- =============================================================== -->
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/dtd/characters.ent
  
  Index: characters.ent
  ===================================================================
  <!-- 
       Portions (C) International Organization for Standardization 1986
       Permission to copy in any form is granted for use with
       conforming SGML systems and applications as defined in
       ISO 8879, provided this notice is included in all copies.
  -->
  
  <!-- 
       Character entity set.
  -->
  
  <!-- Latin A -->
  <!ENTITY nbsp     "&#160;">  <!-- U+00A0 ISOnum    - no-break space = non-breaking space                                   -->
  <!ENTITY iexcl    "&#161;">  <!-- U+00A1 ISOnum    - inverted exclamation mark                                             -->
  <!ENTITY cent     "&#162;">  <!-- U+00A2 ISOnum    - cent sign                                                             -->
  <!ENTITY pound    "&#163;">  <!-- U+00A3 ISOnum    - pound sign                                                            -->
  <!ENTITY curren   "&#164;">  <!-- U+00A4 ISOnum    - currency sign                                                         -->
  <!ENTITY yen      "&#165;">  <!-- U+00A5 ISOnum    - yen sign = yuan sign                                                  -->
  <!ENTITY brvbar   "&#166;">  <!-- U+00A6 ISOnum    - broken bar = broken vertical bar                                      -->
  <!ENTITY sect     "&#167;">  <!-- U+00A7 ISOnum    - section sign                                                          -->
  <!ENTITY uml      "&#168;">  <!-- U+00A8 ISOdia    - diaeresis = spacing diaeresis                                         -->
  <!ENTITY copy     "&#169;">  <!-- U+00A9 ISOnum    - copyright sign                                                        -->
  <!ENTITY ordf     "&#170;">  <!-- U+00AA ISOnum    - feminine ordinal indicator                                            -->
  <!ENTITY laquo    "&#171;">  <!-- U+00AB ISOnum    - left-pointing double angle quotation mark = left pointing guillemet   -->
  <!ENTITY not      "&#172;">  <!-- U+00AC ISOnum    - not sign                                                              -->
  <!ENTITY shy      "&#173;">  <!-- U+00AD ISOnum    - soft hyphen = discretionary hyphen                                    -->
  <!ENTITY reg      "&#174;">  <!-- U+00AE ISOnum    - registered sign = registered trade mark sign                          -->
  <!ENTITY macr     "&#175;">  <!-- U+00AF ISOdia    - macron = spacing macron = overline = APL overbar                      -->
  <!ENTITY deg      "&#176;">  <!-- U+00B0 ISOnum    - degree sign                                                           -->
  <!ENTITY plusmn   "&#177;">  <!-- U+00B1 ISOnum    - plus-minus sign = plus-or-minus sign                                  -->
  <!ENTITY sup2     "&#178;">  <!-- U+00B2 ISOnum    - superscript two = superscript digit two = squared                     -->
  <!ENTITY sup3     "&#179;">  <!-- U+00B3 ISOnum    - superscript three = superscript digit three = cubed                   -->
  <!ENTITY acute    "&#180;">  <!-- U+00B4 ISOdia    - acute accent = spacing acute                                          -->
  <!ENTITY micro    "&#181;">  <!-- U+00B5 ISOnum    - micro sign                                                            -->
  <!ENTITY para     "&#182;">  <!-- U+00B6 ISOnum    - pilcrow sign = paragraph sign                                         -->
  <!ENTITY middot   "&#183;">  <!-- U+00B7 ISOnum    - middle dot = Georgian comma = Greek middle dot                        -->
  <!ENTITY cedil    "&#184;">  <!-- U+00B8 ISOdia    - cedilla = spacing cedilla                                             -->
  <!ENTITY sup1     "&#185;">  <!-- U+00B9 ISOnum    - superscript one = superscript digit one                               -->
  <!ENTITY ordm     "&#186;">  <!-- U+00BA ISOnum    - masculine ordinal indicator                                           -->
  <!ENTITY raquo    "&#187;">  <!-- U+00BB ISOnum    - right-pointing double angle quotation mark = right pointing guillemet -->
  <!ENTITY frac14   "&#188;">  <!-- U+00BC ISOnum    - vulgar fraction one quarter = fraction one quarter                    -->
  <!ENTITY frac12   "&#189;">  <!-- U+00BD ISOnum    - vulgar fraction one half = fraction one half                          -->
  <!ENTITY frac34   "&#190;">  <!-- U+00BE ISOnum    - vulgar fraction three quarters = fraction three quarters              -->
  <!ENTITY iquest   "&#191;">  <!-- U+00BF ISOnum    - inverted question mark = turned question mark                         -->
  <!ENTITY Agrave   "&#192;">  <!-- U+00C0 ISOlat1   - latin capital letter A with grave = latin capital letter A grave      -->
  <!ENTITY Aacute   "&#193;">  <!-- U+00C1 ISOlat1   - latin capital letter A with acute                                     -->
  <!ENTITY Acirc    "&#194;">  <!-- U+00C2 ISOlat1   - latin capital letter A with circumflex                                -->
  <!ENTITY Atilde   "&#195;">  <!-- U+00C3 ISOlat1   - latin capital letter A with tilde                                     -->
  <!ENTITY Auml     "&#196;">  <!-- U+00C4 ISOlat1   - latin capital letter A with diaeresis                                 -->
  <!ENTITY Aring    "&#197;">  <!-- U+00C5 ISOlat1   - latin capital letter A with ring above = latin capital letter A ring  -->
  <!ENTITY AElig    "&#198;">  <!-- U+00C6 ISOlat1   - latin capital letter AE = latin capital ligature AE                   -->
  <!ENTITY Ccedil   "&#199;">  <!-- U+00C7 ISOlat1   - latin capital letter C with cedilla                                   -->
  <!ENTITY Egrave   "&#200;">  <!-- U+00C8 ISOlat1   - latin capital letter E with grave                                     -->
  <!ENTITY Eacute   "&#201;">  <!-- U+00C9 ISOlat1   - latin capital letter E with acute                                     -->
  <!ENTITY Ecirc    "&#202;">  <!-- U+00CA ISOlat1   - latin capital letter E with circumflex                                -->
  <!ENTITY Euml     "&#203;">  <!-- U+00CB ISOlat1   - latin capital letter E with diaeresis                                 -->
  <!ENTITY Igrave   "&#204;">  <!-- U+00CC ISOlat1   - latin capital letter I with grave                                     -->
  <!ENTITY Iacute   "&#205;">  <!-- U+00CD ISOlat1   - latin capital letter I with acute                                     -->
  <!ENTITY Icirc    "&#206;">  <!-- U+00CE ISOlat1   - latin capital letter I with circumflex                                -->
  <!ENTITY Iuml     "&#207;">  <!-- U+00CF ISOlat1   - latin capital letter I with diaeresis                                 -->
  <!ENTITY ETH      "&#208;">  <!-- U+00D0 ISOlat1   - latin capital letter ETH                                              -->
  <!ENTITY Ntilde   "&#209;">  <!-- U+00D1 ISOlat1   - latin capital letter N with tilde                                     -->
  <!ENTITY Ograve   "&#210;">  <!-- U+00D2 ISOlat1   - latin capital letter O with grave                                     -->
  <!ENTITY Oacute   "&#211;">  <!-- U+00D3 ISOlat1   - latin capital letter O with acute                                     -->
  <!ENTITY Ocirc    "&#212;">  <!-- U+00D4 ISOlat1   - latin capital letter O with circumflex                                -->
  <!ENTITY Otilde   "&#213;">  <!-- U+00D5 ISOlat1   - latin capital letter O with tilde                                     -->
  <!ENTITY Ouml     "&#214;">  <!-- U+00D6 ISOlat1   - latin capital letter O with diaeresis                                 -->
  <!ENTITY times    "&#215;">  <!-- U+00D7 ISOnum    - multiplication sign                                                   -->
  <!ENTITY Oslash   "&#216;">  <!-- U+00D8 ISOlat1   - latin capital letter O with stroke = latin capital letter O slash     -->
  <!ENTITY Ugrave   "&#217;">  <!-- U+00D9 ISOlat1   - latin capital letter U with grave                                     -->
  <!ENTITY Uacute   "&#218;">  <!-- U+00DA ISOlat1   - latin capital letter U with acute                                     -->
  <!ENTITY Ucirc    "&#219;">  <!-- U+00DB ISOlat1   - latin capital letter U with circumflex                                -->
  <!ENTITY Uuml     "&#220;">  <!-- U+00DC ISOlat1   - latin capital letter U with diaeresis                                 -->
  <!ENTITY Yacute   "&#221;">  <!-- U+00DD ISOlat1   - latin capital letter Y with acute                                     -->
  <!ENTITY THORN    "&#222;">  <!-- U+00DE ISOlat1   - latin capital letter THORN                                            -->
  <!ENTITY szlig    "&#223;">  <!-- U+00DF ISOlat1   - latin small letter sharp s = ess-zed                                  -->
  <!ENTITY agrave   "&#224;">  <!-- U+00E0 ISOlat1   - latin small letter a with grave = latin small letter a grave          -->
  <!ENTITY aacute   "&#225;">  <!-- U+00E1 ISOlat1   - latin small letter a with acute                                       -->
  <!ENTITY acirc    "&#226;">  <!-- U+00E2 ISOlat1   - latin small letter a with circumflex                                  -->
  <!ENTITY atilde   "&#227;">  <!-- U+00E3 ISOlat1   - latin small letter a with tilde                                       -->
  <!ENTITY auml     "&#228;">  <!-- U+00E4 ISOlat1   - latin small letter a with diaeresis                                   -->
  <!ENTITY aring    "&#229;">  <!-- U+00E5 ISOlat1   - latin small letter a with ring above = latin small letter a ring      -->
  <!ENTITY aelig    "&#230;">  <!-- U+00E6 ISOlat1   - latin small letter ae = latin small ligature ae                       -->
  <!ENTITY ccedil   "&#231;">  <!-- U+00E7 ISOlat1   - latin small letter c with cedilla                                     -->
  <!ENTITY egrave   "&#232;">  <!-- U+00E8 ISOlat1   - latin small letter e with grave                                       -->
  <!ENTITY eacute   "&#233;">  <!-- U+00E9 ISOlat1   - latin small letter e with acute                                       -->
  <!ENTITY ecirc    "&#234;">  <!-- U+00EA ISOlat1   - latin small letter e with circumflex                                  -->
  <!ENTITY euml     "&#235;">  <!-- U+00EB ISOlat1   - latin small letter e with diaeresis                                   -->
  <!ENTITY igrave   "&#236;">  <!-- U+00EC ISOlat1   - latin small letter i with grave                                       -->
  <!ENTITY iacute   "&#237;">  <!-- U+00ED ISOlat1   - latin small letter i with acute                                       -->
  <!ENTITY icirc    "&#238;">  <!-- U+00EE ISOlat1   - latin small letter i with circumflex                                  -->
  <!ENTITY iuml     "&#239;">  <!-- U+00EF ISOlat1   - latin small letter i with diaeresis                                   -->
  <!ENTITY eth      "&#240;">  <!-- U+00F0 ISOlat1   - latin small letter eth                                                -->
  <!ENTITY ntilde   "&#241;">  <!-- U+00F1 ISOlat1   - latin small letter n with tilde                                       -->
  <!ENTITY ograve   "&#242;">  <!-- U+00F2 ISOlat1   - latin small letter o with grave                                       -->
  <!ENTITY oacute   "&#243;">  <!-- U+00F3 ISOlat1   - latin small letter o with acute                                       -->
  <!ENTITY ocirc    "&#244;">  <!-- U+00F4 ISOlat1   - latin small letter o with circumflex                                  -->
  <!ENTITY otilde   "&#245;">  <!-- U+00F5 ISOlat1   - latin small letter o with tilde                                       -->
  <!ENTITY ouml     "&#246;">  <!-- U+00F6 ISOlat1   - latin small letter o with diaeresis                                   -->
  <!ENTITY divide   "&#247;">  <!-- U+00F7 ISOnum    - division sign                                                         -->
  <!ENTITY oslash   "&#248;">  <!-- U+00F8 ISOlat1   - latin small letter o with stroke = latin small letter o slash         -->
  <!ENTITY ugrave   "&#249;">  <!-- U+00F9 ISOlat1   - latin small letter u with grave                                       -->
  <!ENTITY uacute   "&#250;">  <!-- U+00FA ISOlat1   - latin small letter u with acute                                       -->
  <!ENTITY ucirc    "&#251;">  <!-- U+00FB ISOlat1   - latin small letter u with circumflex                                  -->
  <!ENTITY uuml     "&#252;">  <!-- U+00FC ISOlat1   - latin small letter u with diaeresis                                   -->
  <!ENTITY yacute   "&#253;">  <!-- U+00FD ISOlat1   - latin small letter y with acute                                       -->
  <!ENTITY thorn    "&#254;">  <!-- U+00FE ISOlat1   - latin small letter thorn                                              -->
  <!ENTITY yuml     "&#255;">  <!-- U+00FF ISOlat1   - latin small letter y with diaeresis                                   -->
  
  <!-- Latin Extended-A -->
  <!ENTITY OElig    "&#338;">  <!-- U+0152 ISOlat2   - latin capital ligature OE                                             -->
  <!ENTITY oelig    "&#339;">  <!-- U+0153 ISOlat2   - latin small ligature oe                                               -->
  
  <!-- ligature is a misnomer, this is a separate character in some languages -->
  <!ENTITY Scaron   "&#352;">  <!-- U+0160 ISOlat2   - latin capital letter S with caron                                     -->
  <!ENTITY scaron   "&#353;">  <!-- U+0161 ISOlat2   - latin small letter s with caron                                       -->
  <!ENTITY Yuml     "&#376;">  <!-- U+0178 ISOlat2   - latin capital letter Y with diaeresis                                 -->
  
  <!-- Spacing Modifier Letters -->
  <!ENTITY circ     "&#710;">  <!-- U+02C6 ISOpub    - modifier letter circumflex accent                                     -->
  <!ENTITY tilde    "&#732;">  <!-- U+02DC ISOdia    - small tilde                                                           -->
  
  <!-- General Punctuation -->
  <!ENTITY ensp     "&#8194;"> <!-- U+2002 ISOpub    - en space                                                              -->
  <!ENTITY emsp     "&#8195;"> <!-- U+2003 ISOpub    - em space                                                              -->
  <!ENTITY thinsp   "&#8201;"> <!-- U+2009 ISOpub    - thin space                                                            -->
  <!ENTITY zwnj     "&#8204;"> <!-- U+200C RFC 2070  - zero width non-joiner                                                 -->
  <!ENTITY zwj      "&#8205;"> <!-- U+200D RFC 2070  - zero width joiner                                                     -->
  <!ENTITY lrm      "&#8206;"> <!-- U+200E RFC 2070  - left-to-right mark                                                    -->
  <!ENTITY rlm      "&#8207;"> <!-- U+200F RFC 2070  - right-to-left mark                                                    -->
  <!ENTITY ndash    "&#8211;"> <!-- U+2013 ISOpub    - en dash                                                               -->
  <!ENTITY mdash    "&#8212;"> <!-- U+2014 ISOpub    - em dash                                                               -->
  <!ENTITY lsquo    "&#8216;"> <!-- U+2018 ISOnum    - left single quotation mark                                            -->
  <!ENTITY rsquo    "&#8217;"> <!-- U+2019 ISOnum    - right single quotation mark                                           -->
  <!ENTITY sbquo    "&#8218;"> <!-- U+201A NEW       - single low-9 quotation mark                                           -->
  <!ENTITY ldquo    "&#8220;"> <!-- U+201C ISOnum    - left double quotation mark                                            -->
  <!ENTITY rdquo    "&#8221;"> <!-- U+201D ISOnum    - right double quotation mark,                                          -->
  <!ENTITY bdquo    "&#8222;"> <!-- U+201E NEW       - double low-9 quotation mark                                           -->
  <!ENTITY dagger   "&#8224;"> <!-- U+2020 ISOpub    - dagger                                                                -->
  <!ENTITY Dagger   "&#8225;"> <!-- U+2021 ISOpub    - double dagger                                                         -->
  <!ENTITY permil   "&#8240;"> <!-- U+2030 ISOtech   - per mille sign                                                        -->
  <!ENTITY lsaquo   "&#8249;"> <!-- U+2039 ISO prop. - single left-pointing angle quotation mark                             -->
  
  <!-- lsaquo is proposed but not yet ISO standardized -->
  <!ENTITY rsaquo   "&#8250;"> <!-- U+203A ISO prop. -   single right-pointing angle quotation mark                          -->
  
  <!-- rsaquo is proposed but not yet ISO standardized -->
  <!ENTITY euro     "&#8364;"> <!-- U+20AC NEW       -   euro sign                                                           -->
  
  <!-- Latin Extended-B -->
  <!ENTITY fnof     "&#402;">  <!-- U+0192 ISOtech   - latin small f with hook = function = florin                           -->
  
  <!-- Greek -->
  <!ENTITY Alpha    "&#913;">  <!-- U+0391           - greek capital letter alpha                                            -->
  <!ENTITY Beta     "&#914;">  <!-- U+0392           - greek capital letter beta                                             -->
  <!ENTITY Gamma    "&#915;">  <!-- U+0393 ISOgrk3   - greek capital letter gamma                                            -->
  <!ENTITY Delta    "&#916;">  <!-- U+0394 ISOgrk3   - greek capital letter delta                                            -->
  <!ENTITY Epsilon  "&#917;">  <!-- U+0395           - greek capital letter epsilon                                          -->
  <!ENTITY Zeta     "&#918;">  <!-- U+0396           - greek capital letter zeta                                             -->
  <!ENTITY Eta      "&#919;">  <!-- U+0397           - greek capital letter eta                                              -->
  <!ENTITY Theta    "&#920;">  <!-- U+0398 ISOgrk3   - greek capital letter theta                                            -->
  <!ENTITY Iota     "&#921;">  <!-- U+0399           - greek capital letter iota                                             -->
  <!ENTITY Kappa    "&#922;">  <!-- U+039A           - greek capital letter kappa                                            -->
  <!ENTITY Lambda   "&#923;">  <!-- U+039B ISOgrk3   - greek capital letter lambda                                           -->
  <!ENTITY Mu       "&#924;">  <!-- U+039C           - greek capital letter mu                                               -->
  <!ENTITY Nu       "&#925;">  <!-- U+039D           - greek capital letter nu                                               -->
  <!ENTITY Xi       "&#926;">  <!-- U+039E ISOgrk3   - greek capital letter xi                                               -->
  <!ENTITY Omicron  "&#927;">  <!-- U+039F           - greek capital letter omicron                                          -->
  <!ENTITY Pi       "&#928;">  <!-- U+03A0 ISOgrk3   - greek capital letter pi                                               -->
  <!ENTITY Rho      "&#929;">  <!-- U+03A1           - greek capital letter rho                                              -->
  <!ENTITY Sigma    "&#931;">  <!-- U+03A3 ISOgrk3   - greek capital letter sigma                                            -->
  <!ENTITY Tau      "&#932;">  <!-- U+03A4           - greek capital letter tau                                              -->
  <!ENTITY Upsilon  "&#933;">  <!-- U+03A5 ISOgrk3   - greek capital letter upsilon                                          -->
  <!ENTITY Phi      "&#934;">  <!-- U+03A6 ISOgrk3   - greek capital letter phi                                              -->
  <!ENTITY Chi      "&#935;">  <!-- U+03A7           - greek capital letter chi                                              -->
  <!ENTITY Psi      "&#936;">  <!-- U+03A8 ISOgrk3   - greek capital letter psi                                              -->
  <!ENTITY Omega    "&#937;">  <!-- U+03A9 ISOgrk3   - greek capital letter omega                                            -->
  <!ENTITY alpha    "&#945;">  <!-- U+03B1 ISOgrk3   - greek small letter alpha                                              -->
  <!ENTITY beta     "&#946;">  <!-- U+03B2 ISOgrk3   - greek small letter beta                                               -->
  <!ENTITY gamma    "&#947;">  <!-- U+03B3 ISOgrk3   - greek small letter gamma                                              -->
  <!ENTITY delta    "&#948;">  <!-- U+03B4 ISOgrk3   - greek small letter delta                                              -->
  <!ENTITY epsilon  "&#949;">  <!-- U+03B5 ISOgrk3   - greek small letter epsilon                                            -->
  <!ENTITY zeta     "&#950;">  <!-- U+03B6 ISOgrk3   - greek small letter zeta                                               -->
  <!ENTITY eta      "&#951;">  <!-- U+03B7 ISOgrk3   - greek small letter eta                                                -->
  <!ENTITY theta    "&#952;">  <!-- U+03B8 ISOgrk3   - greek small letter theta                                              -->
  <!ENTITY iota     "&#953;">  <!-- U+03B9 ISOgrk3   - greek small letter iota                                               -->
  <!ENTITY kappa    "&#954;">  <!-- U+03BA ISOgrk3   - greek small letter kappa                                              -->
  <!ENTITY lambda   "&#955;">  <!-- U+03BB ISOgrk3   - greek small letter lambda                                             -->
  <!ENTITY mu       "&#956;">  <!-- U+03BC ISOgrk3   - greek small letter mu                                                 -->
  <!ENTITY nu       "&#957;">  <!-- U+03BD ISOgrk3   - greek small letter nu                                                 -->
  <!ENTITY xi       "&#958;">  <!-- U+03BE ISOgrk3   - greek small letter xi                                                 -->
  <!ENTITY omicron  "&#959;">  <!-- U+03BF NEW       - greek small letter omicron                                            -->
  <!ENTITY pi       "&#960;">  <!-- U+03C0 ISOgrk3   - greek small letter pi                                                 -->
  <!ENTITY rho      "&#961;">  <!-- U+03C1 ISOgrk3   - greek small letter rho                                                -->
  <!ENTITY sigmaf   "&#962;">  <!-- U+03C2 ISOgrk3   - greek small letter final sigma                                        -->
  <!ENTITY sigma    "&#963;">  <!-- U+03C3 ISOgrk3   - greek small letter sigma                                              -->
  <!ENTITY tau      "&#964;">  <!-- U+03C4 ISOgrk3   - greek small letter tau                                                -->
  <!ENTITY upsilon  "&#965;">  <!-- U+03C5 ISOgrk3   - greek small letter upsilon                                            -->
  <!ENTITY phi      "&#966;">  <!-- U+03C6 ISOgrk3   - greek small letter phi                                                -->
  <!ENTITY chi      "&#967;">  <!-- U+03C7 ISOgrk3   - greek small letter chi                                                -->
  <!ENTITY psi      "&#968;">  <!-- U+03C8 ISOgrk3   - greek small letter psi                                                -->
  <!ENTITY omega    "&#969;">  <!-- U+03C9 ISOgrk3   - greek small letter omega                                              -->
  <!ENTITY thetasym "&#977;">  <!-- U+03D1 NEW       - greek small letter theta symbol                                       -->
  <!ENTITY upsih    "&#978;">  <!-- U+03D2 NEW       - greek upsilon with hook symbol                                        -->
  <!ENTITY piv      "&#982;">  <!-- U+03D6 ISOgrk3   - greek pi symbol                                                       -->
  
  <!-- General Punctuation -->
  <!ENTITY bull     "&#8226;"> <!-- U+2022 ISOpub    - bullet = black small circle                                           -->
  <!ENTITY hellip   "&#8230;"> <!-- U+2026 ISOpub    - horizontal ellipsis = three dot leader                                -->
  <!ENTITY prime    "&#8242;"> <!-- U+2032 ISOtech   - prime = minutes = feet                                                -->
  <!ENTITY Prime    "&#8243;"> <!-- U+2033 ISOtech   - double prime = seconds = inches                                       -->
  <!ENTITY oline    "&#8254;"> <!-- U+203E NEW       - overline = spacing overscore                                          -->
  <!ENTITY frasl    "&#8260;"> <!-- U+2044 NEW       - fraction slash                                                        -->
  
  <!-- Letterlike Symbols -->
  <!ENTITY weierp   "&#8472;"> <!-- U+2118 ISOamso   - script capital P = power set = Weierstrass p                          -->
  <!ENTITY image    "&#8465;"> <!-- U+2111 ISOamso   - blackletter capital I = imaginary part                                -->
  <!ENTITY real     "&#8476;"> <!-- U+211C ISOamso   - blackletter capital R = real part symbol                              -->
  <!ENTITY trade    "&#8482;"> <!-- U+2122 ISOnum    - trade mark sign                                                       -->
  <!ENTITY alefsym  "&#8501;"> <!-- U+2135 NEW       - alef symbol = first transfinite cardinal                              -->
  
  <!-- Arrows -->
  <!ENTITY larr     "&#8592;"> <!-- U+2190 ISOnum    - leftwards arrow                                                       -->
  <!ENTITY uarr     "&#8593;"> <!-- U+2191 ISOnum    - upwards arrow                                                         -->
  <!ENTITY rarr     "&#8594;"> <!-- U+2192 ISOnum    - rightwards arrow                                                      -->
  <!ENTITY darr     "&#8595;"> <!-- U+2193 ISOnum    - downwards arrow                                                       -->
  <!ENTITY harr     "&#8596;"> <!-- U+2194 ISOamsa   - left right arrow                                                      -->
  <!ENTITY crarr    "&#8629;"> <!-- U+21B5 NEW       - downwards arrow with corner leftwards = carriage return               -->
  <!ENTITY lArr     "&#8656;"> <!-- U+21D0 ISOtech   - leftwards double arrow                                                -->
  <!ENTITY uArr     "&#8657;"> <!-- U+21D1 ISOamsa   - upwards double arrow                                                  -->
  <!ENTITY rArr     "&#8658;"> <!-- U+21D2 ISOtech   - rightwards double arrow                                               -->
  <!ENTITY dArr     "&#8659;"> <!-- U+21D3 ISOamsa   - downwards double arrow                                                -->
  <!ENTITY hArr     "&#8660;"> <!-- U+21D4 ISOamsa   - left right double arrow                                               -->
  
  <!-- Mathematical Operators -->
  <!ENTITY forall   "&#8704;"> <!-- U+2200 ISOtech   - for all                                                               -->
  <!ENTITY part     "&#8706;"> <!-- U+2202 ISOtech   - partial differential                                                  -->
  <!ENTITY exist    "&#8707;"> <!-- U+2203 ISOtech   - there exists                                                          -->
  <!ENTITY empty    "&#8709;"> <!-- U+2205 ISOamso   - empty set = null set = diameter                                       -->
  <!ENTITY nabla    "&#8711;"> <!-- U+2207 ISOtech   - nabla = backward difference                                           -->
  <!ENTITY isin     "&#8712;"> <!-- U+2208 ISOtech   - element of                                                            -->
  <!ENTITY notin    "&#8713;"> <!-- U+2209 ISOtech   - not an element of                                                     -->
  <!ENTITY ni       "&#8715;"> <!-- U+220B ISOtech   - contains as member                                                    -->
  <!ENTITY prod     "&#8719;"> <!-- U+220F ISOamsb   - n-ary product = product sign                                          -->
  <!ENTITY sum      "&#8721;"> <!-- U+2211 ISOamsb   - n-ary sumation                                                        -->
  <!ENTITY minus    "&#8722;"> <!-- U+2212 ISOtech   - minus sign                                                            -->
  <!ENTITY lowast   "&#8727;"> <!-- U+2217 ISOtech   - asterisk operator                                                     -->
  <!ENTITY radic    "&#8730;"> <!-- U+221A ISOtech   - square root = radical sign                                            -->
  <!ENTITY prop     "&#8733;"> <!-- U+221D ISOtech   - proportional to                                                       -->
  <!ENTITY infin    "&#8734;"> <!-- U+221E ISOtech   - infinity                                                              -->
  <!ENTITY ang      "&#8736;"> <!-- U+2220 ISOamso   - angle                                                                 -->
  <!ENTITY and      "&#8743;"> <!-- U+2227 ISOtech   - logical and = wedge                                                   -->
  <!ENTITY or       "&#8744;"> <!-- U+2228 ISOtech   - logical or = vee                                                      -->
  <!ENTITY cap      "&#8745;"> <!-- U+2229 ISOtech   - intersection = cap                                                    -->
  <!ENTITY cup      "&#8746;"> <!-- U+222A ISOtech   - union = cup                                                           -->
  <!ENTITY int      "&#8747;"> <!-- U+222B ISOtech   - integral                                                              -->
  <!ENTITY there4   "&#8756;"> <!-- U+2234 ISOtech   - therefore                                                             -->
  <!ENTITY sim      "&#8764;"> <!-- U+223C ISOtech   - tilde operator = varies with = similar to                             -->
  <!ENTITY cong     "&#8773;"> <!-- U+2245 ISOtech   - approximately equal to                                                -->
  <!ENTITY asymp    "&#8776;"> <!-- U+2248 ISOamsr   - almost equal to = asymptotic to                                       -->
  <!ENTITY ne       "&#8800;"> <!-- U+2260 ISOtech   - not equal to                                                          -->
  <!ENTITY equiv    "&#8801;"> <!-- U+2261 ISOtech   - identical to                                                          -->
  <!ENTITY le       "&#8804;"> <!-- U+2264 ISOtech   - less-than or equal to                                                 -->
  <!ENTITY ge       "&#8805;"> <!-- U+2265 ISOtech   - greater-than or equal to                                              -->
  <!ENTITY sub      "&#8834;"> <!-- U+2282 ISOtech   - subset of                                                             -->
  <!ENTITY sup      "&#8835;"> <!-- U+2283 ISOtech   - superset of                                                           -->
  <!ENTITY nsub     "&#8836;"> <!-- U+2284 ISOamsn   - not a subset of                                                       -->
  <!ENTITY sube     "&#8838;"> <!-- U+2286 ISOtech   - subset of or equal to                                                 -->
  <!ENTITY supe     "&#8839;"> <!-- U+2287 ISOtech   - superset of or equal to                                               -->
  <!ENTITY oplus    "&#8853;"> <!-- U+2295 ISOamsb   - circled plus = direct sum                                             -->
  <!ENTITY otimes   "&#8855;"> <!-- U+2297 ISOamsb   - circled times = vector product                                        -->
  <!ENTITY perp     "&#8869;"> <!-- U+22A5 ISOtech   - up tack = orthogonal to = perpendicular                               -->
  <!ENTITY sdot     "&#8901;"> <!-- U+22C5 ISOamsb   - dot operator                                                          -->
  
  <!-- Miscellaneous Technical -->
  <!ENTITY lceil    "&#8968;"> <!-- U+2308 ISOamsc   - left ceiling = apl upstile                                            -->
  <!ENTITY rceil    "&#8969;"> <!-- U+2309 ISOamsc   - right ceiling                                                         -->
  <!ENTITY lfloor   "&#8970;"> <!-- U+230A ISOamsc   - left floor = apl downstile                                            -->
  <!ENTITY rfloor   "&#8971;"> <!-- U+230B ISOamsc   - right floor                                                           -->
  <!ENTITY lang     "&#9001;"> <!-- U+2329 ISOtech   - left-pointing angle bracket = bra                                     -->
  <!ENTITY rang     "&#9002;"> <!-- U+232A ISOtech   - right-pointing angle bracket = ket                                    -->
  
  <!-- Geometric Shapes -->
  <!ENTITY loz      "&#9674;"> <!-- U+25CA ISOpub    - lozenge                                                               -->
  
  <!-- Miscellaneous Symbols -->
  <!ENTITY spades   "&#9824;"> <!-- U+2660 ISOpub    - black spade suit                                                      -->
  <!ENTITY clubs    "&#9827;"> <!-- U+2663 ISOpub    - black club suit = shamrock                                            -->
  <!ENTITY hearts   "&#9829;"> <!-- U+2665 ISOpub    - black heart suit = valentine                                          -->
  <!ENTITY diams    "&#9830;"> <!-- U+2666 ISOpub    - black diamond suit                                                    -->
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/dtd/document-v10.dtd
  
  Index: document-v10.dtd
  ===================================================================
  <!-- ===================================================================
  
       Apache Documentation DTD (Version 1.0)
  
  PURPOSE:
    This DTD was developed to create a simple yet powerful document
    type for software documentation for use with the Apache projects.
    It is an XML-compliant DTD and it's maintained by the Apache XML
    project.
  
  TYPICAL INVOCATION:
  
    <!DOCTYPE document PUBLIC
         "-//APACHE//DTD Documentation Vx.yz//EN"
         "http://xml.apache.org/DTD/document-vxyz.dtd">
  
    where
  
      x := major version
      y := minor version
      z := status identifier (optional)
  
  NOTES:
    Many of the design patterns used in this DTD were take from the
    W3C XML Specification DTD edited by Eve Maler <el...@arbortext.com>.
  
    Where possible, great care has been used to reutilize HTML tag
    names to reduce learning efforts and to allow HTML editors to be
    used for complex authorings like tables and lists.
  
  AUTHORS:
    Stefano Mazzocchi <st...@apache.org>
    Berin Loritsch <bl...@apache.org>
  
  FIXME:
    - how can we include char entities without hardwiring them?
    - should "form" tags be included?
    - should all style-free HTML 4.0 markup tags be included?
    - how do we handle the idea of "soft" xlinks?
    - should we add "soft" links to images?
  
  CHANGE HISTORY:
    19991121 Initial version. (SM)
    19991123 Replaced "res" with more standard "strong" for emphasis. (SM)
    19991124 Added "fork" element for window forking behavior. (SM)
    19991124 Added "img-inline" element to separate from "img". (SM)
    19991129 Removed "affiliation" from "author". (SM)
    19991129 Made "author" empty and moved "name|email" as attributes (SM)
    19991215 Simplified table section (SM)
    19991215 Changed "img-block" in more friendly "figure" (SM)
    20000125 Added the "icon" image (SM)
    20000126 Allowed "anchor" in all levels (SM)
    20000404 Removed the "role" attribute from common-xxx.att (SM)
    20000606 Allowed nested markup tags (SM)
    20000911 Allowed link tags inside markup (BL)
  
  COPYRIGHT:
    Copyright (c) 1999-2000 The Apache Software Foundation.
  
    Permission to copy in any form is granted provided this notice is
    included in all copies. Permission to redistribute is granted
    provided this file is distributed untouched in all its parts and
    included files.
  
  ==================================================================== -->
  
  
  
  
  <!-- =============================================================== -->
  <!-- Common character entities (included from external file) -->
  <!-- =============================================================== -->
  
  <!-- FIXME (SM): this is hardcoding. Find a better way of doing this
       possibly using public identifiers of ISO latin char sets -->
  <!ENTITY % charEntity SYSTEM "characters.ent">
  %charEntity;
  
  
  
  
  <!-- =============================================================== -->
  <!-- Userful entitieis for increased DTD readability -->
  <!-- =============================================================== -->
  
  <!ENTITY % text "#PCDATA">
  
  
  <!-- =============================================================== -->
  <!-- Entities for general XML compliance -->
  <!-- =============================================================== -->
  
  <!-- Common attributes
          Every element has an ID attribute (sometimes required,
          but usually optional) for links. %common.att;
          is for common attributes where the ID is optional, and
          %common-idreq.att; is for common attributes where the
          ID is required.
  -->
  <!ENTITY % common.att
          'id                     ID              #IMPLIED
           xml:lang               NMTOKEN         #IMPLIED'>
  <!ENTITY % common-idreq.att
          'id                     ID              #REQUIRED
           xml:lang               NMTOKEN         #IMPLIED'>
  
  
  <!-- xml:space attribute ===============================================
          Indicates that the element contains white space
          that the formatter or other application should retain,
          as appropriate to its function.
  ==================================================================== -->
  <!ENTITY % xmlspace.att
          'xml:space (default|preserve) #FIXED "preserve"'>
  
  
  <!-- def attribute =====================================================
          Points to the element where the relevant definition can be
          found, using the IDREF mechanism.  %def.att; is for optional
          def attributes, and %def-req.att; is for required def
          attributes.
  ==================================================================== -->
  <!ENTITY % def.att
          'def                    IDREF           #IMPLIED'>
  <!ENTITY % def-req.att
          'def                    IDREF           #REQUIRED'>
  
  
  
  <!-- ref attribute =====================================================
          Points to the element where more information can be found,
          using the IDREF mechanism.  %ref.att; is for optional
          ref attributes, and %ref-req.att; is for required ref
          attributes.
  ================================================================== -->
  <!ENTITY % ref.att
          'ref                    IDREF           #IMPLIED'>
  <!ENTITY % ref-req.att
          'ref                    IDREF           #REQUIRED'>
  
  
  <!-- =============================================================== -->
  <!-- Entities for XLink compliance -->
  <!-- =============================================================== -->
  
  <!ENTITY % xlink-simple.att
          'type      (simple|extended|locator|arc) #FIXED "simple"
           href      CDATA                         #IMPLIED
           role      CDATA                         #IMPLIED
           title     CDATA                         #IMPLIED '>
  <!--    'xmlns     CDATA                         #FIXED "http://www.w3.org/XML/XLink/0.9" -->
  <!-- FIXME: brain-dead IE5 has broken support for
       namespace validation and since I use it for editing
       I remove this for now -->
  
  <!ENTITY % xlink-user-replace.att
          'show      (new|parsed|replace)   #FIXED "replace"
           actuate   (user|auto)            #FIXED "user" '>
  
  <!ENTITY % xlink-user-new.att
          'show      (new|parsed|replace)   #FIXED "new"
           actuate   (user|auto)            #FIXED "user" '>
  
  <!ENTITY % xlink-auto-parsed.att
          'show      (new|parsed|replace)   #FIXED "parsed"
           actuate   (user|auto)            #FIXED "auto" '>
  
  <!-- FIXME (SM): XLink doesn't yet cover the idea of soft links so
       introducing it here using the same namespace is _somewhat_
       illegal. Should we create it own namespace?
  -->
  <!ENTITY % xlink-soft.att
          'mode      (hard|soft)            #FIXED "soft" '>
  
  
  <!-- =============================================================== -->
  <!-- Entities for general usage -->
  <!-- =============================================================== -->
  
  
  <!-- Key attribute =====================================================
          Optionally provides a sorting or indexing key, for cases when
          the element content is inappropriate for this purpose.
  ==================================================================== -->
  <!ENTITY % key.att
          'key                    CDATA           #IMPLIED'>
  
  
  
  <!-- Title attributes ==================================================
          Indicates that the element requires to have a title.
  ==================================================================== -->
  <!ENTITY % title.att
          'title                  CDATA           #REQUIRED'>
  
  
  
  <!-- Name attributes ==================================================
          Indicates that the element requires to have a name.
  ==================================================================== -->
  <!ENTITY % name.att
          'name                   CDATA           #REQUIRED'>
  
  
  
  <!-- Email attributes ==================================================
          Indicates that the element requires to have an email.
  ==================================================================== -->
  <!ENTITY % email.att
          'email                  CDATA           #REQUIRED'>
  
  
  
  
  
  <!-- =============================================================== -->
  <!-- General definitions -->
  <!-- =============================================================== -->
  
  <!-- A person is a general human entity -->
  <!ELEMENT person EMPTY>
  <!ATTLIST person %common.att;
                   %name.att;
                   %email.att;>
  
  
  
  
  <!-- =============================================================== -->
  <!-- Content definitions -->
  <!-- =============================================================== -->
  
  <!ENTITY % local.content.mix "">
  
  <!ENTITY % markup "strong|em|code|sub|sup">
  
  <!ENTITY % links "link|connect|jump|fork|anchor">
  
  <!ENTITY % special "br|img|icon">
  
  <!ENTITY % link-content.mix "%text;|%markup;|%special;%local.content.mix;">
  
  <!ENTITY % content.mix "%link-content.mix;|%links;">
  
      <!-- ==================================================== -->
      <!-- Phrase Markup -->
      <!-- ==================================================== -->
  
      <!-- Strong (typically bold) -->
      <!ELEMENT strong (%text;|%markup;|%links;)*>
      <!ATTLIST strong %common.att;>
  
      <!-- Emphasis (typically italic) -->
      <!ELEMENT em (%text;|%markup;|%links;)*>
      <!ATTLIST em %common.att;>
  
      <!-- Code (typically monospaced) -->
      <!ELEMENT code (%text;|%markup;|%links;)*>
      <!ATTLIST code %common.att;>
  
      <!-- Superscript (typically smaller and higher) -->
      <!ELEMENT sup (%text;|%markup;|%links;)*>
      <!ATTLIST sup %common.att;>
  
      <!-- Subscript (typically smaller and lower) -->
      <!ELEMENT sub (%text;|%markup;|%links;)*>
      <!ATTLIST sub %common.att;>
  
      <!-- FIXME (SM): should we add these HTML 4.0 markups
           which are style-free?
  
            -dfn
            -samp
            -kbd
            -var
            -cite
            -abbr
            -acronym
  
       -->
  
      <!-- ==================================================== -->
      <!-- Hypertextual Links -->
      <!-- ==================================================== -->
  
      <!-- hard replacing link (equivalent of <a ...>) -->
      <!ELEMENT link (%link-content.mix;)*>
      <!ATTLIST link %common.att;
                     %xlink-simple.att;
                     %xlink-user-replace.att;>
  
      <!-- Hard window replacing link (equivalent of <a ... target="_top">) -->
      <!ELEMENT jump (%link-content.mix;)*>
      <!ATTLIST jump anchor CDATA #IMPLIED
                     %common.att;
                     %xlink-simple.att;
                     %xlink-user-new.att;>
  
      <!-- Hard window forking link (equivalent of <a ... target="_new">) -->
      <!ELEMENT fork (%link-content.mix;)*>
      <!ATTLIST fork %common.att;
                     %xlink-simple.att;
                     %xlink-user-new.att;>
  
      <!-- Anchor point (equivalent of <a name="...">) -->
      <!ELEMENT anchor EMPTY>
      <!ATTLIST anchor %common-idreq.att;>
  
      <!-- Soft link between processed pages (no equivalent in HTML) -->
      <!ELEMENT connect (%link-content.mix;)*>
      <!ATTLIST connect %common.att;
                        %xlink-simple.att;
                        %xlink-user-replace.att;
                        %xlink-soft.att;>
  
      <!-- ==================================================== -->
      <!-- Specials -->
      <!-- ==================================================== -->
  
      <!-- Breakline Object (typically forces line break) -->
      <!ELEMENT br EMPTY>
      <!ATTLIST br %common.att;>
  
      <!-- Image Object (typically an inlined image) -->
      <!-- FIXME (SM): should we have the notion of soft links even here
           for inlined objects? -->
      <!ELEMENT img EMPTY>
      <!ATTLIST img src    CDATA  #REQUIRED
                    alt    CDATA  #REQUIRED
                    height CDATA  #IMPLIED
                    width  CDATA  #IMPLIED
                    usemap CDATA  #IMPLIED
                    ismap  (ismap) #IMPLIED
                    %common.att;>
  
      <!-- Image Icon (typically an inlined image placed as graphical item) -->
      <!-- FIXME (SM): should we have the notion of soft links even here
           for inlined objects? -->
      <!ELEMENT icon EMPTY>
      <!ATTLIST icon src    CDATA  #REQUIRED
                     alt    CDATA  #REQUIRED
                     height CDATA  #IMPLIED
                     width  CDATA  #IMPLIED
                     %common.att;>
  
  
  
  
  <!-- =============================================================== -->
  <!-- Blocks definitions -->
  <!-- =============================================================== -->
  
  <!ENTITY % local.blocks "">
  
  <!ENTITY % paragraphs "p|source|note|fixme|figure">
  
  <!ENTITY % local.lists "%paragraphs;">
  
  <!ENTITY % tables "table">
  
  <!ENTITY % lists "ol|ul|sl|dl|%local.lists;">
  
  <!ENTITY % blocks "anchor|%paragraphs;|%tables;|%lists; %local.blocks;">
  
      <!-- ==================================================== -->
      <!-- Paragraphs -->
      <!-- ==================================================== -->
  
      <!-- Text Paragraph (normally vertically space delimited) -->
      <!ELEMENT p (%content.mix;)*>
      <!ATTLIST p %common.att;>
  
      <!-- Source Paragraph (normally space is preserved) -->
      <!ELEMENT source (%content.mix;)*>
      <!ATTLIST source %common.att;
                       %xmlspace.att;>
  
      <!-- Note Paragraph (normally shown encapsulated) -->
      <!ELEMENT note (%content.mix;)*>
      <!ATTLIST note %common.att;>
  
      <!-- Fixme Paragraph (normally not shown) -->
      <!ELEMENT fixme (%content.mix;)*>
      <!-- the "author" attribute should match the "key" attribute of the
           <author> element -->
      <!ATTLIST fixme author CDATA #REQUIRED
                      %common.att;>
  
      <!-- ==================================================== -->
      <!-- Tables -->
      <!-- ==================================================== -->
  
      <!-- Attributes that indicate the spanning of the table cell -->
      <!ENTITY % cell.span 
          'colspan CDATA "1"
           rowspan CDATA "1"'>
  
      <!-- Table element -->
      <!ELEMENT table (caption?, tr+)>
      <!ATTLIST table %common.att;>
  
          <!-- The table title -->
          <!ELEMENT caption (%content.mix;)*>
          <!ATTLIST caption %common.att;>
  
          <!-- The table row element -->
          <!ELEMENT tr (th|td)+>
          <!ATTLIST tr %common.att;>
  
              <!-- The table row header element -->
              <!ELEMENT th (%content.mix;)*>
              <!ATTLIST th %common.att;
                           %cell.span;>
  
              <!-- The table row description element -->
              <!ELEMENT td (%content.mix;)*>
              <!ATTLIST td %common.att;
                           %cell.span;>
  
      <!-- ==================================================== -->
      <!-- Lists -->
      <!-- ==================================================== -->
  
      <!-- Unordered list (typically bulleted) -->
      <!ELEMENT ul (li|%lists;)+>
      <!--    spacing attribute:
              Use "normal" to get normal vertical spacing for items;
              use "compact" to get less spacing.  The default is dependent
              on the stylesheet. -->
      <!ATTLIST ul
              %common.att;
              spacing         (normal|compact)        #IMPLIED>
  
      <!-- Ordered list (typically numbered) -->
      <!ELEMENT ol (li|%lists;)+>
      <!--    spacing attribute:
              Use "normal" to get normal vertical spacing for items;
              use "compact" to get less spacing.  The default is dependent
              on the stylesheet. -->
      <!ATTLIST ol
              %common.att;
              spacing         (normal|compact)        #IMPLIED>
  
      <!-- Simple list (typically with no mark) -->
      <!ELEMENT sl (li|%lists;)+>
      <!ATTLIST sl %common.att;>
  
          <!-- List item -->
          <!ELEMENT li (%content.mix;|%lists;)*>
          <!ATTLIST li %common.att;>
  
      <!-- Definition list (typically two-column) -->
      <!ELEMENT dl (dt,dd)+>
      <!ATTLIST dl %common.att;>
  
          <!-- Definition term -->
          <!ELEMENT dt (%content.mix;)*>
          <!ATTLIST dt %common.att;>
  
          <!-- Definition description -->
          <!ELEMENT dd (%content.mix;)*>
          <!ATTLIST dd %common.att;>
  
      <!-- ==================================================== -->
      <!-- Special Blocks -->
      <!-- ==================================================== -->
  
      <!-- Image Block (typically a separated and centered image) -->
      <!-- FIXME (SM): should we have the notion of soft links even here
           for inlined objects? -->
      <!ELEMENT figure EMPTY>
      <!ATTLIST figure src    CDATA  #REQUIRED
                       alt    CDATA  #REQUIRED
                       height CDATA  #IMPLIED
                       width  CDATA  #IMPLIED
                       usemap CDATA  #IMPLIED
                       ismap  (ismap) #IMPLIED
                       %common.att;>
  
  
  
  
  
  <!-- =============================================================== -->
  <!-- Document -->
  <!-- =============================================================== -->
  
  <!ELEMENT document (header?, body, footer?)>
  <!ATTLIST document %common.att;>
  
      <!-- ==================================================== -->
      <!-- Header -->
      <!-- ==================================================== -->
  
      <!ENTITY % local.headers "">
  
      <!ELEMENT header (title, subtitle?, version?, type?, authors,
                        notice*, abstract? %local.headers;)>
      <!ATTLIST header %common.att;>
  
      <!ELEMENT title (%text;)>
      <!ATTLIST title %common.att;>
  
      <!ELEMENT subtitle (%text;)>
      <!ATTLIST subtitle %common.att;>
  
      <!ELEMENT version (%text;)>
      <!ATTLIST version %common.att;>
  
      <!ELEMENT type (%text;)>
      <!ATTLIST type %common.att;>
  
      <!ELEMENT authors (person+)>
      <!ATTLIST authors %common.att;>
  
      <!ELEMENT notice (%content.mix;)*>
      <!ATTLIST notice %common.att;>
  
      <!ELEMENT abstract (%content.mix;)*>
      <!ATTLIST abstract %common.att;>
  
      <!-- ==================================================== -->
      <!-- Body -->
      <!-- ==================================================== -->
  
      <!ENTITY % local.sections "">
  
      <!ENTITY % sections "s1|anchor %local.sections;">
  
      <!ELEMENT body (%sections;)+>
      <!ATTLIST body %common.att;>
  
          <!ELEMENT s1 (s2|%blocks;)*>
          <!ATTLIST s1 %title.att; %common.att;>
  
              <!ELEMENT s2 (s3|%blocks;)*>
              <!ATTLIST s2 %title.att; %common.att;>
  
                  <!ELEMENT s3 (s4|%blocks;)*>
                  <!ATTLIST s3 %title.att; %common.att;>
  
                      <!ELEMENT s4 (%blocks;)*>
                      <!ATTLIST s4 %title.att; %common.att;>
  
      <!-- ==================================================== -->
      <!-- Footer -->
      <!-- ==================================================== -->
  
      <!ENTITY % local.footers "">
  
      <!ELEMENT footer (legal %local.footers;)>
  
          <!ELEMENT legal (%content.mix;)*>
          <!ATTLIST legal %common.att;>
  
  <!-- =============================================================== -->
  <!-- End of DTD -->
  <!-- =============================================================== -->
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/dtd/faq-v10.dtd
  
  Index: faq-v10.dtd
  ===================================================================
  <!-- ===================================================================
       
       Apache FAQ DTD (Version 1.0)
  
  PURPOSE:
    This DTD was developed to create a simple yet powerful document 
    type for software FAQ's for use with the Apache projects.  
    It is an XML-compliant DTD and it's maintained by the Apache XML 
    project.
  
  TYPICAL INVOCATION:
  
    <!DOCTYPE document PUBLIC
         "-//APACHE//DTD FAQ Vx.yz//EN"
         "http://xml.apache.org/DTD/faq-vxyz.dtd">
  
    where 
    
      x := major version
      y := minor version
      z := status identifier (optional)
        
  NOTES:  
    FAQs represent a powerful knowledge base and a very good way of solving
    common user problems reducing messages on mail lists and reducing the effort
    required for software installation and usage. Thid DTD want to be a common
    format for FAQ interchange to allow FAQ-O-Matic-type workgroup services to 
    be published in other formats as well as enhancing data interchange.
    
  AUTHORS:
    Stefano Mazzocchi <st...@apache.org>
    
  FIXME:
  
  CHANGE HISTORY:
    19991129 Initial version. (SM)
      
  COPYRIGHT:
    Copyright (c) @year@ The Apache Software Foundation.
    
    Permission to copy in any form is granted provided this notice is 
    included in all copies. Permission to redistribute is granted 
    provided this file is distributed untouched in all its parts and 
    included files.
    
  ==================================================================== -->
  
  <!-- =============================================================== -->
  <!-- Extend the Documentation DTD -->
  <!-- =============================================================== -->
  
  <!-- FIXME (SM): this is hardcoding. Find a better way of doing this
       possibly using public identifiers -->
  <!ENTITY % document-dtd SYSTEM "document-v10.dtd">
  %document-dtd;
  
  
  <!-- =============================================================== -->
  <!-- Document Type Definition -->
  <!-- =============================================================== -->
  
  <!ELEMENT faqs (authors?, faq)+>
  <!ATTLIST faqs %common.att; 
                 %title.att;>
  
      <!ELEMENT faq (question, answer)>
      <!ATTLIST faq %common.att;>
      
          <!ELEMENT question (%content.mix;)*>
          <!ATTLIST question %common.att;>
              
          <!ELEMENT answer (%blocks;)*>
          <!ATTLIST answer author IDREF #IMPLIED>
  
  <!-- =============================================================== -->
  <!-- End of DTD -->
  <!-- =============================================================== -->
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/dtd/specification-v10.dtd
  
  Index: specification-v10.dtd
  ===================================================================
  <!-- ===================================================================
       
       Apache Specification DTD (Version 1.0)
  
  PURPOSE:
    This DTD was developed to create a simple yet powerful document 
    type for software specifications for use with the Apache projects.  
    It is an XML-compliant DTD and it's maintained by the Apache XML 
    project.
  
  TYPICAL INVOCATION:
  
    <!DOCTYPE document PUBLIC
         "-//APACHE//DTD Specification Vx.yz//EN"
         "http://xml.apache.org/DTD/specification-vxyz.dtd">
  
    where 
    
      x := major version
      y := minor version
      z := status identifier (optional)
        
  NOTES:  
  
  AUTHORS:
    Stefano Mazzocchi <st...@apache.org>
    
  FIXME:
  
  CHANGE HISTORY:
    19991129 Initial version. (SM)
      
  COPYRIGHT:
    Copyright (c) @year@ The Apache Software Foundation.
    
    Permission to copy in any form is granted provided this notice is 
    included in all copies. Permission to redistribute is granted 
    provided this file is distributed untouched in all its parts and 
    included files.
    
  ==================================================================== -->
  
  <!-- =============================================================== -->
  <!-- Extend the Documentation DTD -->
  <!-- =============================================================== -->
  
  <!-- extend the local.xxx entities -->
  <!ENTITY % local.lists "|bl">
  
  <!-- FIXME (SM): this is hardcoding. Find a better way of doing this
       possibly using public identifiers -->
  <!ENTITY % document-dtd SYSTEM "document-v10.dtd">
  %document-dtd;
  
  <!-- =============================================================== -->
  <!-- Document Type Definition -->
  <!-- =============================================================== -->
  
  <!ELEMENT specification (header?, body, appendices?, footer?)>
  <!ATTLIST specification %common.att;>
  
      <!ELEMENT appendices (%sections;)+>
      <!ATTLIST appendices %common.att;>
  
  <!-- =============================================================== -->
  <!-- Bibliography List -->
  <!-- =============================================================== -->
  
      <!-- Bibliography list -->
      <!ELEMENT bl (bi)+>
      <!ATTLIST bl %common.att;>
  
          <!-- Book item -->
          <!ELEMENT bi EMPTY>
          <!ATTLIST bi %common.att;
                       %name.att;
                       %title.att;
                       %xlink-simple.att;
                       %xlink-user-new.att;
                       authors CDATA #REQUIRED
                       date    CDATA #IMPLIED>
  
  <!-- =============================================================== -->
  <!-- End of DTD -->
  <!-- =============================================================== -->
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/dtd/todo-v10.dtd
  
  Index: todo-v10.dtd
  ===================================================================
  <!-- ===================================================================
       
       Apache Todos DTD (Version 1.0)
  
  PURPOSE:
    This DTD was developed to create a simple yet powerful document 
    type for software development todo lists for use with the Apache projects.  
    It is an XML-compliant DTD and it's maintained by the Apache XML 
    project.
  
  TYPICAL INVOCATION:
  
    <!DOCTYPE document PUBLIC
         "-//APACHE//DTD Todo Vx.yz//EN"
         "http://xml.apache.org/DTD/todo-vxyz.dtd">
  
    where 
    
      x := major version
      y := minor version
      z := status identifier (optional)
        
  NOTES:  
    It is important, expecially in open developped software projects, to keep
    track of software changes that need to be done, planned features, development
    assignment, etc. in order to allow better work parallelization and create
    an entry point for people that want to help. This DTD wants to provide
    a solid foundation to provide such information and to allow it to be
    published as well as distributed in a common format.
  
  AUTHORS:
    Stefano Mazzocchi <st...@apache.org>
    
  FIXME:
    - do we need anymore working contexts? (SM)
  
  CHANGE HISTORY:
    19991129 Initial version. (SM)
    19991225 Added actions element for better structure (SM)
      
  COPYRIGHT:
    Copyright (c) @year@ The Apache Software Foundation.
    
    Permission to copy in any form is granted provided this notice is 
    included in all copies. Permission to redistribute is granted 
    provided this file is distributed untouched in all its parts and 
    included files.
    
  ==================================================================== -->
  
  <!-- =============================================================== -->
  <!-- Extend the Documentation DTD -->
  <!-- =============================================================== -->
  
  <!-- FIXME (SM): this is hardcoding. Find a better way of doing this
       possibly using public identifiers -->
  <!ENTITY % document-dtd SYSTEM "document-v10.dtd">
  %document-dtd;
  
  <!-- =============================================================== -->
  <!-- Common entities -->
  <!-- =============================================================== -->
  
  <!ENTITY % priorities "showstopper|high|medium|low|wish|dream">
  
  <!ENTITY % contexts "build|docs|code|admin|design">
  
  <!-- =============================================================== -->
  <!-- Document Type Definition -->
  <!-- =============================================================== -->
  
  <!ELEMENT todo (devs, actions*)>
  <!ATTLIST todo %common.att; 
                 %title.att;>
  
      <!ELEMENT devs (person+)>
      <!ATTLIST devs %common.att;>
  
      <!ELEMENT actions (action+)>
      <!ATTLIST actions %common.att;
                       priority     (%priorities;)  #IMPLIED>
  
          <!ELEMENT action (%content.mix;)*>
          <!ATTLIST action %common.att;
                           assigned-to  IDREF           #IMPLIED
                           context      (%contexts;)    #REQUIRED>
      
  <!-- =============================================================== -->
  <!-- End of DTD -->
  <!-- =============================================================== -->
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/images/build.gif
  
  	<<Binary file>>
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/images/code.gif
  
  	<<Binary file>>
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/images/design.gif
  
  	<<Binary file>>
  
  
  1.1                  jakarta-avalon-cornerstone/apps/httpproxy/src/xdocs/images/update.gif
  
  	<<Binary file>>
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>