diff options
Diffstat (limited to 'doc/state.txt')
-rw-r--r-- | doc/state.txt | 170 |
1 files changed, 0 insertions, 170 deletions
diff --git a/doc/state.txt b/doc/state.txt deleted file mode 100644 index c45152f8..00000000 --- a/doc/state.txt +++ /dev/null @@ -1,170 +0,0 @@ -============================ -The State Engine of lighttpd -============================ - ------------- -Module: core ------------- - -:Author: Jan Kneschke -:Date: $Date: 2005-03-28T08:30:05.699628Z $ -:Revision: $Revision: 227 $ - -:abstract: - This is a short summary of the state-engine which is driving the lighttpd - webserver. It describes the basic concepts and the way the different parts - of the server are connected. - -.. meta:: - :keywords: lighttpd, state-engine - -.. contents:: Table of Contents - -Description -=========== - -States ------- - -The state-engine is currently made of 11 states which are walk-through on -the way each connection. Some of them are specific for a special operation -and some may never be hit at all. - -:connect: - waiting for a connection -:reqstart: - init the read-idle timer -:read: - read http-request-header from network -:reqend: - parse request -:readpost: - read http-request-content from network -:handlereq: - handle the request internally (might result in sub-requests) -:respstart: - prepare response header -:write: - write response-header + content to network -:respend: - cleanup environment, log request -:error: - reset connection (incl. close()) -:close: - close connection (handle lingering close) - -.. image:: state.png - -A simple GET request (green path) ---------------------------------- - -The connection is idling in the 'connect' state waiting for a connection. -As soon as the connection is set up we init the read-timer in 'reqstart' -and start to read data from the network. As soon as we get the -HTTP-request terminator (CRLFCRLF) we forward the header to the parser. - -The parsed request is handled by 'handlereq' and as soon as a decision out -the request is made it is sent to 'respstart' to prepare the -HTTP-response header. In the 'write' state the prepare content is sent out -to the network. When everything is sent 'respend' is entered to log the -request and cleanup the environment. After the close() call the connection -is set back to the 'connect' state again. - -Keep-Alive (blue path) ----------------------- - -The Keep-Alive handling is implemented by going from the 'respend' -directly to 'reqstart' without the close() and the accept() calls. - -POST requests (grey path) -------------------------- - -As requests might contain a request-body the state 'readpost' entered as -soon as the header is parsed and we know how much data we expect. - -Pipelining ----------- - -HTTP/1.1 supportes pipelining (sending multiple requests without waiting -for the response of the first request). This is handled transparently by -the 'read' state. - -Unexpected errors (red path) ----------------------------- - -For really hard errors we use the 'error' state which resets the -connection and can be call from every state. It is only use if there is no -other way to handle the issue (e.g. client-side close of the connection). -If possible we should use http-status 500 ('internal server error') and -log the issue in the errorlog. - -If we have to take care of some data which is coming in after we ran into -the error condition the 'close' state is used the init a half-close and -read all the delay packet from the network. - -Sub-Requests (lightblue) ------------------------- - -The FastCGI, CGI, ... intergration is done by introducing a loop in -'handlereq' to handle all aspect which are neccesary to find out what has -to be sent back to the client. - -Functions -========= - -Important functions used by the state-engine - -:state-engine: - -- ``connection_state_machine()`` - -:connect: - -- (nothing) - -:reqstart: - -- (nothing) - -:read: - -- ``connection_handle_read_state()`` -- ``connection_handle_read()`` - -:reqend: - -- ``http_request_parse()`` - -:readpost: - -- ``connection_handle_read_state()`` -- ``connection_handle_read()`` - -:handlereq: - -- ``http_response_prepare()`` - -:respstart: - -- ``connection_handle_write_prepare()`` - -:write: - -- ``connection_handle_write()`` - -:respend: - -- ``plugins_call_handle_request_done()`` -- ``plugins_call_handle_connection_close()`` -- ``connection_close()`` (if not keep-alive) -- ``connection_reset()`` - -:error: - -- ``plugins_call_handle_request_done()`` -- ``plugins_call_handle_connection_close()`` -- ``connection_reset()`` - -:close: - -- ``connection_close()`` |