com.cometway.httpd
Class WebServer
java.lang.Object
com.cometway.props.Props
com.cometway.ak.Agent
com.cometway.httpd.WebServer
- All Implemented Interfaces:
- AgentInterface, HasStateMachineModel, java.lang.Runnable
- Direct Known Subclasses:
- SecureWebServer
public class WebServer
- extends Agent
- implements java.lang.Runnable
Routes HTTP requests from a server socket.
|
Field Summary |
static int |
ACCEPT_NOT_ALLOWED
The resource identified by the request is only capable of generating response entities which have content characteristics not acceptable according to the accept headers sent in the request. |
static int |
BAD_GATEWAY
The server, while acting as a gateway or proxy, received an invalid response from the upstream server it accessed in attempting to fulfill the request. |
static int |
BAD_REQUEST
The request could not be understood by the server due to malformed syntax. |
static int |
CANNOT_SATISFY_REQUEST_RANGE
A server SHOULD return a response with this status code if a request included a Range request-header field, and none of the range-specifier values in this field overlap the current extent of the selected resource, and the request did not include an If-Range request-header field. |
int |
counter
|
static java.text.SimpleDateFormat |
dateFormat_ANSI
|
static java.text.SimpleDateFormat |
dateFormat_RFC822
|
static java.text.SimpleDateFormat |
dateFormat_RFC850
|
static int |
EXPECTATION_FAILED
The expectation given in an Expect request-header field could not be met by this server, or, if the server is a proxy, the server has unambiguous evidence that the request could not be met by the next-hop server. |
protected java.util.Hashtable |
extensions
|
static int |
FORBIDDEN
The server understood the request, but is refusing to fulfill it. |
static int |
GATEWAY_TIMEOUT
The server, while acting as a gateway or proxy, did not receive a timely response from the upstream server specified by the URI (e.g. |
static int |
GONE
The requested resource is no longer available at the server and no forwarding address is known. |
static int |
LENGTH_REQUIRED
The server refuses to accept the request without a defined Content- Length. |
protected FileLoggerAgent |
logger
|
static int |
METHOD_NOT_ALLOWED
The method specified in the Request-Line is not allowed for the resource identified by the Request-URI. |
protected static Props |
mimeTypes
|
static int |
MOVED
The requested resource resides temporarily under a different URI. |
static int |
MOVED_PERMANENTLY
The requested resource has been assigned a new permanent URI and any future references to this resource SHOULD use one of the returned URIs. |
protected boolean |
multihome
|
static int |
NO_CONTENT
The server has fulfilled the request but does not need to return an entity-body, and might want to return updated metainformation. |
static int |
NOT_IMPLEMENTED
The server does not support the functionality required to fulfill the request. |
static int |
NOT_MODIFIED
If the client has performed a conditional GET request and access is allowed, but the document has not been modified, the server SHOULD respond with this status code. |
protected int |
numConnections
|
static int |
PRECONDITION_FAILED
The precondition given in one or more of the request-header fields evaluated to false when it was tested on the server. |
static int |
PROXY_AUTHENTICATION_REQUIRED
This code is similar to 401 (Unauthorized), but indicates that the client must first authenticate itself with the proxy. |
static int |
REQUEST_CONFLICT
The request could not be completed due to a conflict with the current state of the resource. |
static int |
REQUEST_ENTITY_TOO_LARGE
The server is refusing to process a request because the request entity is larger than the server is willing or able to process. |
static int |
REQUEST_TIMED_OUT
The client did not produce a request within the time that the server was prepared to wait. |
static int |
REQUEST_URI_TOO_LONG
The server is refusing to service the request because the Request-URI is longer than the server is willing to interpret. |
static int |
RESET_CONTENT
The server has fulfilled the request and the user agent SHOULD reset the document view which caused the request to be sent. |
static HTMLResponseInterface |
responseAgent
|
protected java.lang.Thread |
runThread
|
static int |
SERVER_ERROR
The server encountered an unexpected condition which prevented it from fulfilling the request. |
static int |
SERVICE_UNAVAILABLE
The server is currently unable to handle the request due to a temporary overloading or maintenance of the server. |
static int |
TEMPORARY_REDIRECT
The requested resource resides temporarily under a different URI. |
protected ThreadPool |
threadPool
|
static int |
UNAUTHORIZED
The request requires user authentication. |
protected java.util.Vector |
undefinedDomains
|
static int |
UNSUPPORTED_MEDIA_TYPE
The server is refusing to service the request because the entity of the request is in a format not supported by the requested resource for the requested method. |
static int |
URL_NOT_FOUND
The server has not found anything matching the Request-URI. |
static int |
USE_GET
The response to the request can be found under a different URI and SHOULD be retrieved using a GET method on that resource. |
static int |
USE_PROXY
The requested resource MUST be accessed through the proxy given by the Location field. |
static int |
VERSION_NOT_SUPPORTED
The server does not support, or refuses to support, the HTTP protocol version that was used in the request message. |
static java.lang.String |
VERSION_STR
|
| Fields inherited from class com.cometway.ak.Agent |
agent_id, agentController, CREATING_STATE, debugReporter, DESTROYED_STATE, DESTROYING_STATE, errorReporter, FAILED_STATE, printlnReporter, props, RUNNING_STATE, STARTING_STATE, STOPPED_STATE, STOPPING_STATE, warningReporter |
|
Method Summary |
void |
addExtension(java.lang.String domain,
java.lang.String priority,
WebServerExtension service)
This is the temporary way of adding extensions. |
void |
clearExtensionsCache()
This method clears the cache. |
java.util.Vector |
getExtensions(java.lang.String domain)
This is used by the ConnectionKMethod to get a WebServerExtension. |
static java.lang.String |
getHTMLByCode(int code)
This method uses the return codes (static final int) in this Class to return a generic response. |
static java.lang.String |
getHTMLByCode(int code,
java.lang.String keepAliveField)
This method uses the return codes (static final int) in this Class to return a generic response. |
static java.lang.String |
getHTMLByCode(int code,
java.lang.String keepAliveField,
java.lang.String extraHeaders)
This method uses the return codes (static final int) in this Class to return a generic response. |
static java.lang.String |
getMimeType(java.lang.String path)
Determines what the mime type is based off the path,
returns mime type as a String in the HTTP response header. |
RequestAgent |
getRequestAgent(java.lang.String host,
java.lang.String serviceName)
Retrieve an Agent that will handle an HTTPAgentRequest |
protected java.net.ServerSocket |
getServerSocket(java.lang.String bind_address,
int port)
This creates the ServerSocket. |
void |
initProps()
Initializes this agent's properties by providing default
values fo each of the following missing properties:
'bind_address' (default: all),
'bind_port' (default: 80)
'index_agent' (default: HTTPFileServerAgent)
'log_requests' (default: true)
'max_connections' (default: 200)
'serversocket_queue_size' (default: 50)
'mime_types_file' (default: mime_types)
'multihome' (default: false)
'strict_http_version' (default:false)
'socket_linger_time' (default: 2000)
'thread_pool_timeout' (default: 0)
'use_inet_address_methods' (default: true)
'socket_timeout' (default:30000)
'socket_initial_timeout' (default:3000)
'max_uri_length' (default:512)
'max_field_length' (default:128)
'html_response_agent' (default:none)
'cache_extensions' (default:true)
'service_name' (default:WebServer-'bind_port') |
static void |
loadDefaultMimeTypes()
|
static void |
loadMimeTypes(java.lang.String filename)
|
void |
printThreads()
|
void |
run()
Starts WebServer, attempts to bind port. |
void |
start()
Starts helper agents and threads. |
void |
stop()
Right now you can't stop this agent because the threadPool threads
can't be cleaned up absolutely. |
| Methods inherited from class com.cometway.ak.Agent |
currentStateEquals, debug, destroy, error, error, getAgentController, getDateTimeStr, getProps, getServiceImpl, getStateMachineModel, println, register, registerService, setAgentController, setProps, toString, unregister, unregisterService, warning, warning |
| Methods inherited from class com.cometway.props.Props |
addListener, append, copy, copyFrom, copyTo, decrementInteger, dump, enableListeners, enumerateKeys, format, getBoolean, getByteArray, getCharacter, getDate, getDate, getDateString, getDouble, getFloat, getHexString, getInteger, getKeys, getLong, getNextKey, getProperty, getProperty, getPropsContainer, getSize, getString, getString, getTokens, getTokens, getTrimmedString, getVector, hasProperty, incrementInteger, insertProps, loadProps, notifyPropsChanged, notifyPropsChangedIgnore, notifyPropsChangedIgnore, parse, propertyMatchesRegEx, readFromFile, regExPropertyMatches, removeAll, removeListener, removeProperty, resumeNotify, saveProps, set, setBoolean, setCharacter, setDefault, setDouble, setFloat, setInteger, setLong, setProperty, setProperty, setProperty, setPropsContainer, suspendNotify, writeToFile |
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
NO_CONTENT
public static final int NO_CONTENT
- The server has fulfilled the request but does not need to return an entity-body, and might want to return updated metainformation. The response MAY include new or updated metainformation in the form of entity-headers, which if present SHOULD be associated with the requested variant.
- See Also:
- Constant Field Values
RESET_CONTENT
public static final int RESET_CONTENT
- The server has fulfilled the request and the user agent SHOULD reset the document view which caused the request to be sent. This response is primarily intended to allow input for actions to take place via user input, followed by a clearing of the form in which the input is given so that the user can easily initiate another input action. The response MUST NOT include an entity.
- See Also:
- Constant Field Values
MOVED_PERMANENTLY
public static final int MOVED_PERMANENTLY
- The requested resource has been assigned a new permanent URI and any future references to this resource SHOULD use one of the returned URIs. Clients with link editing capabilities ought to automatically re-link references to the Request-URI to one or more of the new references returned by the server, where possible. This response is cacheable unless indicated otherwise.
- See Also:
- Constant Field Values
MOVED
public static final int MOVED
- The requested resource resides temporarily under a different URI. Since the redirection might be altered on occasion, the client SHOULD continue to use the Request-URI for future requests. This response is only cacheable if indicated by a Cache-Control or Expires header field.
- See Also:
- Constant Field Values
USE_GET
public static final int USE_GET
- The response to the request can be found under a different URI and SHOULD be retrieved using a GET method on that resource. This method exists primarily to allow the output of a POST-activated script to redirect the user agent to a selected resource. The new URI is not a substitute reference for the originally requested resource. The 303 response MUST NOT be cached, but the response to the second (redirected) request might be cacheable.
- See Also:
- Constant Field Values
NOT_MODIFIED
public static final int NOT_MODIFIED
- If the client has performed a conditional GET request and access is allowed, but the document has not been modified, the server SHOULD respond with this status code. The 304 response MUST NOT contain a message-body, and thus is always terminated by the first empty line after the header fields.
- See Also:
- Constant Field Values
USE_PROXY
public static final int USE_PROXY
- The requested resource MUST be accessed through the proxy given by the Location field. The Location field gives the URI of the proxy. The recipient is expected to repeat this single request via the proxy. 305 responses MUST only be generated by origin servers.
- See Also:
- Constant Field Values
TEMPORARY_REDIRECT
public static final int TEMPORARY_REDIRECT
- The requested resource resides temporarily under a different URI. Since the redirection MAY be altered on occasion, the client SHOULD continue to use the Request-URI for future requests. This response is only cacheable if indicated by a Cache-Control or Expires header field.
- See Also:
- Constant Field Values
BAD_REQUEST
public static final int BAD_REQUEST
- The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.
- See Also:
- Constant Field Values
UNAUTHORIZED
public static final int UNAUTHORIZED
- The request requires user authentication. The response MUST include a WWW-Authenticate header field containing a challenge applicable to the requested resource. The client MAY repeat the request with a suitable Authorization header field. If the request already included Authorization credentials, then the 401 response indicates that authorization has been refused for those credentials. If the 401 response contains the same challenge as the prior response, and the user agent has already attempted authentication at least once, then the user SHOULD be presented the entity that was given in the response, since that entity might include relevant diagnostic information.
- See Also:
- Constant Field Values
FORBIDDEN
public static final int FORBIDDEN
- The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information available to the client, the status code 404 (Not Found) can be used instead.
- See Also:
- Constant Field Values
URL_NOT_FOUND
public static final int URL_NOT_FOUND
- The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent. The 410 (Gone) status code SHOULD be used if the server knows, through some internally configurable mechanism, that an old resource is permanently unavailable and has no forwarding address. This status code is commonly used when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable.
- See Also:
- Constant Field Values
METHOD_NOT_ALLOWED
public static final int METHOD_NOT_ALLOWED
- The method specified in the Request-Line is not allowed for the resource identified by the Request-URI. The response MUST include an Allow header containing a list of valid methods for the requested resource.
- See Also:
- Constant Field Values
ACCEPT_NOT_ALLOWED
public static final int ACCEPT_NOT_ALLOWED
- The resource identified by the request is only capable of generating response entities which have content characteristics not acceptable according to the accept headers sent in the request.
Unless it was a HEAD request, the response SHOULD include an entity containing a list of available entity characteristics and location(s) from which the user or user agent can choose the one most appropriate. The entity format is specified by the media type given in the Content-Type header field. Depending upon the format and the capabilities of the user agent, selection of the most appropriate choice MAY be performed automatically. However, this specification does not define any standard for such automatic selection.
- See Also:
- Constant Field Values
PROXY_AUTHENTICATION_REQUIRED
public static final int PROXY_AUTHENTICATION_REQUIRED
- This code is similar to 401 (Unauthorized), but indicates that the client must first authenticate itself with the proxy. The proxy MUST return a Proxy-Authenticate header field containing a challenge applicable to the proxy for the requested resource. The client MAY repeat the request with a suitable Proxy-Authorization header field
- See Also:
- Constant Field Values
REQUEST_TIMED_OUT
public static final int REQUEST_TIMED_OUT
- The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time.
- See Also:
- Constant Field Values
REQUEST_CONFLICT
public static final int REQUEST_CONFLICT
- The request could not be completed due to a conflict with the current state of the resource. This code is only allowed in situations where it is expected that the user might be able to resolve the conflict and resubmit the request. The response body SHOULD include enough information for the user to recognize the source of the conflict. Ideally, the response entity would include enough information for the user or user agent to fix the problem; however, that might not be possible and is not required.
- See Also:
- Constant Field Values
GONE
public static final int GONE
- The requested resource is no longer available at the server and no forwarding address is known. This condition is expected to be considered permanent. Clients with link editing capabilities SHOULD delete references to the Request-URI after user approval. If the server does not know, or has no facility to determine, whether or not the condition is permanent, the status code 404 (Not Found) SHOULD be used instead. This response is cacheable unless indicated otherwise.
The 410 response is primarily intended to assist the task of web maintenance by notifying the recipient that the resource is intentionally unavailable and that the server owners desire that remote links to that resource be removed. Such an event is common for limited-time, promotional services and for resources belonging to individuals no longer working at the server's site. It is not necessary to mark all permanently unavailable resources as "gone" or to keep the mark for any length of time -- that is left to the discretion of the server owner.
- See Also:
- Constant Field Values
LENGTH_REQUIRED
public static final int LENGTH_REQUIRED
- The server refuses to accept the request without a defined Content- Length. The client MAY repeat the request if it adds a valid Content-Length header field containing the length of the message-body in the request message.
- See Also:
- Constant Field Values
PRECONDITION_FAILED
public static final int PRECONDITION_FAILED
- The precondition given in one or more of the request-header fields evaluated to false when it was tested on the server. This response code allows the client to place preconditions on the current resource metainformation (header field data) and thus prevent the requested method from being applied to a resource other than the one intended.
- See Also:
- Constant Field Values
REQUEST_ENTITY_TOO_LARGE
public static final int REQUEST_ENTITY_TOO_LARGE
- The server is refusing to process a request because the request entity is larger than the server is willing or able to process. The server MAY close the connection to prevent the client from continuing the request.
- See Also:
- Constant Field Values
REQUEST_URI_TOO_LONG
public static final int REQUEST_URI_TOO_LONG
- The server is refusing to service the request because the Request-URI is longer than the server is willing to interpret. This rare condition is only likely to occur when a client has improperly converted a POST request to a GET request with long query information, when the client has descended into a URI "black hole" of redirection (e.g., a redirected URI prefix that points to a suffix of itself), or when the server is under attack by a client attempting to exploit security holes present in some servers using fixed-length buffers for reading or manipulating the Request-URI.
- See Also:
- Constant Field Values
UNSUPPORTED_MEDIA_TYPE
public static final int UNSUPPORTED_MEDIA_TYPE
- The server is refusing to service the request because the entity of the request is in a format not supported by the requested resource for the requested method.
- See Also:
- Constant Field Values
CANNOT_SATISFY_REQUEST_RANGE
public static final int CANNOT_SATISFY_REQUEST_RANGE
- A server SHOULD return a response with this status code if a request included a Range request-header field, and none of the range-specifier values in this field overlap the current extent of the selected resource, and the request did not include an If-Range request-header field. (For byte-ranges, this means that the first- byte-pos of all of the byte-range-spec values were greater than the current length of the selected resource.)
- See Also:
- Constant Field Values
EXPECTATION_FAILED
public static final int EXPECTATION_FAILED
- The expectation given in an Expect request-header field could not be met by this server, or, if the server is a proxy, the server has unambiguous evidence that the request could not be met by the next-hop server.
- See Also:
- Constant Field Values
SERVER_ERROR
public static final int SERVER_ERROR
- The server encountered an unexpected condition which prevented it from fulfilling the request.
- See Also:
- Constant Field Values
NOT_IMPLEMENTED
public static final int NOT_IMPLEMENTED
- The server does not support the functionality required to fulfill the request. This is the appropriate response when the server does not recognize the request method and is not capable of supporting it for any resource.
- See Also:
- Constant Field Values
BAD_GATEWAY
public static final int BAD_GATEWAY
- The server, while acting as a gateway or proxy, received an invalid response from the upstream server it accessed in attempting to fulfill the request.
- See Also:
- Constant Field Values
SERVICE_UNAVAILABLE
public static final int SERVICE_UNAVAILABLE
- The server is currently unable to handle the request due to a temporary overloading or maintenance of the server. The implication is that this is a temporary condition which will be alleviated after some delay. If known, the length of the delay MAY be indicated in a Retry-After header. If no Retry-After is given, the client SHOULD handle the response as it would for a 500 response.
- See Also:
- Constant Field Values
GATEWAY_TIMEOUT
public static final int GATEWAY_TIMEOUT
- The server, while acting as a gateway or proxy, did not receive a timely response from the upstream server specified by the URI (e.g. HTTP, FTP, LDAP) or some other auxiliary server (e.g. DNS) it needed to access in attempting to complete the request.
- See Also:
- Constant Field Values
VERSION_NOT_SUPPORTED
public static final int VERSION_NOT_SUPPORTED
- The server does not support, or refuses to support, the HTTP protocol version that was used in the request message. The server is indicating that it is unable or unwilling to complete the request using the same major version as the client, as described in section 3.1, other than with this error message. The response SHOULD contain an entity describing why that version is not supported and what other protocols are supported by that server.
- See Also:
- Constant Field Values
VERSION_STR
public static final java.lang.String VERSION_STR
- See Also:
- Constant Field Values
mimeTypes
protected static Props mimeTypes
multihome
protected boolean multihome
dateFormat_RFC822
public static final java.text.SimpleDateFormat dateFormat_RFC822
dateFormat_RFC850
public static final java.text.SimpleDateFormat dateFormat_RFC850
dateFormat_ANSI
public static final java.text.SimpleDateFormat dateFormat_ANSI
numConnections
protected int numConnections
threadPool
protected ThreadPool threadPool
runThread
protected java.lang.Thread runThread
logger
protected FileLoggerAgent logger
counter
public int counter
responseAgent
public static HTMLResponseInterface responseAgent
extensions
protected java.util.Hashtable extensions
undefinedDomains
protected java.util.Vector undefinedDomains
WebServer
public WebServer()
initProps
public void initProps()
- Initializes this agent's properties by providing default
values fo each of the following missing properties:
'bind_address' (default: all),
'bind_port' (default: 80)
'index_agent' (default: HTTPFileServerAgent)
'log_requests' (default: true)
'max_connections' (default: 200)
'serversocket_queue_size' (default: 50)
'mime_types_file' (default: mime_types)
'multihome' (default: false)
'strict_http_version' (default:false)
'socket_linger_time' (default: 2000)
'thread_pool_timeout' (default: 0)
'use_inet_address_methods' (default: true)
'socket_timeout' (default:30000)
'socket_initial_timeout' (default:3000)
'max_uri_length' (default:512)
'max_field_length' (default:128)
'html_response_agent' (default:none)
'cache_extensions' (default:true)
'service_name' (default:WebServer-'bind_port')
- Specified by:
initProps in interface AgentInterface- Overrides:
initProps in class Agent
start
public void start()
- Starts helper agents and threads.
- Specified by:
start in interface AgentInterface- Overrides:
start in class Agent
stop
public void stop()
- Right now you can't stop this agent because the threadPool threads
can't be cleaned up absolutely.
- Specified by:
stop in interface AgentInterface- Overrides:
stop in class Agent
getServerSocket
protected java.net.ServerSocket getServerSocket(java.lang.String bind_address,
int port)
throws java.io.IOException
- This creates the ServerSocket. Classes that extend WebServer can override this
method in order to create different ServerSockets.
- Throws:
java.io.IOException
run
public void run()
- Starts WebServer, attempts to bind port.
- Specified by:
run in interface java.lang.Runnable
getRequestAgent
public RequestAgent getRequestAgent(java.lang.String host,
java.lang.String serviceName)
- Retrieve an Agent that will handle an HTTPAgentRequest
addExtension
public void addExtension(java.lang.String domain,
java.lang.String priority,
WebServerExtension service)
- This is the temporary way of adding extensions. The domain can either be a domain name
that uses this extension (without the http://), 'all' for extensions that affect all
domains, or 'default' for extensions when not multihoming or when a domain name wasn't
given. The priority is a number, preferably less then 10000, that determines the order
of which extensions get run, extensions that share the same number get run in some
undetermined order. The service is the WebServerExtension object.
The point of doing all this initial work is so the ordering, and running of extensions
are made as fast as possible when they are used to handle requests.
getExtensions
public java.util.Vector getExtensions(java.lang.String domain)
- This is used by the ConnectionKMethod to get a WebServerExtension.
clearExtensionsCache
public void clearExtensionsCache()
- This method clears the cache. The next attempt to get any extension will cause them
to get cached (if the cache_extensions property is set to true)
printThreads
public void printThreads()
getHTMLByCode
public static java.lang.String getHTMLByCode(int code)
- This method uses the return codes (static final int) in this Class to return a generic response.
getHTMLByCode
public static java.lang.String getHTMLByCode(int code,
java.lang.String keepAliveField)
- This method uses the return codes (static final int) in this Class to return a generic response.
If a keep-alive connection is to be maintained, use the keepAliveField parameter to indicate that
the response should contain a 'Connection: Keep-Alive' field and include the parameter also as a field.
getHTMLByCode
public static java.lang.String getHTMLByCode(int code,
java.lang.String keepAliveField,
java.lang.String extraHeaders)
- This method uses the return codes (static final int) in this Class to return a generic response.
This method also supports the keepAliveField parameter as well as any extra headers that needs to
be included in the generic response.
loadMimeTypes
public static void loadMimeTypes(java.lang.String filename)
loadDefaultMimeTypes
public static void loadDefaultMimeTypes()
getMimeType
public static java.lang.String getMimeType(java.lang.String path)
- Determines what the mime type is based off the path,
returns mime type as a String in the HTTP response header.