sunlabs.brazil.server

Class FileHandler

public class FileHandler extends Object implements Handler

Standard handler for fetching static files. This handler does URL to file conversion, file suffix to mime type lookup, delivery of index files where providing directory references, and redirection for missing slashes (/) at the end of directory requests.

The following configuration parameters are used:

root
property for document root (.) Since the document root is common to many handlers, if no root property is found with the supplied prefix, then the root property with the empty prefix ("") is used instead. This allows many handlers to share the common property.
default
The document to deliver if the URL ends in "/". (defaults to index.html.)
prefix
Only url's that start with this are allowed. defaults to "". The prefix is removed from the url before looking it up in the file system. So, if prefix is /foo then the the file [root]/foo/bar.html will be delivered in response to the url /bar.html.
mime
property for mime type For each file suffix .XX, the property mime.XX is used to determine the mime type. If no property exists (or its value is "unknown", the document will not be delivered.
mimePatterns
List of glob patterns that match file name suffixes for matching mime types. For example:
		mimePatterns=.x* .a?
		mime.x*=text/xml
		mime.a?=application/octet-stream
		
The types corrosponding to mime patterns are searched for in mimePattern order, first looking for prefix.mime.pattern then mime.pattern. If neither property exists, then the type is invalid.
getOnly
If defined, only "GET" requests will be processed. By default, all request types are handled. (Note: this is the inverse of the previous policy, defined by the undocumented "allow" parameter).

The FileHandler sets the following entries in the request properties as a side-effect:

fileName
The absolute path of the file that couldn't be found.
DirectoryName
If the URL specified is a directory name, its absolute path is placed here.
lastModified
The Time stamp of the last modified time

This handler supports a subset of the http range header of the form range bytes=[start]-[end], where start and end are byte positions in the file, starting at zero. A large or missing end value is treated as the end of the file. If a valid rangeheader is found, the appropriate content-range header is returned, along with the partial contents of the file.

Version: 2.8

Author: Stephen Uhler

Field Summary
static StringMIME
static StringROOT
StringurlPrefix
static StringUNKNOWN
Method Summary
static StringgetMimeType(String name, Properties props, String prefix)
Get the mime type based on the suffix of a String.
booleaninit(Server server, String prefix)
Initialize the file handler.
booleanrespond(Request request)
Find, read, and deliver via http the requested file.
static voidsendFile(Request request, File file, int code, String type)
Send a file as a response.
static voidsetModified(Properties props, long mod)
Set the "lastModified" request property.
static StringurlToPath(String url)
Helper function to convert an url into a pathname.

Field Detail

MIME

public static final String MIME

ROOT

public static final String ROOT

urlPrefix

public String urlPrefix

UNKNOWN

public static final String UNKNOWN

Method Detail

getMimeType

public static String getMimeType(String name, Properties props, String prefix)
Get the mime type based on the suffix of a String. The suffix (e.g. text after the last ".") is used to lookup the entry "prefix.mime.[suffix]" then "mime.[suffix]" in props. If neither entry is found, then mime glob pattern are used, if available. If there is no suffix, then the empty string is used.

If the mime type is set to the special string "unknown", then the type is unknown. This allows specific types to be undefined when glob patterns are used.

If the property "prefix.mimePatterns" (or "mimePatterns") exists, then it specifies a white-space delimited set of glob style patterns for matching file suffixes to types. If a match for a specific file suffix fails, then the property "mime.[pattern]" is used for type comparisons.

The entries:

 mimePatterns=*ml
 mime.*ml=text/xml
 
would associate the type "text/xml" with the file foo.html, foo.xml and foo.dhtml. The entries:
 mimePatterns=*
 mime*=application/octet-stream
 mime.config=unknown
 
Would set the types for all file types not otherwise defined to be "application/octet-stream", except that files ending in ".config" would have no type (e.g. they would generate a file not found error).

Parameters: name The string to compute the mime type for props The properties to look up the mime types in.

Returns: The type (or null if not found).

UNKNOWN: prefix The properties prefix for the name lookup

init

public boolean init(Server server, String prefix)
Initialize the file handler.

Returns: The file handler always returns true.

respond

public boolean respond(Request request)
Find, read, and deliver via http the requested file. The server property root is used as the document root. The document root is recalculated for each request, so an upstream handler may change it for that request. For URL's ending with "/", the server property default (normally index.html) is automatically appended. If the file suffix is not found as a server property mime.suffix, the file is not delivered.

sendFile

public static void sendFile(Request request, File file, int code, String type)
Send a file as a response.

Parameters: request The request object fileHandle The file to output type The mime type of the file

setModified

public static void setModified(Properties props, long mod)
Set the "lastModified" request property. If already set, use the most recent value.

Parameters: props Where to find the "lastModified" property mod The modidied time, in ms since the epoch

urlToPath

public static String urlToPath(String url)
Helper function to convert an url into a pathname. URL(String) collapses all "/.." (and "/.") sequences, except for a trailing "/.." (or "/."), which would lead to the possibility of escaping from the document root.

File.getPath in jdk-1.1 leaves all the "//" constructs in, but it collapses them in jdk-1.2, so we have to always take it out ourselves, just to be sure.

Parameters: url The file path from the URL (that is, minus the "http://host" part). May be null.

Returns: The path that corresponds to the URL. The returned value begins with "/". The caller can concatenate this path onto the end of some document root.