org.w3c.www.protocol.http
Class HttpBasicServer

java.lang.Object
  extended by org.w3c.www.protocol.http.HttpServer
      extended by org.w3c.www.protocol.http.HttpBasicServer

public class HttpBasicServer
extends HttpServer

The basic server class, to run requests. A server instance (ie an object conforming to the HttpServer interface is resposnsible for running all requests to a given host.

To do so, it manages a connnnection pool (ie a set of available connections) which it negotiates with the global HTTP manager. It keeps track of the connections it creates in order to serialize requests to the target server (when possible). In order to avoid deadlock due to implicit ordering of requests, a server that manages persistent (ie > 1.0) connections will always be able to open at least two connections to the same target.

Connections are kept track of by the server instance, which maintains at all point in time a list of idle connections. The way this is done may seem quite tricky, but beleive me, it's the best way I have found to handle it (there is here a typical deadlock situation - the same which is found in org.w3c.jigsaw.http.Client - due to the fact that the server instances need to be locked in order to change the connection pool, and at the same time each connection of the pool might have to notify the pool of some events. This can easily produce a deadlock...This situation is avoided here, by having the server locked only when appropriate...


Field Summary
protected  int conn_timeout
          The connectiontimeout for the socket
protected  int connid
          Connections management - Allocate a new connection for this server.
protected  java.lang.String host
          The host name of the server we handle.
protected  HttpManager manager
          Our central HTTP manager.
protected  int port
          The port number of the server we handle.
protected static int RQ_HTTP10
          Request mode - HTTP/1.0 with no keep-alive support.
protected static int RQ_HTTP10_KA
          Request mode - HTTP/1.0 with keep-alive support.
protected static int RQ_HTTP11
          Request mode - Full HTTP/1.1 compliant mode.
protected static int RQ_HTTP11_TS
          Request mode - Full two stage HTTP/1.1 compliant mode.
protected static int RQ_UNKNOWN
          Request mode - Unknown target server.
protected  int timeout
          The timeout on the socket
 
Fields inherited from class org.w3c.www.protocol.http.HttpServer
state
 
Method Summary
protected  org.w3c.www.protocol.http.HttpBasicConnection allocateConnection()
           
 void deleteConnection(org.w3c.www.protocol.http.HttpConnection conn)
           
protected  Reply doRequest(org.w3c.www.protocol.http.HttpBasicConnection conn, Request request)
          Exceute given request on given conection, according to server.
protected  org.w3c.www.protocol.http.HttpBasicConnection getConnection()
          Connections management - Get an idle connection to run a request.
 short getMajorVersion()
          HttpServer implementation - Get this server's major version number.
 short getMinorVersion()
          HttpServer implementation - Get this server's minor version number.
 java.lang.String getProtocol()
          HttpServer implementation - Get this servers' protocol.
protected  int getRequestMode(Request request)
          Get the current mode of running request for that server.
protected  Reply http_unknown(org.w3c.www.protocol.http.HttpBasicConnection conn, Request request)
          Run that request, we don't know what server we have at the other end.
protected  Reply http10_ka_run(org.w3c.www.protocol.http.HttpBasicConnection conn, Request request)
          Run an HTTP/1.0 request that has support for keep alive.
protected  Reply http10_run(org.w3c.www.protocol.http.HttpBasicConnection conn, Request request)
          Run a simple HTTP/1.0 request.
protected  Reply http11_run(org.w3c.www.protocol.http.HttpBasicConnection conn, Request request)
          Run a fully HTTP/1.1 compliant request.
protected  Reply http11_ts_run(org.w3c.www.protocol.http.HttpBasicConnection conn, Request request)
          Run a two stage HTTP/1.1 compliant request.
 void initialize(HttpManager manager, org.w3c.www.protocol.http.HttpServerState state, java.lang.String host, int port, int timeout)
          HttpServer implementation - Initialize this server to its target.
 void initialize(HttpManager manager, org.w3c.www.protocol.http.HttpServerState state, java.lang.String host, int port, int timeout, int conn_timeout)
          HttpServer implementation - Initialize this server to its target.
protected  void interruptRequest(Request request)
          Interrupt given request, that was launched by ourself.
protected  boolean isTwoStage_10(Request request)
          Is this request a two stage request.
protected  boolean isTwoStage_11(Request request)
          Is this request a two stage request.
protected  void notifyObserver(RequestObserver obs, RequestEvent evt)
           
protected  void notifyObserver(RequestObserver obs, Request request, int code)
           
 void registerConnection(org.w3c.www.protocol.http.HttpConnection conn)
          Connections management - Register a connection as being idle.
 Reply runRequest(Request request)
          Run the given request in synchronous mode.
 void setConnTimeout(int conn_timeout)
          Set the connection timeout for the next connections
protected  void setHostAddr(java.net.InetAddress[] hostAddrs)
          set the inet addresses of this host, and timestamp it to avoid caching IPs forever
 void setTimeout(int timeout)
          Set the timeout for the next connections
 java.lang.String toString()
          Display this server into a String.
 void unregisterConnection(org.w3c.www.protocol.http.HttpConnection conn)
          Unregister a connection from the idle list.
protected  void updateHostAddr()
          check the validity of the host address if invalid, it will update the InetAddress associated with this host
protected  void updateServerInfo(Reply reply)
          A full round-trip has been run with the target server, update infos.
 
Methods inherited from class org.w3c.www.protocol.http.HttpServer
getState
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

RQ_HTTP11

protected static final int RQ_HTTP11
Request mode - Full HTTP/1.1 compliant mode.

See Also:
Constant Field Values

RQ_HTTP11_TS

protected static final int RQ_HTTP11_TS
Request mode - Full two stage HTTP/1.1 compliant mode.

See Also:
Constant Field Values

RQ_HTTP10

protected static final int RQ_HTTP10
Request mode - HTTP/1.0 with no keep-alive support.

See Also:
Constant Field Values

RQ_HTTP10_KA

protected static final int RQ_HTTP10_KA
Request mode - HTTP/1.0 with keep-alive support.

See Also:
Constant Field Values

RQ_UNKNOWN

protected static final int RQ_UNKNOWN
Request mode - Unknown target server.

See Also:
Constant Field Values

manager

protected HttpManager manager
Our central HTTP manager.


host

protected java.lang.String host
The host name of the server we handle.


port

protected int port
The port number of the server we handle.


timeout

protected int timeout
The timeout on the socket


conn_timeout

protected int conn_timeout
The connectiontimeout for the socket


connid

protected int connid
Connections management - Allocate a new connection for this server. The connection is bound to the next available IP address, so that we are able to round-robin on them. If one of the DNS advertized IP address fails, we just try the next one, until one of them succeed or all of them fail.

Method Detail

setHostAddr

protected void setHostAddr(java.net.InetAddress[] hostAddrs)
set the inet addresses of this host, and timestamp it to avoid caching IPs forever

Parameters:
hostAddrs, - an array of InetAddress

updateHostAddr

protected void updateHostAddr()
                       throws HttpException
check the validity of the host address if invalid, it will update the InetAddress associated with this host

Throws:
HttpException

getProtocol

public java.lang.String getProtocol()
HttpServer implementation - Get this servers' protocol.

Specified by:
getProtocol in class HttpServer
Returns:
A String encoding the protocol used to dialog with the target server.

getMajorVersion

public short getMajorVersion()
HttpServer implementation - Get this server's major version number.

Specified by:
getMajorVersion in class HttpServer
Returns:
The server's major number version, or -1 if still unknown.

getMinorVersion

public short getMinorVersion()
HttpServer implementation - Get this server's minor version number.

Specified by:
getMinorVersion in class HttpServer
Returns:
The server's minor number version, or -1 if still unknown.

setTimeout

public void setTimeout(int timeout)
Set the timeout for the next connections

Specified by:
setTimeout in class HttpServer
Parameters:
timeout - The timeout in milliseconds

setConnTimeout

public void setConnTimeout(int conn_timeout)
Set the connection timeout for the next connections

Specified by:
setConnTimeout in class HttpServer
Parameters:
timeout - The timeout in milliseconds

allocateConnection

protected org.w3c.www.protocol.http.HttpBasicConnection allocateConnection()
                                                                    throws java.io.IOException
Throws:
java.io.IOException

registerConnection

public void registerConnection(org.w3c.www.protocol.http.HttpConnection conn)
Connections management - Register a connection as being idle. When a connection is created, or when it becomes idle again (after having been used to handle a request), it has to be registered back to the idle list of connection for the server. All connections contained in this idle list are candidates for being elected to handle some pending or incoming request to the host we manager.

Parameters:
conn - The connection that is now idle.

unregisterConnection

public void unregisterConnection(org.w3c.www.protocol.http.HttpConnection conn)
Unregister a connection from the idle list. Unregistering a connection means that the server shouldn't keep track of it any more. This can happen in two situations:

deleteConnection

public void deleteConnection(org.w3c.www.protocol.http.HttpConnection conn)

getConnection

protected org.w3c.www.protocol.http.HttpBasicConnection getConnection()
                                                               throws java.io.IOException
Connections management - Get an idle connection to run a request. The server has been asked to run a new request, and it now wants a connection to run it on. This method will try various ways of aqcuiring a connection: The connection returned is marked for use (ie it is unregistered from the idle connection list), it is up to the caller to make sure that if possible, the connection registers itself again to the idle list after the processing is done.

This method can return null to indicate to the caller that it should try again, in the hope that the target server has multiple (different) IP addresses.

Returns:
A connection marked in use, and which should be marked as idle after the processing it is use for is done, or null if a fresh connection cannot be established.
Throws:
java.io.IOException

toString

public java.lang.String toString()
Display this server into a String.

Overrides:
toString in class java.lang.Object
Returns:
A String based representation of the server object.

updateServerInfo

protected void updateServerInfo(Reply reply)
A full round-trip has been run with the target server, update infos. Each server instance maintains a set of informations to be reused if needed when recontacting the server later. After a full round trip has been performed with the server, it is time to update the target server version number, and keeps-alive flag.

Parameters:
reply - The first reply we got from this server.

initialize

public void initialize(HttpManager manager,
                       org.w3c.www.protocol.http.HttpServerState state,
                       java.lang.String host,
                       int port,
                       int timeout)
                throws HttpException
HttpServer implementation - Initialize this server to its target.

Specified by:
initialize in class HttpServer
Parameters:
manager - The central HTTP manager.
state - The manager's state for that server.
host - The target server's host name.
port - The target server's port number.
timeout - The timeout for the connection handled by the server
Throws:
HttpException - If the server host couldn't be resolved to one or more IP addresses.

initialize

public void initialize(HttpManager manager,
                       org.w3c.www.protocol.http.HttpServerState state,
                       java.lang.String host,
                       int port,
                       int timeout,
                       int conn_timeout)
                throws HttpException
HttpServer implementation - Initialize this server to its target.

Specified by:
initialize in class HttpServer
Parameters:
manager - The central HTTP manager.
state - The manager's state for that server.
host - The target server's host name.
port - The target server's port number.
timeout - The timeout for the connection handled by the server
timeout - The connection timeout in millisecond for the sockets
Throws:
HttpException - If the server host couldn't be resolved to one or more IP addresses.

notifyObserver

protected void notifyObserver(RequestObserver obs,
                              Request request,
                              int code)

notifyObserver

protected void notifyObserver(RequestObserver obs,
                              RequestEvent evt)

isTwoStage_10

protected boolean isTwoStage_10(Request request)
Is this request a two stage request.

Returns:
A boolean, true if the request is two stage, false otherwise.

isTwoStage_11

protected boolean isTwoStage_11(Request request)
Is this request a two stage request.

Returns:
A boolean, true if the request is two stage, false otherwise.

getRequestMode

protected int getRequestMode(Request request)
Get the current mode of running request for that server. This method check our knowledge of the target server, and deduce the mode in which the given request should be run.

Returns:
An integer code, indicating the mode in which the request should be run:
RQ_HTTP11
The request should be run as an HTTP/1.1 request.
RQ_HTTP10
The request should be run as an HTTP/1.0 request.
RQ_HTTP10_KA
HTTP/1.0 with keep-alive support.
RQ_UNKNOWN
This is the first request, we don't know yet.

http11_run

protected Reply http11_run(org.w3c.www.protocol.http.HttpBasicConnection conn,
                           Request request)
                    throws java.io.IOException,
                           MimeParserException
Run a fully HTTP/1.1 compliant request. This request has no body, so we can do whatever we want with it, and retry as many time as we want.

Parameters:
conn - The connection to run the request on.
request - The request to run.
Returns:
A Reply instance, if success; null if the request should be retried.
Throws:
java.io.IOException - If some IO error occured.
MimeParserException - If some MIME parsing error occured.

http11_ts_run

protected Reply http11_ts_run(org.w3c.www.protocol.http.HttpBasicConnection conn,
                              Request request)
                       throws java.io.IOException,
                              MimeParserException
Run a two stage HTTP/1.1 compliant request. The neat thing about this sort of request is that as they support 100 status codes, we know when we have to retry them.

Parameters:
conn - The connection to run the request on.
request - The request to run.
Returns:
A Reply instance, if success; null if the request should be retried.
Throws:
java.io.IOException - If some IO error occured.
MimeParserException - If some MIME parsing error occured.

http10_ka_run

protected Reply http10_ka_run(org.w3c.www.protocol.http.HttpBasicConnection conn,
                              Request request)
                       throws java.io.IOException,
                              MimeParserException
Run an HTTP/1.0 request that has support for keep alive. This kind of request are the worst one with regard to the retry strategy we can adopt.

Parameters:
conn - The connection to run the request on.
request - The request to run.
Returns:
A Reply instance, if success; null if the request should be retried.
Throws:
java.io.IOException - If some IO error occured.
MimeParserException - If some MIME parsing error occured.

http10_run

protected Reply http10_run(org.w3c.www.protocol.http.HttpBasicConnection conn,
                           Request request)
                    throws java.io.IOException,
                           MimeParserException
Run a simple HTTP/1.0 request. This server doesn't support keep-alive, we know the connection is always fresh, we don't need to go into the retry buisness.

That's cool !

Parameters:
conn - The connection to run the request on.
request - The request to run.
Returns:
A Reply instance, if success; null if the request should be retried.
Throws:
java.io.IOException - If some IO error occured.
MimeParserException - If some MIME parsing error occured.

http_unknown

protected Reply http_unknown(org.w3c.www.protocol.http.HttpBasicConnection conn,
                             Request request)
                      throws java.io.IOException,
                             MimeParserException
Run that request, we don't know what server we have at the other end. We know the connection is fresh, we use the http10_run and update the server infos by the end of processing.

Parameters:
conn - The connection to run the request on.
request - The request to run.
Returns:
A Reply instance, if success; null if the request should be retried.
Throws:
java.io.IOException - If some IO error occured.
MimeParserException - If some MIME parsing error occured.

doRequest

protected Reply doRequest(org.w3c.www.protocol.http.HttpBasicConnection conn,
                          Request request)
                   throws java.io.IOException,
                          MimeParserException
Exceute given request on given conection, according to server.

Parameters:
conn - The connection to use to run that request.
request - The request to execute.
Throws:
java.io.IOException - If some IO error occurs, or if the request is interrupted.
MimeParserException - If taregt server doesn't conform to the HTTP specification.

interruptRequest

protected void interruptRequest(Request request)
Interrupt given request, that was launched by ourself.

Specified by:
interruptRequest in class HttpServer
Parameters:
request - The request to interrupt.

runRequest

public Reply runRequest(Request request)
                 throws HttpException
Run the given request in synchronous mode.

Specified by:
runRequest in class HttpServer
Parameters:
request - The request to run.
Returns:
A Reply instance, containing the reply headers, and the optional reply entity, to be read by the calling thread.
Throws:
HttpException - If the request processing failed.