DefaultServlet (Apache Tomcat 10.1.16 API Documentation)
Description: declaration: package: org.apache.catalina.servlets, class: DefaultServlet

Package org.apache.catalina.servlets

# Class DefaultServlet

java.lang.Object
jakarta.servlet.GenericServlet
jakarta.servlet.http.HttpServlet
org.apache.catalina.servlets.DefaultServlet

All Implemented Interfaces:
  `Servlet`, `ServletConfig`, `Serializable`

Direct Known Subclasses:
  `WebdavServlet`

public class DefaultServlet extends HttpServlet

The default resource-serving servlet for most web applications, used to serve static resources such as HTML pages and images.

This servlet is intended to be mapped to / e.g.:

       <servlet-mapping>
           <servlet-name>default</servlet-name>
           <url-pattern>/</url-pattern>
       </servlet-mapping>

It can be mapped to sub-paths, however in all cases resources are served from the web application resource root using the full path from the root of the web application context.
e.g. given a web application structure:

     /context
       /images
         tomcat2.jpg
       /static
         /images
           tomcat.jpg

... and a servlet mapping that maps only `/static/*` to the default servlet:

       <servlet-mapping>
           <servlet-name>default</servlet-name>
           <url-pattern>/static/*</url-pattern>
       </servlet-mapping>

Then a request to `/context/static/images/tomcat.jpg` will succeed while a request to `/context/images/tomcat2.jpg` will fail.

Author:
  Craig R. McClanahan, Remy Maucherat
See Also:
  - Serialized Form

- ## Nested Class Summary

  Nested Classes
  Modifier and Type
  Class
  Description
  `protected static class`
  `DefaultServlet.CompressionFormat`

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected static final int`
  `BUFFER_SIZE`
  Size of file transfer buffer in bytes.
  `protected DefaultServlet.CompressionFormat[]`
  `compressionFormats`
  List of compression formats to serve and their preference order.
  `protected String`
  `contextXsltFile`
  Allow customized directory listing per context.
  `protected int`
  `debug`
  The debugging detail level for this servlet.
  `protected String`
  `fileEncoding`
  File encoding to be used when reading static files.
  `protected static final Ranges`
  `FULL`
  Full range marker.
  `protected String`
  `globalXsltFile`
  Allow customized directory listing per instance.
  `protected int`
  `input`
  The input buffer size to use when serving resources.
  `protected boolean`
  `listings`
  Should we generate directory listings?
  `protected String`
  `localXsltFile`
  Allow customized directory listing per directory.
  `protected static final String`
  `mimeSeparation`
  MIME multipart separation string
  `protected int`
  `output`
  The output buffer size to use when serving resources.
  `protected String`
  `readmeFile`
  Allow a readme file to be included.
  `protected boolean`
  `readOnly`
  Read only flag.
  `protected WebResourceRoot`
  `resources`
  The complete set of web application resources
  `protected int`
  `sendfileSize`
  Minimum size for sendfile usage in bytes.
  `protected boolean`
  `showServerInfo`
  Flag to determine if server information is presented.
  `protected static final StringManager`
  `sm`
  The string manager for this package.
  `protected boolean`
  `sortListings`
  Flag to determine if resources should be sorted.
  `protected org.apache.catalina.servlets.DefaultServlet.SortManager`
  `sortManager`
  The sorting manager for sorting files and directories.
  `protected boolean`
  `useAcceptRanges`
  Should the Accept-Ranges: bytes header be send with static resources?

  ### Fields inherited from class jakarta.servlet.http.HttpServlet

  `LEGACY_DO_HEAD`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `DefaultServlet()`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `protected boolean`
  `checkIfHeaders(HttpServletRequest request, HttpServletResponse response, WebResource resource)`
  Check if the conditions specified in the optional If headers are satisfied.
  `protected boolean`
  `checkIfMatch(HttpServletRequest request, HttpServletResponse response, WebResource resource)`
  Check if the if-match condition is satisfied.
  `protected boolean`
  `checkIfModifiedSince(HttpServletRequest request, HttpServletResponse response, WebResource resource)`
  Check if the if-modified-since condition is satisfied.
  `protected boolean`
  `checkIfNoneMatch(HttpServletRequest request, HttpServletResponse response, WebResource resource)`
  Check if the if-none-match condition is satisfied.
  `protected boolean`
  `checkIfUnmodifiedSince(HttpServletRequest request, HttpServletResponse response, WebResource resource)`
  Check if the if-unmodified-since condition is satisfied.
  `protected boolean`
  `checkSendfile(HttpServletRequest request, HttpServletResponse response, WebResource resource, long length, Ranges.Entry range)`
  Check if sendfile can be used.
  `protected void`
  `copy(InputStream is, ServletOutputStream ostream)`
  Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
  `protected void`
  `copy(InputStream is, PrintWriter writer, String encoding)`
  Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
  `protected void`
  `copy(WebResource resource, long length, ServletOutputStream ostream, Ranges.Entry range)`
  Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
  `protected void`
  `copy(WebResource resource, long length, ServletOutputStream ostream, Ranges ranges, String contentType)`
  Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
  `protected IOException`
  `copyRange(InputStream istream, ServletOutputStream ostream)`
  Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
  `protected IOException`
  `copyRange(InputStream istream, ServletOutputStream ostream, long start, long end)`
  Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
  `protected IOException`
  `copyRange(Reader reader, PrintWriter writer)`
  Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
  `void`
  `destroy()`
  Finalize this servlet.
  `protected String`
  `determineMethodsAllowed(HttpServletRequest req)`
  `protected void`
  `doDelete(HttpServletRequest req, HttpServletResponse resp)`
  Process a DELETE request for the specified resource.
  `protected void`
  `doGet(HttpServletRequest request, HttpServletResponse response)`
  Process a GET request for the specified resource.
  `protected void`
  `doHead(HttpServletRequest request, HttpServletResponse response)`
  Process a HEAD request for the specified resource.
  `protected void`
  `doOptions(HttpServletRequest req, HttpServletResponse resp)`
  Override default implementation to ensure that TRACE is correctly handled.
  `protected void`
  `doPost(HttpServletRequest request, HttpServletResponse response)`
  Process a POST request for the specified resource.
  `protected void`
  `doPut(HttpServletRequest req, HttpServletResponse resp)`
  Process a PUT request for the specified resource.
  `protected File`
  `executePartialPut(HttpServletRequest req, ContentRange range, String path)`
  Handle a partial PUT.
  `protected Source`
  `findXsltSource(WebResource directory)`
  Return a Source for the xsl template (if possible).
  `protected String`
  `generateETag(WebResource resource)`
  Provides the entity tag (the ETag header) for the given resource.
  `protected String`
  `getPathPrefix(HttpServletRequest request)`
  Determines the appropriate path to prepend resources with when generating directory listings.
  `protected String`
  `getReadme(WebResource directory, String encoding)`
  Get the readme file as a string.
  `protected String`
  `getRelativePath(HttpServletRequest request)`
  Return the relative path associated with this servlet.
  `protected String`
  `getRelativePath(HttpServletRequest request, boolean allowEmptyPath)`
  `void`
  `init()`
  Initialize this servlet.
  `protected ContentRange`
  `parseContentRange(HttpServletRequest request, HttpServletResponse response)`
  Parse the content-range header.
  `protected Ranges`
  `parseRange(HttpServletRequest request, HttpServletResponse response, WebResource resource)`
  Parse the range header.
  `protected InputStream`
  `render(HttpServletRequest request, String contextPath, WebResource resource, String encoding)`
  Decide which way to render.
  `protected InputStream`
  `renderHtml(HttpServletRequest request, String contextPath, WebResource resource, String encoding)`
  Return an InputStream to an HTML representation of the contents of this directory.
  `protected String`
  `renderSize(long size)`
  Render the specified file size (in bytes).
  `protected InputStream`
  `renderXml(HttpServletRequest request, String contextPath, WebResource resource, Source xsltSource, String encoding)`
  Return an InputStream to an XML representation of the contents this directory.
  `protected String`
  `rewriteUrl(String path)`
  URL rewriter.
  `protected void`
  `sendNotAllowed(HttpServletRequest req, HttpServletResponse resp)`
  `protected void`
  `serveResource(HttpServletRequest request, HttpServletResponse response, boolean content, String inputEncoding)`
  Serve the specified resource, optionally including the data content.
  `protected void`
  `service(HttpServletRequest req, HttpServletResponse resp)`
  Receives standard HTTP requests from the public `service` method and dispatches them to the `do`Method methods defined in this class.

  ### Methods inherited from class jakarta.servlet.http.HttpServlet

  `doTrace, getLastModified, init, service`

  ### Methods inherited from class jakarta.servlet.GenericServlet

  `getInitParameter, getInitParameterNames, getServletConfig, getServletContext, getServletInfo, getServletName, log, log`

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### sm

    protected static final StringManager sm
    The string manager for this package.

  - ### FULL

    protected static final Ranges FULL
    Full range marker.

  - ### mimeSeparation

    protected static final String mimeSeparation
    MIME multipart separation string
    See Also:
      - Constant Field Values

  - ### BUFFER_SIZE

    protected static final int BUFFER_SIZE
    Size of file transfer buffer in bytes.
    See Also:
      - Constant Field Values

  - ### debug

    protected int debug
    The debugging detail level for this servlet.

  - ### input

    protected int input
    The input buffer size to use when serving resources.

  - ### listings

    protected boolean listings
    Should we generate directory listings?

  - ### readOnly

    protected boolean readOnly
    Read only flag. By default, it's set to true.

  - ### compressionFormats

    protected DefaultServlet.CompressionFormat[] compressionFormats
    List of compression formats to serve and their preference order.

  - ### output

    protected int output
    The output buffer size to use when serving resources.

  - ### localXsltFile

    protected String localXsltFile
    Allow customized directory listing per directory.

  - ### contextXsltFile

    protected String contextXsltFile
    Allow customized directory listing per context.

  - ### globalXsltFile

    protected String globalXsltFile
    Allow customized directory listing per instance.

  - ### readmeFile

    protected String readmeFile
    Allow a readme file to be included.

  - ### resources

    protected transient WebResourceRoot resources
    The complete set of web application resources

  - ### fileEncoding

    protected String fileEncoding
    File encoding to be used when reading static files. If none is specified the platform default is used.

  - ### sendfileSize

    protected int sendfileSize
    Minimum size for sendfile usage in bytes.

  - ### useAcceptRanges

    protected boolean useAcceptRanges
    Should the Accept-Ranges: bytes header be send with static resources?

  - ### showServerInfo

    protected boolean showServerInfo
    Flag to determine if server information is presented.

  - ### sortListings

    protected boolean sortListings
    Flag to determine if resources should be sorted.

  - ### sortManager

    protected transient org.apache.catalina.servlets.DefaultServlet.SortManager sortManager
    The sorting manager for sorting files and directories.

- ## Constructor Details

  - ### DefaultServlet

    public DefaultServlet()

- ## Method Details

  - ### destroy

    public void destroy()
    Finalize this servlet.
    Specified by:
      `destroy` in interface `Servlet`
    Overrides:
      `destroy` in class `GenericServlet`

  - ### init

    public void init() throws ServletException
    Initialize this servlet.
    Overrides:
      `init` in class `GenericServlet`
    Throws:
      `ServletException` - if an exception occurs that interrupts the servlet's normal operation

  - ### getRelativePath

    protected String getRelativePath(HttpServletRequest request)
    Return the relative path associated with this servlet.
    Parameters:
      `request` - The servlet request we are processing
    Returns:
      the relative path

  - ### getRelativePath

    protected String getRelativePath(HttpServletRequest request, boolean allowEmptyPath)

  - ### getPathPrefix

    protected String getPathPrefix(HttpServletRequest request)
    Determines the appropriate path to prepend resources with when generating directory listings. Depending on the behaviour of `getRelativePath(HttpServletRequest)` this will change.
    Parameters:
      `request` - the request to determine the path for
    Returns:
      the prefix to apply to all resources in the listing.

  - ### service

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    Description copied from class: `jakarta.servlet.http.HttpServlet`
    Receives standard HTTP requests from the public `service` method and dispatches them to the `do`Method methods defined in this class. This method is an HTTP-specific version of the `Servlet.service(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)` method. There's no need to override this method.
    Overrides:
      `service` in class `HttpServlet`
    Parameters:
      `req` - the `HttpServletRequest` object that contains the request the client made of the servlet
      `resp` - the `HttpServletResponse` object that contains the response the servlet returns to the client
    Throws:
      `ServletException` - if the HTTP request cannot be handled
      `IOException` - if an input or output error occurs while the servlet is handling the HTTP request
    See Also:
      - `Servlet.service(jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse)`

  - ### doGet

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    Process a GET request for the specified resource.
    Overrides:
      `doGet` in class `HttpServlet`
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
    Throws:
      `IOException` - if an input/output error occurs
      `ServletException` - if a servlet-specified error occurs
    See Also:
      - `ServletResponse.setContentType(java.lang.String)`

  - ### doHead

    protected void doHead(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    Process a HEAD request for the specified resource.
    Overrides:
      `doHead` in class `HttpServlet`
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
    Throws:
      `IOException` - if an input/output error occurs
      `ServletException` - if a servlet-specified error occurs

  - ### doOptions

    protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    Override default implementation to ensure that TRACE is correctly handled.
    Overrides:
      `doOptions` in class `HttpServlet`
    Parameters:
      `req` - the `HttpServletRequest` object that contains the request the client made of the servlet
      `resp` - the `HttpServletResponse` object that contains the response the servlet returns to the client
    Throws:
      `IOException` - if an input or output error occurs while the servlet is handling the OPTIONS request
      `ServletException` - if the request for the OPTIONS cannot be handled

  - ### determineMethodsAllowed

    protected String determineMethodsAllowed(HttpServletRequest req)

  - ### sendNotAllowed

    protected void sendNotAllowed(HttpServletRequest req, HttpServletResponse resp) throws IOException
    Throws:
      `IOException`

  - ### doPost

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    Process a POST request for the specified resource.
    Overrides:
      `doPost` in class `HttpServlet`
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
    Throws:
      `IOException` - if an input/output error occurs
      `ServletException` - if a servlet-specified error occurs
    See Also:
      - `ServletOutputStream`
      - `ServletResponse.setContentType(java.lang.String)`

  - ### doPut

    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    Process a PUT request for the specified resource.
    Overrides:
      `doPut` in class `HttpServlet`
    Parameters:
      `req` - The servlet request we are processing
      `resp` - The servlet response we are creating
    Throws:
      `IOException` - if an input/output error occurs
      `ServletException` - if a servlet-specified error occurs

  - ### executePartialPut

    protected File executePartialPut(HttpServletRequest req, ContentRange range, String path) throws IOException
    Handle a partial PUT. New content specified in request is appended to existing content in oldRevisionContent (if present). This code does not support simultaneous partial updates to the same resource.
    Parameters:
      `req` - The Servlet request
      `range` - The range that will be written
      `path` - The path
    Returns:
      the associated file object
    Throws:
      `IOException` - an IO error occurred

  - ### doDelete

    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    Process a DELETE request for the specified resource.
    Overrides:
      `doDelete` in class `HttpServlet`
    Parameters:
      `req` - The servlet request we are processing
      `resp` - The servlet response we are creating
    Throws:
      `IOException` - if an input/output error occurs
      `ServletException` - if a servlet-specified error occurs

  - ### checkIfHeaders

    protected boolean checkIfHeaders(HttpServletRequest request, HttpServletResponse response, WebResource resource) throws IOException
    Check if the conditions specified in the optional If headers are satisfied.
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
      `resource` - The resource
    Returns:
      `true` if the resource meets all the specified conditions, and `false` if any of the conditions is not satisfied, in which case request processing is stopped
    Throws:
      `IOException` - an IO error occurred

  - ### rewriteUrl

    protected String rewriteUrl(String path)
    URL rewriter.
    Parameters:
      `path` - Path which has to be rewritten
    Returns:
      the rewritten path

  - ### serveResource

    protected void serveResource(HttpServletRequest request, HttpServletResponse response, boolean content, String inputEncoding) throws IOException, ServletException
    Serve the specified resource, optionally including the data content.
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
      `content` - Should the content be included?
      `inputEncoding` - The encoding to use if it is necessary to access the source as characters rather than as bytes
    Throws:
      `IOException` - if an input/output error occurs
      `ServletException` - if a servlet-specified error occurs

  - ### parseContentRange

    protected ContentRange parseContentRange(HttpServletRequest request, HttpServletResponse response) throws IOException
    Parse the content-range header.
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
    Returns:
      the partial content-range, `null` if the content-range header was invalid or `#IGNORE` if there is no header to process
    Throws:
      `IOException` - an IO error occurred

  - ### parseRange

    protected Ranges parseRange(HttpServletRequest request, HttpServletResponse response, WebResource resource) throws IOException
    Parse the range header.
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
      `resource` - The resource
    Returns:
      a list of ranges, `null` if the range header was invalid or `#FULL` if the Range header should be ignored.
    Throws:
      `IOException` - an IO error occurred

  - ### render

    protected InputStream render(HttpServletRequest request, String contextPath, WebResource resource, String encoding) throws IOException, ServletException
    Decide which way to render. HTML or XML.
    Parameters:
      `request` - The HttpServletRequest being served
      `contextPath` - The path
      `resource` - The resource
      `encoding` - The encoding to use to process the readme (if any)
    Returns:
      the input stream with the rendered output
    Throws:
      `IOException` - an IO error occurred
      `ServletException` - rendering error

  - ### renderXml

    protected InputStream renderXml(HttpServletRequest request, String contextPath, WebResource resource, Source xsltSource, String encoding) throws IOException, ServletException
    Return an InputStream to an XML representation of the contents this directory.
    Parameters:
      `request` - The HttpServletRequest being served
      `contextPath` - Context path to which our internal paths are relative
      `resource` - The associated resource
      `xsltSource` - The XSL stylesheet
      `encoding` - The encoding to use to process the readme (if any)
    Returns:
      the XML data
    Throws:
      `IOException` - an IO error occurred
      `ServletException` - rendering error

  - ### renderHtml

    protected InputStream renderHtml(HttpServletRequest request, String contextPath, WebResource resource, String encoding) throws IOException
    Return an InputStream to an HTML representation of the contents of this directory.
    Parameters:
      `request` - The HttpServletRequest being served
      `contextPath` - Context path to which our internal paths are relative
      `resource` - The associated resource
      `encoding` - The encoding to use to process the readme (if any)
    Returns:
      the HTML data
    Throws:
      `IOException` - an IO error occurred

  - ### renderSize

    protected String renderSize(long size)
    Render the specified file size (in bytes).
    Parameters:
      `size` - File size (in bytes)
    Returns:
      the formatted size

  - ### getReadme

    protected String getReadme(WebResource directory, String encoding)
    Get the readme file as a string.
    Parameters:
      `directory` - The directory to search
      `encoding` - The readme encoding
    Returns:
      the readme for the specified directory

  - ### findXsltSource

    protected Source findXsltSource(WebResource directory) throws IOException
    Return a Source for the xsl template (if possible).
    Parameters:
      `directory` - The directory to search
    Returns:
      the source for the specified directory
    Throws:
      `IOException` - an IO error occurred

  - ### checkSendfile

    protected boolean checkSendfile(HttpServletRequest request, HttpServletResponse response, WebResource resource, long length, Ranges.Entry range)
    Check if sendfile can be used.
    Parameters:
      `request` - The Servlet request
      `response` - The Servlet response
      `resource` - The resource
      `length` - The length which will be written (will be used only if range is null)
      `range` - The range that will be written
    Returns:
      `true` if sendfile should be used (writing is then delegated to the endpoint)

  - ### checkIfMatch

    protected boolean checkIfMatch(HttpServletRequest request, HttpServletResponse response, WebResource resource) throws IOException
    Check if the if-match condition is satisfied.
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
      `resource` - The resource
    Returns:
      `true` if the resource meets the specified condition, and `false` if the condition is not satisfied, in which case request processing is stopped
    Throws:
      `IOException` - an IO error occurred

  - ### checkIfModifiedSince

    protected boolean checkIfModifiedSince(HttpServletRequest request, HttpServletResponse response, WebResource resource)
    Check if the if-modified-since condition is satisfied.
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
      `resource` - The resource
    Returns:
      `true` if the resource meets the specified condition, and `false` if the condition is not satisfied, in which case request processing is stopped

  - ### checkIfNoneMatch

    protected boolean checkIfNoneMatch(HttpServletRequest request, HttpServletResponse response, WebResource resource) throws IOException
    Check if the if-none-match condition is satisfied.
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
      `resource` - The resource
    Returns:
      `true` if the resource meets the specified condition, and `false` if the condition is not satisfied, in which case request processing is stopped
    Throws:
      `IOException` - an IO error occurred

  - ### checkIfUnmodifiedSince

    protected boolean checkIfUnmodifiedSince(HttpServletRequest request, HttpServletResponse response, WebResource resource) throws IOException
    Check if the if-unmodified-since condition is satisfied.
    Parameters:
      `request` - The servlet request we are processing
      `response` - The servlet response we are creating
      `resource` - The resource
    Returns:
      `true` if the resource meets the specified condition, and `false` if the condition is not satisfied, in which case request processing is stopped
    Throws:
      `IOException` - an IO error occurred

  - ### generateETag

    protected String generateETag(WebResource resource)
    Provides the entity tag (the ETag header) for the given resource. Intended to be over-ridden by custom DefaultServlet implementations that wish to use an alternative format for the entity tag.
    Parameters:
      `resource` - The resource for which an entity tag is required.
    Returns:
      The result of calling `WebResource.getETag()` on the given resource

  - ### copy

    protected void copy(InputStream is, ServletOutputStream ostream) throws IOException
    Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
    Parameters:
      `is` - The input stream to read the source resource from
      `ostream` - The output stream to write to
    Throws:
      `IOException` - if an input/output error occurs

  - ### copy

    protected void copy(InputStream is, PrintWriter writer, String encoding) throws IOException
    Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
    Parameters:
      `is` - The input stream to read the source resource from
      `writer` - The writer to write to
      `encoding` - The encoding to use when reading the source input stream
    Throws:
      `IOException` - if an input/output error occurs

  - ### copy

    protected void copy(WebResource resource, long length, ServletOutputStream ostream, Ranges.Entry range) throws IOException
    Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
    Parameters:
      `resource` - The source resource
      `length` - the resource length
      `ostream` - The output stream to write to
      `range` - Range the client wanted to retrieve
    Throws:
      `IOException` - if an input/output error occurs

  - ### copy

    protected void copy(WebResource resource, long length, ServletOutputStream ostream, Ranges ranges, String contentType) throws IOException
    Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
    Parameters:
      `resource` - The source resource
      `length` - the resource length
      `ostream` - The output stream to write to
      `ranges` - Enumeration of the ranges the client wanted to retrieve
      `contentType` - Content type of the resource
    Throws:
      `IOException` - if an input/output error occurs

  - ### copyRange

    protected IOException copyRange(InputStream istream, ServletOutputStream ostream)
    Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
    Parameters:
      `istream` - The input stream to read from
      `ostream` - The output stream to write to
    Returns:
      Exception which occurred during processing

  - ### copyRange

    protected IOException copyRange(Reader reader, PrintWriter writer)
    Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
    Parameters:
      `reader` - The reader to read from
      `writer` - The writer to write to
    Returns:
      Exception which occurred during processing

  - ### copyRange

    protected IOException copyRange(InputStream istream, ServletOutputStream ostream, long start, long end)
    Copy the contents of the specified input stream to the specified output stream, and ensure that both streams are closed before returning (even in the face of an exception).
    Parameters:
      `istream` - The input stream to read from
      `ostream` - The output stream to write to
      `start` - Start of the range which will be copied
      `end` - End of the range which will be copied
    Returns:
      Exception which occurred during processing