<?xml version="1.0"?>
<!DOCTYPE document [
  <!ENTITY project SYSTEM "project.xml">
]>
<document url="fs-default.html">

  &project;

  <properties>
    <author email="craigmcc@apache.org">Craig McClanahan</author>
    <title>Default Servlet</title>
    <revision>$Id$</revision>
  </properties>

<body>


<section name="Overview">


  <subsection name="Introduction">

    <p>The purpose of the <strong>Default Servlet</strong> is to serve
    static resources of a web application in response to client requests.
    As the name implies, it is generally configured as the "default"
    servlet for a web application, by being mapped to a URL pattern "/".</p>

  </subsection>


  <subsection name="External Specifications">

    <p>The following external specifications have provisions which
    partially define the correct behavior of the default servlet:</p>
    <ul>
    <li><a href="http://java.sun.com/products/servlet/download.html">
        Servlet Specification</a> (Version 2.3 PFD2)</li>
    <li><a href="http://www.rfc-editor.org/rfc/rfc2046.txt">Multipurpose
        Internet Mail Extensions (MIME) Part Two: Media Types</a></li>
    <li><a href="http://www.rfc-editor.org/rfc/rfc2616.txt">Hypertext
        Transfer Protocol -- HTTP/1.1</a></li>
    </ul>

  </subsection>


  <subsection name="Implementation Requirements">

    <p>The implementation of this functionality shall conform to the
    following requirements:</p>
    <ul>
    <li>Must be implemented as a servlet.</li>
    <li>Must support configurable parameters for debugging detail level,
        input buffer size, output buffer size, whether or not to produce
        directory listings when no welcome file is present, and whether or not
        modifications are supported via DELETE and PUT.</li>
    <li>Log debugging and operational messages (suitably internationalized)
        via the <code>getServletContext().log()</code> method.</li>
    </ul>

  </subsection>


</section>


<section name="Dependencies">


  <subsection name="Environmental Dependencies">

    <p>The following environmental dependencies must be met in order for
    the default servlet to operate correctly:</p>
    <ul>
    <li>The default servlet must be registered in the application deployment
        descriptor (or the default deployment descriptor in file
        <code>$CATALINA_HOME/conf/web.xml</code>) using a "default servlet"
        servlet mapping, signified by URL pattern "/".</li>
    </ul>

  </subsection>


  <subsection name="Container Dependencies">

    <p>Correct operation of the default servlet depends on the following
    specific features of the surrounding container:</p>
    <ul>
    <li>The container shall provide a servlet context attribute that
        lists the welcome file names that have been defined for this
        web application.</li>
    <li>The container shall provide a servlet context attribute that
        contains a <code>javax.naming.directory.DirContext</code>
        implementation representing the static resources of this
        web application.</li>
    </ul>

  </subsection>


</section>


