com.cometway.httpd
Class WebServer

java.lang.Object
  extended by com.cometway.props.Props
      extended by com.cometway.ak.Agent
          extended by 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
 
Constructor Summary
WebServer()
           
 
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
 

Field Detail

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
Constructor Detail

WebServer

public WebServer()
Method Detail

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.