Fixed SSL support on the httpd component, and also on the EiffelWeb standalone connector.
- the standalone connector support for SSL, is using certicate files for now (no in-memory support).
- to enable ssl support, set ecf variable `httpd_ssl_enabled=true`.
- added the `simple_ssl` example to demonstrate how to have standalone ssl server.
(be careful when using EiffelNet SSL and the http_client library, disable the libcurl
via ecf variable `libcurl_http_client_disabled=true` )
Added support for recv timeout to the EiffelWeb standalone connector.
- made EiffelWeb compilable with 16.05 and upcoming 16.11.
Done via ecfs condition on version to accept EiffelNet with recv_timeout (from 16.11), and without (until 16.05).
- adding recv timeout prevents server to hang for ever if a client wait too long to send data.
Updated various comments.
This commit is contained in:
@@ -2,14 +2,27 @@ note
|
||||
description: "[
|
||||
Component to launch the service using the default connector
|
||||
|
||||
Eiffel Web httpd for this class
|
||||
EiffelWeb httpd for this class
|
||||
|
||||
The httpd default connector support options:
|
||||
verbose: to display verbose output
|
||||
port: numeric such as 8099 (or equivalent string as "8099")
|
||||
base: base_url (very specific to standalone server)
|
||||
|
||||
max_concurrent_connections: set one, for single threaded behavior
|
||||
max_tcp_clients: max number of open tcp connection
|
||||
|
||||
socket_timeout: connection timeout
|
||||
socket_recv_timeout: read data timeout
|
||||
|
||||
keep_alive_timeout: amount of time the server will wait for subsequent
|
||||
requests on a persistent connection,
|
||||
max_keep_alive_requests: number of requests allowed on a persistent connection,
|
||||
|
||||
ssl_enabled: set to True for https support.
|
||||
ssl_ca_crt: path to the certificat crt file (relevant when ssl_enabled is True)
|
||||
ssl_ca_key: path to the certificat key file (relevant when ssl_enabled is True)
|
||||
|
||||
The httpd default connector support options:
|
||||
port: numeric such as 8099 (or equivalent string as "8099")
|
||||
base: base_url (very specific to standalone server)
|
||||
verbose: to display verbose output, useful for standalone connector
|
||||
force_single_threaded: use only one thread, useful for standalone connector
|
||||
|
||||
check WSF_SERVICE_LAUNCHER for more documentation
|
||||
]"
|
||||
@@ -41,12 +54,13 @@ feature {NONE} -- Initialization
|
||||
create on_launched_actions
|
||||
create on_stopped_actions
|
||||
|
||||
port_number := 80 --| Default, but quite often, this port is already used ...
|
||||
max_concurrent_connections := 100
|
||||
max_tcp_clients := 100
|
||||
socket_timeout := 300 -- 300 seconds
|
||||
keep_alive_timeout := 15 -- 15 seconds.
|
||||
max_keep_alive_requests := 100
|
||||
port_number := {WGI_STANDALONE_CONSTANTS}.default_http_server_port --| Default, but quite often, this port is already used ...
|
||||
max_concurrent_connections := {WGI_STANDALONE_CONSTANTS}.default_max_concurrent_connections
|
||||
max_tcp_clients := {WGI_STANDALONE_CONSTANTS}.default_max_tcp_clients
|
||||
socket_timeout := {WGI_STANDALONE_CONSTANTS}.default_socket_timeout -- seconds
|
||||
socket_recv_timeout := {WGI_STANDALONE_CONSTANTS}.default_socket_recv_timeout -- seconds
|
||||
keep_alive_timeout := {WGI_STANDALONE_CONSTANTS}.default_keep_alive_timeout -- seconds.
|
||||
max_keep_alive_requests := {WGI_STANDALONE_CONSTANTS}.default_max_keep_alive_requests
|
||||
verbose := False
|
||||
verbose_level := notice_level
|
||||
|
||||
@@ -59,6 +73,7 @@ feature {NONE} -- Initialization
|
||||
if attached {READABLE_STRING_GENERAL} opts.option ("base") as l_base_str then
|
||||
base_url := l_base_str.as_string_8
|
||||
end
|
||||
|
||||
verbose := opts.option_boolean_value ("verbose", verbose)
|
||||
-- See `{HTTPD_REQUEST_HANDLER_I}.*_verbose_level`
|
||||
|
||||
@@ -96,8 +111,16 @@ feature {NONE} -- Initialization
|
||||
max_concurrent_connections := opts.option_integer_value ("max_concurrent_connections", max_concurrent_connections)
|
||||
max_tcp_clients := opts.option_integer_value ("max_tcp_clients", max_tcp_clients)
|
||||
socket_timeout := opts.option_integer_value ("socket_timeout", socket_timeout)
|
||||
socket_recv_timeout := opts.option_integer_value ("socket_recv_timeout", socket_recv_timeout)
|
||||
keep_alive_timeout := opts.option_integer_value ("keep_alive_timeout", keep_alive_timeout)
|
||||
max_keep_alive_requests := opts.option_integer_value ("max_keep_alive_requests", max_keep_alive_requests)
|
||||
|
||||
if
|
||||
opts.option_boolean_value ("ssl_enabled", ssl_enabled) and then
|
||||
attached opts.option_string_32_value ("ssl_protocol", "tls_1_2") as ssl_prot
|
||||
then
|
||||
ssl_settings := [ssl_prot, opts.option_string_32_value ("ssl_ca_crt", Void), opts.option_string_32_value ("ssl_ca_key", Void)]
|
||||
end
|
||||
end
|
||||
|
||||
create conn.make
|
||||
@@ -120,11 +143,13 @@ feature -- Execution
|
||||
do
|
||||
cfg.set_is_verbose (verbose)
|
||||
cfg.set_verbose_level (verbose_level)
|
||||
cfg.set_ssl_settings (ssl_settings)
|
||||
cfg.set_http_server_name (server_name)
|
||||
cfg.http_server_port := port_number
|
||||
cfg.set_max_concurrent_connections (max_concurrent_connections)
|
||||
cfg.set_max_tcp_clients (max_tcp_clients)
|
||||
cfg.set_socket_timeout (socket_timeout)
|
||||
cfg.set_socket_recv_timeout (socket_recv_timeout)
|
||||
cfg.set_keep_alive_timeout (keep_alive_timeout)
|
||||
cfg.set_max_keep_alive_requests (max_keep_alive_requests)
|
||||
end
|
||||
@@ -140,11 +165,17 @@ feature -- Execution
|
||||
debug ("ew_standalone")
|
||||
if verbose then
|
||||
io.error.put_string ("Launching standalone web server on port " + port_number.out)
|
||||
if attached server_name as l_name then
|
||||
io.error.put_string ("%N http://" + l_name + ":" + port_number.out + "/" + base_url + "%N")
|
||||
if ssl_enabled then
|
||||
io.error.put_string ("%N https://")
|
||||
else
|
||||
io.error.put_string ("%N http://localhost:" + port_number.out + "/" + base_url + "%N")
|
||||
io.error.put_string ("%N http://")
|
||||
end
|
||||
if attached server_name as l_name then
|
||||
io.error.put_string (l_name)
|
||||
else
|
||||
io.error.put_string ("localhost")
|
||||
end
|
||||
io.error.put_string (":" + port_number.out + "/" + base_url + "%N")
|
||||
end
|
||||
end
|
||||
update_configuration (conn.configuration)
|
||||
@@ -177,9 +208,18 @@ feature {NONE} -- Implementation
|
||||
-- Help defining the verbosity.
|
||||
-- The higher, the more output.
|
||||
|
||||
ssl_settings: detachable TUPLE [protocol: READABLE_STRING_GENERAL; ca_crt, ca_key: detachable READABLE_STRING_GENERAL]
|
||||
|
||||
ssl_enabled: BOOLEAN
|
||||
-- Is secure server? i.e using SSL?
|
||||
do
|
||||
Result := attached ssl_settings as ssl and then attached ssl.protocol as prot and then not prot.is_whitespace
|
||||
end
|
||||
|
||||
max_concurrent_connections: INTEGER
|
||||
max_tcp_clients: INTEGER
|
||||
socket_timeout: INTEGER
|
||||
socket_recv_timeout: INTEGER
|
||||
keep_alive_timeout: INTEGER
|
||||
max_keep_alive_requests: INTEGER
|
||||
|
||||
|
||||
@@ -22,11 +22,11 @@ note
|
||||
For instance, you can use
|
||||
create s.make_and_launch_and_options (agent execute, <<["port", 8099]>>)
|
||||
|
||||
And if Nino is the default connector it will support:
|
||||
And if the connector is the Standalone connector,
|
||||
check {WSF_STANDALONE_SERVICE_LAUNCHER} for options description, such as:
|
||||
port: numeric such as 8099 (or equivalent string as "8099")
|
||||
base: base_url (very specific to standalone server)
|
||||
force_single_threaded: use only one thread, useful for Nino
|
||||
verbose: to display verbose output, useful for Nino
|
||||
verbose: to display verbose output.
|
||||
]"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
@@ -8,8 +8,8 @@ note
|
||||
force_single_threaded: use only one thread, useful for Nino
|
||||
verbose: to display verbose output, useful for Nino
|
||||
]"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
date: "$Date: 2016-08-06 13:34:52 +0200 (sam., 06 août 2016) $"
|
||||
revision: "$Revision: 99106 $"
|
||||
|
||||
class
|
||||
WSF_SERVICE_LAUNCHER_OPTIONS
|
||||
@@ -85,6 +85,12 @@ feature -- Access
|
||||
|
||||
feature -- Helpers
|
||||
|
||||
has_option (a_opt_name: READABLE_STRING_GENERAL): BOOLEAN
|
||||
-- Is there any value associated to option name `a_opt_name'?
|
||||
do
|
||||
Result := attached option (a_opt_name)
|
||||
end
|
||||
|
||||
has_integer_option (a_opt_name: READABLE_STRING_GENERAL): BOOLEAN
|
||||
-- Is there any INTEGER value associated to option name `a_opt_name'?
|
||||
local
|
||||
@@ -100,6 +106,29 @@ feature -- Helpers
|
||||
end
|
||||
end
|
||||
|
||||
has_string_32_option (a_opt_name: READABLE_STRING_GENERAL): BOOLEAN
|
||||
-- Is there any string 32 value associated to option name `a_opt_name'?
|
||||
do
|
||||
if attached option (a_opt_name) as opt then
|
||||
Result := attached {READABLE_STRING_GENERAL} opt
|
||||
end
|
||||
end
|
||||
|
||||
option_string_32_value (a_opt_name: READABLE_STRING_GENERAL; a_default: detachable READABLE_STRING_GENERAL): detachable IMMUTABLE_STRING_32
|
||||
-- Unicode String value associated to option name `a_opt_name', other return `a_default'.
|
||||
do
|
||||
if attached option (a_opt_name) as opt then
|
||||
if attached {READABLE_STRING_32} opt as s32 then
|
||||
create Result.make_from_string (s32)
|
||||
elseif attached {READABLE_STRING_GENERAL} opt as s then
|
||||
create Result.make_from_string_general (s)
|
||||
end
|
||||
end
|
||||
if Result = Void and a_default /= Void then
|
||||
create Result.make_from_string_general (a_default)
|
||||
end
|
||||
end
|
||||
|
||||
option_integer_value (a_opt_name: READABLE_STRING_GENERAL; a_default: INTEGER): INTEGER
|
||||
-- INTEGER value associated to option name `a_opt_name', other return `a_default'.
|
||||
local
|
||||
|
||||
Reference in New Issue
Block a user