<section name="Functionality">


  <subsection name="Initialization Functionality">

    <p>The following processing must be performed when the <code>init()</code>
    method of the invoker servlet is called:</p>
    <ul>
    <li>Process and sanity check configuration parameters.</li>
    </ul>

  </subsection>


  <subsection name="Per-Request Functionality">


    <p>For all HTTP request methods, the resource path is determined from
    the path information provided to this request, either as request attribute
    <code>javax.servlet.include.path_info</code> (for a request dispatcher
    access to a static resource) or by calling
    <code>request.getPathInfo()</code> directly.</p>

    <p>On each HTTP DELETE request processed by this servlet, the following
    processing shall be performed:</p>
    <ul>
    <li>If modifications to the static resources are not allowed (set by a
        configuration parameter), return HTTP status 403 (forbidden).</li>
    <li>If an attempt is made to delete a resource from <code>/META-INF</code>
        or <code>/WEB-INF</code>, return HTTP status 403 (forbidden).</li>
    <li>If the requested resource does not exist, return HTTP status 404
        (not found)</li>
    <li>Unbind the resource from the directory context containing the
        static resources for this web application.  If successful, return
        HTTP status 204 (no content).  Otherwise, return HTTP status 405
        (method not allowed).</li>
    </ul>


    <p>On each HTTP GET request processed by this servlet, the following
    processing shall be performed:</p>
    <ul>
    <li>If the request is for a resource under <code>/META-INF</code> or
        <code>/WEB-INF</code>, return HTTP status 404 (not found).</li>
    <li>If the requested resource does not exist, return HTTP status 404
        (not found).</li>
    <li>If the requested resource is not a directory, but the resource
        path ends in "/" or "\", return HTTP status 404 (not found).</li>
    <li>If the requested resource is a directory:
        <ul>
        <li>If the request path does not end with "/", redirect to a
            corresponding path with "/" appended so that relative references
            in welcome files are resolved correctly.</li>
        <li>If one of the specified welcome files exists, redirect to the
            path for that welcome file so that it will be served explicitly.
            </li>
        </ul></li>
    <li>If the request being processed contains an <code>If-Range</code>
        header, perform the processing described in the HTTP/1.1 specification
        to determine whether the client's information is up to date.</li>
    <li>Determine the content type of the response, by looking up the
        corresponding MIME type in our servlet context.</li>
    <li>If the requested resource is a directory:
        <ul>
        <li>If directory listings are suppressed, return HTTP status 404
            (not found).</li>
        <li>Set the content type to <code>text/html</code>.</li>
        </ul></li>
    <li>Determine the range(s) to be returned, based on the existence of
        any <code>If-Range</code> and <code>Range</code> headers.</li>
    <li>If the requested resource is a directory, include an <code>ETag</code>
        header in the response, with the value calculated based on the content
        of the directory.</li>
    <li>Include a <code>Last-Modified</code> header in the response documenting
        the date/time that the resource was last modified.</li>
    <li>Unless we are processing a HEAD request, include the appropriate
        content (or content ranges) in the response.</li>
    </ul>

    <p>On each HTTP HEAD request processed by this servlet, the following
    processing shall be performed:</p>
    <ul>
    <li>Processed identically to an HTTP GET request, except that the data
        content is not transmitted after the headers.</li>
    </ul>

    <p>On each HTTP POST request processed by this servlet, the following
    processing shall be performed:</p>
    <ul>
    <li>Processed identically to an HTTP GET request.</li>
    </ul>


    <p>On each HTTP PUT request processed by this servlet, the following
    processing shall be perfomred:</p>
    <ul>
    <li>If modifications to the static resources are not allowed (set by a
        configuration parameter), return HTTP status 403 (forbidden).</li>
    <li>If an attempt is made to delete a resource from <code>/META-INF</code>
        or <code>/WEB-INF</code>, return HTTP status 403 (forbidden).</li>
    <li>Create a new resource from the body of this request.</li>
    <li>Bind or rebind the specified path to the new resource (depending on
        whether it currently exists or not).  Return HTTP status as follows:
        <ul>
        <li>If binding was unsuccessful, return HTTP status 409 (conflict).
            </li>
        <li>If binding was successful and the resource did not previously
            exist, return HTTP status 201 (created).</li>
        <li>If binding was successful and the resource previously existed,
            return HTTP status 204 (no content).</li>
        </ul></li>
    </ul>

  </subsection>


  <subsection name="Finalization Functionality">

    <p>No specific processing is required when the <code>destroy()</code>
    method is called:</p>

  </subsection>


</section>


<section name="Testable Assertions">

  <p>In addition the the assertions implied by the functionality requirements
  listed above, the following additional assertions shall be tested to
  validate the behavior of the invoker servlet:</p>
  <ul>
  <li>Requests for resources that do not exist in the web application must
      return HTTP status 404 (not found).</li>
  <li>The default servlet must operate identically for web applications that
      are run out of a WAR file directly, or from an unpacked directory
      structure.</li>
  <li>If the web application is running out of an unpacked directory
      structure, the default servlet must recognize cases where the resource
      has been updated through external means.</li>
  </ul>

</section>


</body>

</document>
