diff --git a/docs/workbook/basics/basics.md b/docs/workbook/basics/basics.md index 2fc0e40f..f8b41b1b 100644 --- a/docs/workbook/basics/basics.md +++ b/docs/workbook/basics/basics.md @@ -59,7 +59,7 @@ feature -- Basic operations end ``` -When using the "standalone" connector (or the deprecated "nino" connector), by default the service listens on port 80, but often this port is already used by other applications, so it is recommended to use another port. +When using the [standalone](../connectors/standalone.md) connector (or the deprecated "nino" connector), by default the service listens on port 80, but often this port is already used by other applications, so it is recommended to use another port. To define another port, redefine the feature `initialize` and set up a new port number using the service options (see below). @@ -86,6 +86,8 @@ feature {NONE} -- Initialization end ``` +Learn more about the [Standalone](../connectors/standalone.md) connector. + The **WSF_REQUEST** gives access to the incoming data; the class provides features to get information such as request method, form data, query parameters, uploaded files, HTTP request headers, and hostname of the client among others. The **WSF_RESPONSE** provides features to define the response with information such as HTTP status codes (10x,20x, 30x, 40x, and 50x), response headers (Content-Type, Content-Length, etc.) and obviously the body of the message itself. diff --git a/docs/workbook/connectors/standalone.md b/docs/workbook/connectors/standalone.md new file mode 100644 index 00000000..4dd0ff46 --- /dev/null +++ b/docs/workbook/connectors/standalone.md @@ -0,0 +1,27 @@ +Nav: [Workbook](../workbook.md) + +## The EiffelWeb standalone connector + +It provides a standalone httpd server for the EiffelWeb framework. +It implements HTTP/1.1 with persistent connection, concurrent connection, ... + +To easily set the standalone connector, see class `WSF_STANDALONE_SERVICE_OPTIONS`. + +### Main settings: + +* `port`: Listening port number (defaut: 80). +* `max_concurrent_connections`: maximum of concurrent connections (default: 100) +* `max_tcp_clients`: Listen on socket for at most `max_tcp_clients` connections (default: 100) +* `socket_timeout`: Amount of seconds the server waits for receipts and transmissions during communications. With timeout of 0, socket can wait for ever. (default: 60) +* `socket_recv_timeout`: Amount of seconds the server waits for receiving data during communications. With timeout of 0, socket can waits for ever. (default: 5) +* `keep_alive_timeout`: Persistent connection timeout. Number of seconds the server waits after a request has been served before it closes the connection (default: 5) +* `max_keep_alive_requests`: Maximum number of requests allowed per persistent connection. To disable KeepAlive, set `max_keep_alive_requests` to `0`. To have no limit, set `max_keep_alive_requests` to `-1` (default: 300). + +* `is_secure`: check SSL certificate? +* `secure_certificate`: path to SSL certificate. +* `secure_certificate_key`: certificate key + +* `verbose`: display verbose output (Default: false) + +See also `WGI_STANDALONE_CONSTANTS` for default values. + diff --git a/examples/websocket/websocket_app.ecf b/examples/websocket/websocket_app.ecf index d14ca0d8..6126f6cb 100644 --- a/examples/websocket/websocket_app.ecf +++ b/examples/websocket/websocket_app.ecf @@ -3,9 +3,9 @@ - /\.svn$ /CVS$ /EIFGENs$ + /\.svn$ + + Single thread solution. + Warning: as it can not handle concurrent request, it is recommended to set Keep-Alive-Timeout to very low value, as browser will keep persistent connection open too long. + + + + + diff --git a/examples/websocket/ws.ini b/examples/websocket/ws.ini index 29179920..87dcb630 100644 --- a/examples/websocket/ws.ini +++ b/examples/websocket/ws.ini @@ -1,13 +1,20 @@ -verbose=true -verbose_level=INFORMATION port=9090 + +#Socket and timeout max_concurrent_connections=100 -keep_alive_timeout=35 max_tcp_clients=100 socket_timeout=30 socket_recv_timeout=5 -max_keep_alive_requests=300 +#Persistent connections +keep_alive_timeout=2 +max_keep_alive_requests=-1 + +#SSL is_secure=false secure_certificate=ca.crt secure_certificate_key=ca.key + +#Debug +verbose=true +verbose_level=INFORMATION diff --git a/library/server/httpd/concurrency/none/httpd_request_handler.e b/library/server/httpd/concurrency/none/httpd_request_handler.e index c033de78..808fb033 100644 --- a/library/server/httpd/concurrency/none/httpd_request_handler.e +++ b/library/server/httpd/concurrency/none/httpd_request_handler.e @@ -8,19 +8,9 @@ deferred class inherit HTTPD_REQUEST_HANDLER_I - redefine - is_persistent_connection_supported - end - -feature -- Status report - - is_persistent_connection_supported: BOOLEAN = False - -- - -- When there is no concurrency support, do not try to support - -- persistent connection! note - copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" + copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software diff --git a/library/server/httpd/configuration/httpd_constants.e b/library/server/httpd/configuration/httpd_constants.e index 80fbef03..2a0ed315 100644 --- a/library/server/httpd/configuration/httpd_constants.e +++ b/library/server/httpd/configuration/httpd_constants.e @@ -25,8 +25,8 @@ feature -- Default timeout settings feature -- Default persistent connection settings - default_keep_alive_timeout: INTEGER = 15 -- seconds - default_max_keep_alive_requests: INTEGER = 100 + default_keep_alive_timeout: INTEGER = 5 -- seconds + default_max_keep_alive_requests: INTEGER = 300 note copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" diff --git a/library/server/httpd/httpd_request_handler_i.e b/library/server/httpd/httpd_request_handler_i.e index d2598206..c61a1759 100644 --- a/library/server/httpd/httpd_request_handler_i.e +++ b/library/server/httpd/httpd_request_handler_i.e @@ -140,7 +140,8 @@ feature -- Settings is_persistent_connection_supported: BOOLEAN -- Is persistent connection supported? do - Result := {HTTPD_SERVER}.is_persistent_connection_supported and then max_keep_alive_requests > 0 + Result := {HTTPD_SERVER}.is_persistent_connection_supported and then + max_keep_alive_requests /= 0 --| `-1` no limit end is_next_persistent_connection_supported: BOOLEAN @@ -247,7 +248,8 @@ feature -- Execution l_exit loop n := n + 1 - if n >= m then + -- If `m` is `-1`, no limit for the number of keep_alive requests. + if m >= 0 and n >= m then is_next_persistent_connection_supported := False elseif n > 1 and is_verbose then log ("Reuse connection (" + n.out + ")", information_level) diff --git a/library/server/wsf/connector/standalone/wsf_standalone_service_options.e b/library/server/wsf/connector/standalone/wsf_standalone_service_options.e index b537ecf2..c3fa0c20 100644 --- a/library/server/wsf/connector/standalone/wsf_standalone_service_options.e +++ b/library/server/wsf/connector/standalone/wsf_standalone_service_options.e @@ -66,7 +66,7 @@ feature -- Access: connection end max_tcp_clients: INTEGER assign set_max_tcp_clients - -- Listen on socket for at most `queue' connections. + -- Listen on socket for at most `max_tcp_clients' connections. do Result := option_integer_value ("max_tcp_clients", 0) end @@ -104,11 +104,26 @@ feature -- Access: persistent connection -- Maximum number of requests allowed per persistent connection. -- Recommended a high setting. -- To disable KeepAlive, set `max_keep_alive_requests' to 0. + -- To have no limit, set `max_keep_alive_requests' to -1. -- By default: {HTTPD_CONFIGURATION_I}.default_max_keep_alive_requests . do Result := option_integer_value ("max_keep_alive_requests", 0) end + persistent_connection_disabled: BOOLEAN + -- Persistent connection disabled? + -- (or Keep-Alive disabled). + do + Result := max_keep_alive_requests = 0 + end + + has_unlimited_keep_alive_requests: BOOLEAN + -- Has unlimited count of keep alive requests. + -- i.e no limit of number of requests allowed per persistent connection. + do + Result := max_keep_alive_requests < 0 + end + feature -- Access: SSL is_secure: BOOLEAN assign set_is_secure @@ -205,6 +220,16 @@ feature -- Element change set_numeric_option ("max_keep_alive_requests", nb) end + set_unlimited_keep_alive_requests + do + set_max_keep_alive_requests (-1) + end + + disable_persistent_connection + do + set_max_keep_alive_requests (0) + end + set_is_secure (b: BOOLEAN) -- Set secured connection enabled to `b'. -- i.e if connection is using SSL/TLS.