Represents an HTTP transaction. A new instance is created
by the server for each connection.
Provides a set of accessor functions to fetch the individual fields
of the HTTP request.
Utility methods that are generically useful for manipulating HTTP
requests are included here as well. An instance of this class is
passed to handlers. There will be exactly one request object per thead
at any time.
The fields
headers,
query, and
url, and the method
getQueryData()
are most often used to examine the content of the request.
The field
props
contains information about the server, or up-stream handlers.
Many of the other methods are used internally, but can be useful to
handlers that need finer control over the output that the above methods
provide. Note that the order of the methods is important. For instance,
the user cannot change the HTTP response headers (by calling the
addHeader method or by modifying the
responseHeaders field) after having already sent an HTTP
response.
A number of the fields in the Request object are public,
by design. Many of the methods are convenience methods; the underlying
data fields are meant to be accessed for more complicated operations,
such as changing the URL or deleting HTTP response headers.
Request.HttpOutputStream
The HttpOutputStream provides the convenience method
writeBytes for writing the byte representation of a
string, without bringing in the overhead and the deprecated warnings
associated with a java.io.DataOutputStream.
static class
Request.RechainableProperties
The RechainableProperties is similar to a standard
Properties, except that the defaults can be changed
at any time.
getSocket()
The socket from which the HTTP request was received, and to where the
HTTP response will be written.
void
log(int level,
Object obj,
String message)
Logs a message by calling Server.log.
void
log(int level,
String message)
Logs a message by calling Server.log.
void
redirect(String url,
String body)
Responds to an HTTP request with a redirection reply, telling the
client that the requested url has moved.
void
sendError(int code,
String clientMessage)
Sends a HTTP error response to the client.
void
sendError(int code,
String clientMessage,
String logMessage)
Sends a HTTP error response to the client.
void
sendHeaders(int code,
String type,
int length)
Sends the HTTP status line and response headers to the client.
void
sendResponse(byte[] body,
String type)
Sends an HTTP response to the client.
void
sendResponse(InputStream in,
int length,
String type,
int code)
Sends the contents of the given input stream as the HTTP response.
void
sendResponse(String body)
Convenience method that sends an HTTP response to the client
with a "Content-Type" of "text/html" and the default HTTP status
code.
void
sendResponse(String body,
String type)
Convenience method that sends an HTTP response to the client
with the default HTTP status code.
A set of properties local to this request. Created with
server.props as the default. This is useful for
handlers that wish to communicate via properties to down-stream
handlers, such as modifying a server property for a particular
request.
This variable is declared as a Request.RechainableProperties,
which provides the ability to reorder the properties in an existing
request, to insert a whole new set of properties into a request w/o
having to copy those properties one by one into the request's
properties. If the user does not need this functionality, this
variable may be accessed simply as a normal Properties.
The HTTP response to the client is written to this stream. Normally
the convenience methods, such as sendResponse, are used
to send the response, but this field is available if a handler
needs to generate the response specially.
If the user chooses to write the response directly to this stream, the
user is still encouraged to use the convenience methods, such as
sendHeaders, to first send the HTTP response headers.
The FilterHandler
examines the HTTP response headers
set by the convenience methods to determine whether to filter the
output.
Note that the HTTP response headers will not automatically be
sent as a side effect if the user writes to this stream. The user
would either need to call the convenience method
sendHeaders or need to generate the HTTP response headers
themselves.
This variable is declared as a Request.HttpOutputStream,
which provides the convenience method writeBytes to write
the byte representation of a string back to the client. If the user
does not need this functionality, this variable may be accessed
simply as a normal OutputStream.
The HTTP request headers. Keys and values in this table correspond
the field names and values from each line in the HTTP header;
field names are case-insensitive, but the case of the values is
preserved. The order of entries in this table corresponds to the
order in which the request headers were seen. Multiple header lines
with the same key are stored as separate entries in the table.
postData
public byte[] postData
The uploaded content of this request, usually from a POST. Set to
null if the request has no content.
keepAlive
public boolean keepAlive
true if the client requested a persistent connection,
false otherwise. Derived from the protocol and
the headers,
When "Keep-Alive" is requested, the client can issue multiple,
consecutive requests via a single socket connection. By default:
HTTP/1.0 requests are not Keep-Alive, unless the
"Connection: Keep-Alive" header was present.
HTTP/1.1 requests are Keep-Alive, unless the "Connection: close"
header was present.
The user can change this value from true to
false to forcefully close the connection to the client
after sending the response. The user can change this value from
false to true if the client is using a
different header to request a persistent connection. See
connectionHeader.
Regardless of this value, if an error is detected while receiving
or responding to an HTTP request, the connection will be closed.
The header "Connection" usually controls whether the client
connection will be of type "Keep-Alive" or "close". The same
header is written back to the client in the response headers.
The field keepAlive is set based on the value of the
"Connection" header. However, not all clients use "Connection"
to request that the connection be kept alive. For instance (although
it does not appear in the HTTP/1.0 or HTTP/1.1 documentation) both
Netscape and IE use the "Proxy-Connection" header when issuing
requests via an HTTP proxy. If a Handler is written to
respond to HTTP proxy requests, it should set keepAlive
depending on the value of the "Proxy-Connection" header, and set
connectionHeader to "Proxy-Connection", since the
convenience methods like setResponse() use these fields
when constructing the response. The server does not handle the
"Proxy-Connection" header by default, since trying to pre-anticipate
all the exceptions to the specification is a "slippery slope".
The HTTP response headers. Keys and values in this table correspond
to the HTTP headers that will be written back to the client when
the response is sent. The order of entries in this table corresponds
to the order in which the HTTP headers will be sent. Multiple header
lines with the same key will be stored as separate entries in the
table.
Returns a string representation of this Request.
The string representation is the first line (the method line) of the
HTTP request that this Request is handling. Useful for
debugging.
The socket from which the HTTP request was received, and to where the
HTTP response will be written. The user should not directly read from
or write to this socket. The socket is provided other purposes, for
example, imagine a handler that provided different content depending
upon the IP address of the client.
Logs a message by calling Server.log. Typically a
message is generated on the console or in a log file, if the
level is less than the current server log setting.
public void log(int level,
Object obj,
String message)
Logs a message by calling Server.log. Typically a
message is generated on the console or in a log file, if the
level is less than the current server log setting.
Returns the value that the given case-insensitive key maps to
in the HTTP request headers. In order to do fancier things like
changing or deleting an existing request header, the user may directly
access the headers field.
Parameters:
key - The key to look for in the HTTP request headers. May not
be null.
Returns:
The value to which the given key is mapped, or
null if the key is not in the headers.
Adds a response header to the HTTP response. In order to do fancier
things like appending a value to an existing response header, the
user may directly access the responseHeaders field.
If this method is called, it must be called before
sendHeaders is either directly or indirectly called.
Otherwise, it will have no effect.
Adds a response header to the HTTP response. In order to do fancier
things like appending a value to an existing response header, the
user may directly access the responseHeaders field.
If this method is called, it must be called before
sendHeaders is either directly or indirectly called.
Otherwise, it will have no effect.
Parameters:
line - The HTTP response header, of the form
"key: value".
This method first calls sendHeaders to send the HTTP
response headers. It then writes out the given string to the client
as a sequence of bytes. Each character in the string is written out
by discarding its high eight bits.
The "Content-Length" will be set to the length of the string.
The "Content-Type" will be set to the given MIME type.
Parameters:
body - The string to send as the HTTP response body. May
not be null.
type - The MIME type of the response, such as "text/html". May be
null to preserve the existing "Content-Type"
response header (if any).
code - The HTTP status code for the response, such as
200. May be < 0 to preserve the existing
status code.
Throws:
IOException - if there was an I/O error while sending the response to
the client.
Sends the contents of the given input stream as the HTTP response.
This method first calls sendHeaders to send the HTTP
response headers. It then transfers a total of length
bytes of data from the given input stream to the client as the
HTTP response body.
This method takes care of setting the "Content-Length" header
if the actual content length is known, or the "Transfer-Encoding"
header if the content length is not known (for HTTP/1.1 clients only).
This method may set the keepAlive to false
before returning, if fewer than length bytes could be
read.
Parameters:
in - The input stream to read from.
length - The content length. The number of bytes to send to the
client. May be < 0, in which case this method will read
until reaching the end of the input stream.
type - The MIME type of the response, such as "text/html". May be
null to preserve the existing "Content-Type"
response header (if any).
code - The HTTP status code for the response, such as
200. May be < 0 to preserve the existing
status code.
Throws:
IOException - if there was an I/O error while sending the response to
the client.
sendError
public void sendError(int code,
String clientMessage)
Sends a HTTP error response to the client.
Parameters:
code - The HTTP status code.
clientMessage - A short message to be included in the error response
and logged to the server.
sendError
public void sendError(int code,
String clientMessage,
String logMessage)
Sends a HTTP error response to the client.
Parameters:
code - The HTTP status code.
clientMessage - A short message to be included in the error response.
logMessage - A short message to be logged to the server. This message is
not sent to the client.
sendHeaders
public void sendHeaders(int code,
String type,
int length)
throws IOException
Sends the HTTP status line and response headers to the client. This
method is automatically invoked by sendResponse, but
can be manually invoked if the user needs direct access to the
client's output stream. If this method is not called, then the
HTTP status and response headers will not automatically be sent to
the client; the user would be responsible for forming the entire
HTTP response.
The user may call the addHeader method or modify the
responseHeaders field before calling this method.
This method then adds a number of HTTP headers, as follows:
"Date" - the current time, if this header is not already present.
"Server" - the server's name (from server.name), if
this header is not already present.
"Connection" - "Keep-Alive" or "close", depending upon the
keepAlive field.
"Content-Length" - set to the given length.
"Content-Type" - set to the given type.
The string used for "Connection" header actually comes from the
connectionHeader field.
Parameters:
code - The HTTP status code for the response, such as
200. May be < 0 to preserve the existing
status code.
type - The MIME type of the response, such as "text/html". May be
null to preserve the existing "Content-Type"
response header (if any).
length - The length of the response body. May be < 0 if the length
is unknown and/or to preserve the existing "Content-Length"
response header (if any).
Throws:
IOException - if there was an I/O error while sending the headers to
the client.
Responds to an HTTP request with a redirection reply, telling the
client that the requested url has moved. Generally, this is used if
the client did not put a '/' on the end of a directory.
Parameters:
url - The URL the client should have requested. This URL may be
fully-qualified (in the form "http://....") or host-relative
(in the form "/...").
body - The body of the redirect response, or null to
send a hardcoded message.
Returns the server's fully-qualified base URL. This is "http://"
followed by the server's hostname and port.
If the HTTP request header "Host" is present, it specifies the
hostname and port that will be used instead of the server's internal
name for itself. Due bugs in certain browsers, when using the server's
internal name, the port number will be elided if it is 80.
Retrieves the query data as a hashtable.
This includes both the query information included as part of the url
and any posted "application/x-www-form-urlencoded" data.
Parameters:
table - An existing hashtable in which to put the query data as
name/value pairs. May be null, in which case
a new hashtable is allocated.
Retrieves the query data as a hashtable.
This includes both the query information included as part of the url
and any posted "application/x-www-form-urlencoded" data.