Annotation of embedaddon/lighttpd/doc/outdated/state.txt, revision 1.1
1.1 ! misho 1: ============================
! 2: The State Engine of lighttpd
! 3: ============================
! 4:
! 5: ------------
! 6: Module: core
! 7: ------------
! 8:
! 9: :Author: Jan Kneschke
! 10: :Date: $Date: 2004/08/01 07:01:29 $
! 11: :Revision: $Revision: 1.1 $
! 12:
! 13: :abstract:
! 14: This is a short summary of the state-engine which is driving the lighttpd
! 15: webserver. It describes the basic concepts and the way the different parts
! 16: of the server are connected.
! 17:
! 18: .. meta::
! 19: :keywords: lighttpd, state-engine
! 20:
! 21: .. contents:: Table of Contents
! 22:
! 23: Description
! 24: ===========
! 25:
! 26: States
! 27: ------
! 28:
! 29: The state-engine is currently made of 11 states which are walk-through on
! 30: the way each connection. Some of them are specific for a special operation
! 31: and some may never be hit at all.
! 32:
! 33: :connect:
! 34: waiting for a connection
! 35: :reqstart:
! 36: init the read-idle timer
! 37: :read:
! 38: read http-request-header from network
! 39: :reqend:
! 40: parse request
! 41: :readpost:
! 42: read http-request-content from network
! 43: :handlereq:
! 44: handle the request internally (might result in sub-requests)
! 45: :respstart:
! 46: prepare response header
! 47: :write:
! 48: write response-header + content to network
! 49: :respend:
! 50: cleanup environment, log request
! 51: :error:
! 52: reset connection (incl. close())
! 53: :close:
! 54: close connection (handle lingering close)
! 55:
! 56: .. image:: state.png
! 57:
! 58: A simple GET request (green path)
! 59: ---------------------------------
! 60:
! 61: The connection is idling in the 'connect' state waiting for a connection.
! 62: As soon as the connection is set up we init the read-timer in 'reqstart'
! 63: and start to read data from the network. As soon as we get the
! 64: HTTP-request terminator (CRLFCRLF) we forward the header to the parser.
! 65:
! 66: The parsed request is handled by 'handlereq' and as soon as a decision out
! 67: the request is made it is sent to 'respstart' to prepare the
! 68: HTTP-response header. In the 'write' state the prepare content is sent out
! 69: to the network. When everything is sent 'respend' is entered to log the
! 70: request and cleanup the environment. After the close() call the connection
! 71: is set back to the 'connect' state again.
! 72:
! 73: Keep-Alive (blue path)
! 74: ----------------------
! 75:
! 76: The Keep-Alive handling is implemented by going from the 'respend'
! 77: directly to 'reqstart' without the close() and the accept() calls.
! 78:
! 79: POST requests (grey path)
! 80: -------------------------
! 81:
! 82: As requests might contain a request-body the state 'readpost' entered as
! 83: soon as the header is parsed and we know how much data we expect.
! 84:
! 85: Pipelining
! 86: ----------
! 87:
! 88: HTTP/1.1 supportes pipelining (sending multiple requests without waiting
! 89: for the response of the first request). This is handled transparently by
! 90: the 'read' state.
! 91:
! 92: Unexpected errors (red path)
! 93: ----------------------------
! 94:
! 95: For really hard errors we use the 'error' state which resets the
! 96: connection and can be call from every state. It is only use if there is no
! 97: other way to handle the issue (e.g. client-side close of the connection).
! 98: If possible we should use http-status 500 ('internal server error') and
! 99: log the issue in the errorlog.
! 100:
! 101: If we have to take care of some data which is coming in after we ran into
! 102: the error condition the 'close' state is used the init a half-close and
! 103: read all the delay packet from the network.
! 104:
! 105: Sub-Requests (lightblue)
! 106: ------------------------
! 107:
! 108: The FastCGI, CGI, ... intergration is done by introducing a loop in
! 109: 'handlereq' to handle all aspect which are neccesary to find out what has
! 110: to be sent back to the client.
! 111:
! 112: Functions
! 113: =========
! 114:
! 115: Important functions used by the state-engine
! 116:
! 117: :state-engine:
! 118:
! 119: - ``connection_state_machine()``
! 120:
! 121: :connect:
! 122:
! 123: - (nothing)
! 124:
! 125: :reqstart:
! 126:
! 127: - (nothing)
! 128:
! 129: :read:
! 130:
! 131: - ``connection_handle_read_state()``
! 132: - ``connection_handle_read()``
! 133:
! 134: :reqend:
! 135:
! 136: - ``http_request_parse()``
! 137:
! 138: :readpost:
! 139:
! 140: - ``connection_handle_read_state()``
! 141: - ``connection_handle_read()``
! 142:
! 143: :handlereq:
! 144:
! 145: - ``http_response_prepare()``
! 146:
! 147: :respstart:
! 148:
! 149: - ``connection_handle_write_prepare()``
! 150:
! 151: :write:
! 152:
! 153: - ``connection_handle_write()``
! 154:
! 155: :respend:
! 156:
! 157: - ``plugins_call_handle_request_done()``
! 158: - ``plugins_call_handle_connection_close()``
! 159: - ``connection_close()`` (if not keep-alive)
! 160: - ``connection_reset()``
! 161:
! 162: :error:
! 163:
! 164: - ``plugins_call_handle_request_done()``
! 165: - ``plugins_call_handle_connection_close()``
! 166: - ``connection_reset()``
! 167:
! 168: :close:
! 169:
! 170: - ``connection_close()``
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>