Renamed many classes and feature to use "secure" term instead of "ssl". (note, the .ecf are still using the "ssl" terminologie).

Provided easy way to set secure settings for Standalone.
For wsf launcher boolean option accept "true" or "yes" for True boolean, anything else is False.
This commit is contained in:
2016-10-14 11:52:48 +02:00
parent 01a9d02586
commit d4ec640ac8
47 changed files with 483 additions and 298 deletions

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="debug" uuid="AA458565-7711-4BE1-ADA3-91716EABFA21" library_target="debug"> <system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="debug" uuid="AA458565-7711-4BE1-ADA3-91716EABFA21" library_target="debug_standalone">
<target name="common" abstract="true"> <target name="common" abstract="true">
<file_rule> <file_rule>
<exclude>/EIFGENs$</exclude> <exclude>/EIFGENs$</exclude>
@@ -18,7 +18,7 @@
</target> </target>
<target name="debug_any" extends="common"> <target name="debug_any" extends="common">
<root class="EWF_DEBUG_SERVER" feature="make_and_launch"/> <root class="EWF_DEBUG_SERVER" feature="make_and_launch"/>
<setting name="concurrency" value="thread"/> <setting name="concurrency" value="scoop"/>
<library name="cgi" location="..\..\library\server\wsf\connector\cgi-safe.ecf" readonly="false"/> <library name="cgi" location="..\..\library\server\wsf\connector\cgi-safe.ecf" readonly="false"/>
<library name="libfcgi" location="..\..\library\server\wsf\connector\libfcgi-safe.ecf" readonly="false"/> <library name="libfcgi" location="..\..\library\server\wsf\connector\libfcgi-safe.ecf" readonly="false"/>
<library name="standalone" location="..\..\library\server\wsf\connector\standalone-safe.ecf" readonly="false"/> <library name="standalone" location="..\..\library\server\wsf\connector\standalone-safe.ecf" readonly="false"/>
@@ -27,7 +27,7 @@
</target> </target>
<target name="debug_standalone" extends="common"> <target name="debug_standalone" extends="common">
<root class="EWF_DEBUG_SERVER" feature="make_and_launch"/> <root class="EWF_DEBUG_SERVER" feature="make_and_launch"/>
<setting name="concurrency" value="thread"/> <setting name="concurrency" value="scoop"/>
<library name="default_standalone" location="..\..\library\server\wsf\default\standalone-safe.ecf" readonly="false"/> <library name="default_standalone" location="..\..\library\server\wsf\default\standalone-safe.ecf" readonly="false"/>
<cluster name="launcher" location=".\launcher\default\" recursive="true"/> <cluster name="launcher" location=".\launcher\default\" recursive="true"/>
<cluster name="src" location=".\src\" recursive="true"/> <cluster name="src" location=".\src\" recursive="true"/>
@@ -44,6 +44,4 @@
<cluster name="launcher" location=".\launcher\default\" recursive="true"/> <cluster name="launcher" location=".\launcher\default\" recursive="true"/>
<cluster name="src" location=".\src\" recursive="true"/> <cluster name="src" location=".\src\" recursive="true"/>
</target> </target>
<target name="debug" extends="debug_standalone">
</target>
</system> </system>

2
examples/debug/debug.ini Normal file
View File

@@ -0,0 +1,2 @@
port=9090
verbose=true

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="simple" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486" library_target="simple"> <system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="simple" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486" library_target="simple_standalone">
<target name="common" abstract="true"> <target name="common" abstract="true">
<file_rule> <file_rule>
<exclude>/.svn$</exclude> <exclude>/.svn$</exclude>
@@ -16,13 +16,20 @@
</target> </target>
<target name="simple_standalone" extends="common"> <target name="simple_standalone" extends="common">
<root class="APPLICATION" feature="make_and_launch"/> <root class="APPLICATION" feature="make_and_launch"/>
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional"> <option debug="false" warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
<debug name="dbglog" enabled="true"/>
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/> <assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
</option> </option>
<setting name="concurrency" value="scoop"/> <setting name="concurrency" value="scoop"/>
<library name="default_standalone" location="..\..\library\server\wsf\default\standalone-safe.ecf"/> <library name="default_standalone" location="..\..\library\server\wsf\default\standalone-safe.ecf"/>
<cluster name="simple" location=".\" recursive="true"/> <cluster name="simple" location=".\" recursive="true"/>
</target> </target>
<target name="simple_standalone_mt" extends="simple_standalone">
<setting name="concurrency" value="thread"/>
</target>
<target name="simple_standalone_st" extends="simple_standalone">
<setting name="concurrency" value="none"/>
</target>
<target name="simple_cgi" extends="common"> <target name="simple_cgi" extends="common">
<root class="APPLICATION" feature="make_and_launch"/> <root class="APPLICATION" feature="make_and_launch"/>
<option warning="true" is_attached_by_default="true" void_safety="transitional" syntax="transitional"> <option warning="true" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
@@ -39,6 +46,4 @@
<library name="default_libfcgi" location="..\..\library\server\wsf\default\libfcgi-safe.ecf"/> <library name="default_libfcgi" location="..\..\library\server\wsf\default\libfcgi-safe.ecf"/>
<cluster name="simple" location=".\" recursive="true"/> <cluster name="simple" location=".\" recursive="true"/>
</target> </target>
<target name="simple" extends="simple_standalone">
</target>
</system> </system>

View File

@@ -2,7 +2,8 @@ verbose=true
verbose_level=ALERT verbose_level=ALERT
port=9090 port=9090
#max_concurrent_connections=100 #max_concurrent_connections=100
#keep_alive_timeout=15 keep_alive_timeout=3
#max_tcp_clients=100 #max_tcp_clients=100
#socket_timeout=300 socket_timeout=60
socket_recv_timeout=15
#max_keep_alive_requests=300 #max_keep_alive_requests=300

View File

@@ -17,11 +17,11 @@ port=9090
#keep_alive_timeout=15 #keep_alive_timeout=15
#max_keep_alive_requests=100 #max_keep_alive_requests=100
### SSL settings ### Secure connection settings
# enable SSL, with file certificate. # enable SSL, with file certificate.
ssl_enabled=true is_secure=true
ssl_ca_key=simple.key secure_certificate=ca.crt
ssl_ca_crt=simple.crt secure_certificate_key=ca.key
### App settings ### App settings
verbose=true verbose=true

View File

@@ -14,16 +14,18 @@ feature {NONE} -- Initialization
make_and_launch make_and_launch
local local
l_launcher: WSF_STANDALONE_WEBSOCKET_SERVICE_LAUNCHER [APPLICATION_EXECUTION] l_launcher: WSF_STANDALONE_WEBSOCKET_SERVICE_LAUNCHER [APPLICATION_EXECUTION]
opts: WSF_SERVICE_LAUNCHER_OPTIONS opts: WSF_STANDALONE_WEBSOCKET_SERVICE_OPTIONS
do do
create {WSF_SERVICE_LAUNCHER_OPTIONS_FROM_INI} opts.make_from_file ("ws.ini") create opts
create l_launcher.make_and_launch (options) if opts.is_secure_connection_supported then
end opts.is_secure := True
opts.set_secure_protocol_to_tls_1_2
opts.secure_certificate := "ca.crt"
opts.secure_certificate_key := "ca.key"
end
options: WSF_SERVICE_LAUNCHER_OPTIONS opts.import_ini_file_options ("ws.ini")
-- Initialize current service. create l_launcher.make_and_launch (opts)
do
create {WSF_SERVICE_LAUNCHER_OPTIONS_FROM_INI} Result.make_from_file ("ws.ini")
end end
end end

View File

@@ -88,7 +88,7 @@ feature -- HTML Resource
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script src="##HTTPSCHEME##://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript"> <script type="text/javascript">
$(document).ready(function() { $(document).ready(function() {
@@ -96,7 +96,7 @@ $(document).ready(function() {
function connect(){ function connect(){
var host = "ws://127.0.0.1:##PORTNUMBER##"; var host = "##WSSCHEME##://127.0.0.1:##PORTNUMBER##";
try{ try{
socket = new WebSocket(host); socket = new WebSocket(host);
@@ -178,6 +178,13 @@ body {font-family:Arial, Helvetica, sans-serif;}
</html> </html>
]" ]"
Result.replace_substring_all ("##PORTNUMBER##", a_port.out) Result.replace_substring_all ("##PORTNUMBER##", a_port.out)
if request.is_https then
Result.replace_substring_all ("##HTTPSCHEME##", "https")
Result.replace_substring_all ("##WSSCHEME##", "wss")
else
Result.replace_substring_all ("##HTTPSCHEME##", "http")
Result.replace_substring_all ("##WSSCHEME##", "ws")
end
end end

15
examples/websocket/ca.crt Normal file
View File

@@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE-----
MIICWDCCAcGgAwIBAgIJAJnXGtV+PtiYMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTUwNDAzMjIxNTA0WhcNMTYwNDAyMjIxNTA0WjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
gQDFMK6ojzg+KlklhTossR13c51izMgGc3B0z9ttfHIcx2kxra3HtHcKIl5wSUvn
G8zmSyFAyQTs5LUv65q46FM9qU8tP+vTeFCfNXvjRcIEpouta3J53K0xuUlxz4d4
4D6qvdDWAez/0AkI4y5etW5zXtg7IQorJhsI9TmfGuruzwIDAQABo1AwTjAdBgNV
HQ4EFgQUbWpk2HoHa0YqpEwr7CGEatBFTMkwHwYDVR0jBBgwFoAUbWpk2HoHa0Yq
pEwr7CGEatBFTMkwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAi+h4/
IgEocWkdRZBKHEcTrRxz5WhEDJMoVo9LhnXvCfn1G/4p6Un6sYv7Xzpi9NuSY8uV
cjfJJXhtF3AtyZ70iTAxWaRWjGaZ03PYOjlledJ5rqJEt6CCn8m+JsfznduZvbxQ
zQ6jCLXfyD/tvemB+yYEI3NntvRKx5/zt6Q26Q==
-----END CERTIFICATE-----

15
examples/websocket/ca.key Normal file
View File

@@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDFMK6ojzg+KlklhTossR13c51izMgGc3B0z9ttfHIcx2kxra3H
tHcKIl5wSUvnG8zmSyFAyQTs5LUv65q46FM9qU8tP+vTeFCfNXvjRcIEpouta3J5
3K0xuUlxz4d44D6qvdDWAez/0AkI4y5etW5zXtg7IQorJhsI9TmfGuruzwIDAQAB
AoGAR5efMg+dieRyLU8rieJcImxVbfOPg9gRsjdtIVkXTR+RL7ow59q7hXBo/Td/
WU8cm1gXoJ/bK+71YYqWyB+BaLRIWvRWb7Gdw203tu4e136Ca5uuY+71qdbVTVcl
NQ7J+T+eAQFP+a+DdT3ZQxu9eze87SMbu6i5YSpIk2kusOECQQDunv/DQ+nc+NgR
DF+Td3sNYUVRT9a1CWi6abAG6reXwp8MS4NobWDf+Ps4JODhEEwlIdq5qL7qqYBZ
Gc1TJJ53AkEA0404Fn6vAzzegBcS4RLlYTK7nMr0m4pMmDMCI6YzAYdMmKHp1e6f
IwxSmQrmwyAgwcT01bc0+A8yipcC2BWQaQJBAJ01QZm635OGmos41KsKF5bsE8gL
SpBBH69Yu/ECqGwie7iU84FUNnO4zIHjwghlPVVlZX3Vz9o4S+fn2N9DC+cCQGyZ
QyCxGdC0r5fbwHJQS/ZQn+UGfvlVzqoXDVMVn3t6ZES6YZrT61eHnOM5qGqklIxE
Old3vDZXPt/MU8Zvk3kCQBOgUx2VxvTrHN37hk9/QIDiM62+RenBm1M3ah8xTosf
1mSeEb6d9Kwb3TgPBmA7YXzJuAQfRIvEPMPxT5SSr6Q=
-----END RSA PRIVATE KEY-----

View File

@@ -18,4 +18,7 @@
<library name="wsf" location="..\..\library\server\wsf\wsf-safe.ecf"/> <library name="wsf" location="..\..\library\server\wsf\wsf-safe.ecf"/>
<cluster name="app" location=".\" recursive="true"/> <cluster name="app" location=".\" recursive="true"/>
</target> </target>
<target name="websocket_app_ssl" extends="websocket_app">
<variable name="ssl_enabled" value="true"/>
</target>
</system> </system>

View File

@@ -6,3 +6,7 @@ keep_alive_timeout=35
max_tcp_clients=100 max_tcp_clients=100
socket_timeout=30000 socket_timeout=30000
max_keep_alive_requests=3000 max_keep_alive_requests=3000
is_secure=false
secure_certificate=ca.crt
secure_certificate_key=ca.key

View File

@@ -40,12 +40,12 @@ feature {NONE} -- Internal
then then
l_socket := l_persistent_connection.socket l_socket := l_persistent_connection.socket
if a_is_https then if a_is_https then
if attached {HTTP_STREAM_SSL_SOCKET} l_socket as l_ssl_socket then if attached {HTTP_STREAM_SECURE_SOCKET} l_socket as l_ssl_socket then
Result := l_ssl_socket Result := l_ssl_socket
else else
l_socket := Void l_socket := Void
end end
elseif attached {HTTP_STREAM_SSL_SOCKET} l_socket as l_ssl_socket then elseif attached {HTTP_STREAM_SECURE_SOCKET} l_socket as l_ssl_socket then
l_socket := Void l_socket := Void
end end
if l_socket /= Void and then not l_socket.is_connected then if l_socket /= Void and then not l_socket.is_connected then
@@ -59,7 +59,7 @@ feature {NONE} -- Internal
else else
session.set_persistent_connection (Void) session.set_persistent_connection (Void)
if a_is_https then if a_is_https then
create {HTTP_STREAM_SSL_SOCKET} Result.make_client_by_port (a_port, a_host) create {HTTP_STREAM_SECURE_SOCKET} Result.make_client_by_port (a_port, a_host)
else else
create Result.make_client_by_port (a_port, a_host) create Result.make_client_by_port (a_port, a_host)
end end

View File

@@ -22,7 +22,7 @@
</condition> </condition>
</external_include> </external_include>
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/> <library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
<library name="net" location="$ISE_LIBRARY\library\net\net-safe.ecf" readonly="false"/> <library name="net" location="$ISE_LIBRARY\library\net\net-safe.ecf"/>
<library name="net_ssl" location="$ISE_LIBRARY\unstable\library\network\socket\netssl\net_ssl-safe.ecf"> <library name="net_ssl" location="$ISE_LIBRARY\unstable\library\network\socket\netssl\net_ssl-safe.ecf">
<condition> <condition>
<custom name="ssl_enabled" value="true"/> <custom name="ssl_enabled" value="true"/>
@@ -94,6 +94,5 @@
</condition> </condition>
</cluster> </cluster>
</cluster> </cluster>
</target> </target>
</system> </system>

View File

@@ -41,6 +41,13 @@
<version type="compiler" max="16.11.0.0"/> <version type="compiler" max="16.11.0.0"/>
</condition> </condition>
</file_rule> </file_rule>
<cluster name="disabled_ssl_network" location="$|no_ssl\" recursive="true">
<condition>
<custom name="ssl_enabled" excluded_value="true"/>
<custom name="net_ssl_enabled" excluded_value="true"/>
<custom name="httpd_ssl_enabled" excluded_value="true"/>
</condition>
</cluster>
<cluster name="ssl_network" location="$|ssl\" recursive="true"> <cluster name="ssl_network" location="$|ssl\" recursive="true">
<condition> <condition>
<custom name="ssl_enabled" value="true"/> <custom name="ssl_enabled" value="true"/>

View File

@@ -21,10 +21,12 @@ create {NETWORK_STREAM_SOCKET}
feature -- Status report feature -- Status report
is_ssl_supported: BOOLEAN is_secure_connection_supported: BOOLEAN
-- SSL supported? -- SSL/TLS supported?
once once
Result := False Result := False
ensure
Result = {HTTP_SECURE_HELPER}.is_secure_connection_supported
end end
feature -- Input feature -- Input

View File

@@ -0,0 +1,18 @@
note
description: "[
Interface helping using SSL.
For now, mainly for `is_secure_connection_supported' to indicate if current project is compiled with SSL support.
i.e compiled with EiffelNet-SSL library.
]"
date: "$Date$"
revision: "$Revision$"
class
HTTP_SECURE_HELPER
feature -- Status
is_secure_connection_supported: BOOLEAN = False
-- Is Current system compiled with EiffelNet-SSL support?
end

View File

@@ -7,7 +7,7 @@ note
revision: "$Revision$" revision: "$Revision$"
class class
HTTP_STREAM_SSL_SOCKET HTTP_STREAM_SECURE_SOCKET
inherit inherit
HTTP_STREAM_SOCKET HTTP_STREAM_SOCKET
@@ -17,7 +17,7 @@ create
make_client_by_port, make_client_by_address_and_port, make_client_by_port, make_client_by_address_and_port,
make_server_by_port, make_server_by_address_and_port, make_loopback_server_by_port make_server_by_port, make_server_by_address_and_port, make_loopback_server_by_port
create {HTTP_STREAM_SSL_SOCKET} create {HTTP_STREAM_SECURE_SOCKET}
make_from_descriptor_and_address make_from_descriptor_and_address
feature -- Element change feature -- Element change
@@ -29,9 +29,39 @@ feature -- Element change
set_key_file_path (a_key_filename: PATH) set_key_file_path (a_key_filename: PATH)
do do
end end
feature -- SSL Helpers
set_secure_protocol (v: NATURAL)
do
end
set_secure_protocol_to_ssl_2_or_3
-- Set `ssl_protocol' with `Ssl_23'.
do
end
set_secure_protocol_to_tls_1_0
-- Set `ssl_protocol' with `Tls_1_0'.
do
end
set_secure_protocol_to_tls_1_1
-- Set `ssl_protocol' with `Tls_1_1'.
do
end
set_secure_protocol_to_tls_1_2
-- Set `ssl_protocol' with `Tls_1_2'.
do
end
set_secure_protocol_to_dtls_1_0
-- Set `ssl_protocol' with `Dtls_1_0'.
do
end
invariant invariant
ssl_not_supported: not is_ssl_supported -- Current is a Fake SSL interface! secure_connection_not_supported: not is_secure_connection_supported -- Current is a Fake SSL interface!
note note
copyright: "2011-2013, Javier Velilla, Jocelyn Fiat and others" copyright: "2011-2013, Javier Velilla, Jocelyn Fiat and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"

View File

@@ -0,0 +1,18 @@
note
description: "[
Interface helping using SSL.
For now, mainly for `is_secure_connection_supported' to indicate if current project is compiled with SSL support.
i.e compiled with EiffelNet-SSL library.
]"
date: "$Date$"
revision: "$Revision$"
class
HTTP_SECURE_HELPER
feature -- Status
is_secure_connection_supported: BOOLEAN = True
-- Is Current system compiled with EiffelNet-SSL support?
end

View File

@@ -4,7 +4,7 @@ note
revision: "$Revision$" revision: "$Revision$"
class class
HTTP_STREAM_SSL_SOCKET HTTP_STREAM_SECURE_SOCKET
inherit inherit
HTTP_STREAM_SOCKET HTTP_STREAM_SOCKET
@@ -20,7 +20,7 @@ inherit
connect, shutdown, connect, shutdown,
do_accept do_accept
redefine redefine
is_ssl_supported, is_secure_connection_supported,
put_managed_pointer, put_managed_pointer,
read_stream_noexception, read_stream_noexception,
read_into_pointer_noexception, read_into_pointer_noexception,
@@ -32,7 +32,7 @@ inherit
put_managed_pointer -- Redefine to allow support of compiler before 16.11. put_managed_pointer -- Redefine to allow support of compiler before 16.11.
end end
HTTP_STREAM_SSL_SOCKET_EXT HTTP_STREAM_SECURE_SOCKET_EXT
create create
make, make_empty, make, make_empty,
@@ -44,42 +44,44 @@ create {SSL_NETWORK_STREAM_SOCKET}
feature -- Status report feature -- Status report
is_ssl_supported: BOOLEAN is_secure_connection_supported: BOOLEAN = True
-- SSL supported? -- SSL supported?
once
Result := True feature -- Secure connection Helpers
set_secure_protocol (v: NATURAL)
do
set_tls_protocol (v)
end end
feature -- SSL Helpers set_secure_protocol_to_ssl_2_or_3
set_ssl_protocol_to_ssl_2_or_3
-- Set `ssl_protocol' with `Ssl_23'. -- Set `ssl_protocol' with `Ssl_23'.
do do
set_tls_protocol ({SSL_PROTOCOL}.Ssl_23) set_secure_protocol ({SSL_PROTOCOL}.Ssl_23)
end end
set_ssl_protocol_to_tls_1_0 set_secure_protocol_to_tls_1_0
-- Set `ssl_protocol' with `Tls_1_0'. -- Set `ssl_protocol' with `Tls_1_0'.
do do
set_tls_protocol ({SSL_PROTOCOL}.Tls_1_0) set_secure_protocol ({SSL_PROTOCOL}.Tls_1_0)
end end
set_ssl_protocol_to_tls_1_1 set_secure_protocol_to_tls_1_1
-- Set `ssl_protocol' with `Tls_1_1'. -- Set `ssl_protocol' with `Tls_1_1'.
do do
set_tls_protocol ({SSL_PROTOCOL}.Tls_1_1) set_secure_protocol ({SSL_PROTOCOL}.Tls_1_1)
end end
set_ssl_protocol_to_tls_1_2 set_secure_protocol_to_tls_1_2
-- Set `ssl_protocol' with `Tls_1_2'. -- Set `ssl_protocol' with `Tls_1_2'.
do do
set_tls_protocol ({SSL_PROTOCOL}.Tls_1_2) set_secure_protocol ({SSL_PROTOCOL}.Tls_1_2)
end end
set_ssl_protocol_to_dtls_1_0 set_secure_protocol_to_dtls_1_0
-- Set `ssl_protocol' with `Dtls_1_0'. -- Set `ssl_protocol' with `Dtls_1_0'.
do do
set_tls_protocol ({SSL_PROTOCOL}.Dtls_1_0) set_secure_protocol ({SSL_PROTOCOL}.Dtls_1_0)
end end
feature -- Input feature -- Input

View File

@@ -6,7 +6,7 @@ note
]" ]"
deferred class deferred class
HTTP_STREAM_SSL_SOCKET_EXT HTTP_STREAM_SECURE_SOCKET_EXT
feature {NONE} -- SSL bridge feature {NONE} -- SSL bridge

View File

@@ -6,7 +6,7 @@ note
]" ]"
deferred class deferred class
HTTP_STREAM_SSL_SOCKET_EXT HTTP_STREAM_SECURE_SOCKET_EXT
feature {NONE} -- SSL bridge feature {NONE} -- SSL bridge

View File

@@ -20,6 +20,6 @@
<setting name="concurrency" value="thread"/> <setting name="concurrency" value="thread"/>
</target> </target>
<target name="ws_client_ssl" extends="ws_client"> <target name="ws_client_ssl" extends="ws_client">
<variable name="net_ssl_enabled" value="true"/> <variable name="ssl_enabled" value="true"/>
</target> </target>
</system> </system>

View File

@@ -14,14 +14,14 @@ inherit
feature -- Status report feature -- Status report
is_ssl_supported: BOOLEAN = False is_secure_connection_supported: BOOLEAN = False
feature -- Factory feature -- Factory
new_socket (a_port: INTEGER; a_host: STRING): HTTP_STREAM_SOCKET new_socket (a_port: INTEGER; a_host: STRING): HTTP_STREAM_SOCKET
do do
if is_tunneled then if is_secure then
check ssl_supported: False end check is_secure_connection_supported: False end
end end
create {HTTP_STREAM_SOCKET} Result.make_client_by_port (a_port, a_host) create {HTTP_STREAM_SOCKET} Result.make_client_by_port (a_port, a_host)
end end

View File

@@ -14,37 +14,37 @@ inherit
feature -- Status report feature -- Status report
is_ssl_supported: BOOLEAN = True is_secure_connection_supported: BOOLEAN = True
feature -- Factory feature -- Factory
new_socket (a_port: INTEGER; a_host: STRING): HTTP_STREAM_SOCKET new_socket (a_port: INTEGER; a_host: STRING): HTTP_STREAM_SOCKET
local local
l_ssl: HTTP_STREAM_SSL_SOCKET l_secure: HTTP_STREAM_SECURE_SOCKET
do do
if is_tunneled then if is_secure then
create l_ssl.make_client_by_port (a_port, a_host) create l_secure.make_client_by_port (a_port, a_host)
Result := l_ssl Result := l_secure
if attached ssl_protocol as l_prot then if attached secure_protocol as l_prot then
if l_prot.is_case_insensitive_equal ("ssl_2_3") then if l_prot.is_case_insensitive_equal ("ssl_2_3") then
l_ssl.set_ssl_protocol_to_ssl_2_or_3 l_secure.set_secure_protocol_to_ssl_2_or_3
elseif l_prot.is_case_insensitive_equal ("tls_1_0") then elseif l_prot.is_case_insensitive_equal ("tls_1_0") then
l_ssl.set_ssl_protocol_to_tls_1_0 l_secure.set_secure_protocol_to_tls_1_0
elseif l_prot.is_case_insensitive_equal ("tls_1_1") then elseif l_prot.is_case_insensitive_equal ("tls_1_1") then
l_ssl.set_ssl_protocol_to_tls_1_1 l_secure.set_secure_protocol_to_tls_1_1
elseif l_prot.is_case_insensitive_equal ("tls_1_2") then elseif l_prot.is_case_insensitive_equal ("tls_1_2") then
l_ssl.set_ssl_protocol_to_tls_1_2 l_secure.set_secure_protocol_to_tls_1_2
elseif l_prot.is_case_insensitive_equal ("dtls_1_0") then elseif l_prot.is_case_insensitive_equal ("dtls_1_0") then
l_ssl.set_ssl_protocol_to_dtls_1_0 l_secure.set_secure_protocol_to_dtls_1_0
else -- Default else -- Default
l_ssl.set_ssl_protocol_to_tls_1_2 l_secure.set_secure_protocol_to_tls_1_2
end end
end end
if attached ssl_key_file as k then if attached secure_certificate_file as c then
l_ssl.set_key_file_path (k) l_secure.set_certificate_file_path (c)
end end
if attached ssl_certificate_file as c then if attached secure_certificate_key_file as k then
l_ssl.set_certificate_file_path (c) l_secure.set_key_file_path (k)
end end
else else
create {HTTP_STREAM_SOCKET} Result.make_client_by_port (a_port, a_host) create {HTTP_STREAM_SOCKET} Result.make_client_by_port (a_port, a_host)

View File

@@ -11,7 +11,6 @@ deferred class
WEB_SOCKET WEB_SOCKET
inherit inherit
WEB_SOCKET_CONSTANTS WEB_SOCKET_CONSTANTS
feature -- Access feature -- Access
@@ -37,7 +36,7 @@ feature -- Access
-- Has the result fo protocol negotiation between client and the server -- Has the result fo protocol negotiation between client and the server
-- By default it's an empty string. -- By default it's an empty string.
is_tunneled: BOOLEAN is_secure: BOOLEAN
-- Is the current connection tunneled over TLS/SSL? -- Is the current connection tunneled over TLS/SSL?
local local
l_uri: STRING l_uri: STRING

View File

@@ -10,7 +10,6 @@ deferred class
WEB_SOCKET_CLIENT_I WEB_SOCKET_CLIENT_I
inherit inherit
WEB_SOCKET_SUBSCRIBER WEB_SOCKET_SUBSCRIBER
redefine redefine
on_websocket_error, on_websocket_error,
@@ -106,39 +105,39 @@ feature -- Access
server_handshake: WEB_SOCKET_HANDSHAKE_DATA server_handshake: WEB_SOCKET_HANDSHAKE_DATA
-- Handshake data received from the server -- Handshake data received from the server
feature -- Access: ssl feature -- Access: secure
is_ssl_supported: BOOLEAN is_secure_connection_supported: BOOLEAN
-- Is SSL supported? -- Is SSL supported?
deferred deferred
end end
ssl_protocol: detachable READABLE_STRING_GENERAL secure_protocol: detachable READABLE_STRING_GENERAL
-- SSL protocol , if `is_ssl_supported'. -- SSL protocol , if `is_secure_connection_supported'.
ssl_certificate_file: detachable PATH secure_certificate_file: detachable PATH
-- SSL certificate file , if `is_ssl_supported'. -- SSL certificate file , if `is_secure_connection_supported'.
ssl_key_file: detachable PATH secure_certificate_key_file: detachable PATH
-- SSL key file , if `is_ssl_supported'. -- SSL key file , if `is_secure_connection_supported'.
feature -- Element change feature -- Element change
set_ssl_protocol (a_prot: like ssl_protocol) set_secure_protocol (a_prot: like secure_protocol)
do do
ssl_protocol := a_prot secure_protocol := a_prot
end end
set_ssl_certificate_file (p: detachable PATH) set_secure_certificate_file (p: detachable PATH)
-- Set SSL certificate from file at `p'. -- Set SSL certificate from file at `p'.
do do
ssl_certificate_file := p secure_certificate_file := p
end end
set_ssl_key_file (p: detachable PATH) set_secure_certificate_key_file (p: detachable PATH)
-- Set SSL key from file at `p'. -- Set SSL key from file at `p'.
do do
ssl_key_file := p secure_certificate_key_file := p
end end
feature -- Events API feature -- Events API
@@ -346,7 +345,7 @@ feature {NONE} -- Implementation
set_default_port set_default_port
do do
if is_tunneled then if is_secure then
port := wss_port_default port := wss_port_default
else else
port := ws_port_default port := ws_port_default

View File

@@ -27,8 +27,8 @@ feature {NONE} -- Initialization
create ready_state.make create ready_state.make
ensure ensure
uri_set: a_uri = uri uri_set: a_uri = uri
port_wss: is_tunneled implies port = wss_port_default port_wss: is_secure implies port = wss_port_default
port_ws: not is_tunneled implies port = ws_port_default port_ws: not is_secure implies port = ws_port_default
ready_state_set: ready_state.state = {WEB_SOCKET_READY_STATE}.connecting ready_state_set: ready_state.state = {WEB_SOCKET_READY_STATE}.connecting
subscriber_set: subscriber = a_subscriber subscriber_set: subscriber = a_subscriber
protocol_set: protocol.is_empty protocol_set: protocol.is_empty
@@ -58,8 +58,8 @@ feature {NONE} -- Initialization
create ready_state.make create ready_state.make
ensure ensure
uri_set: a_uri = uri uri_set: a_uri = uri
port_wss: is_tunneled implies port = wss_port_default port_wss: is_secure implies port = wss_port_default
port_ws: not is_tunneled implies port = ws_port_default port_ws: not is_secure implies port = ws_port_default
protocols_set: protocols = a_protocols protocols_set: protocols = a_protocols
ready_state_set: ready_state.state = {WEB_SOCKET_READY_STATE}.connecting ready_state_set: ready_state.state = {WEB_SOCKET_READY_STATE}.connecting
subscriber_set: subscriber = a_subscriber subscriber_set: subscriber = a_subscriber
@@ -214,7 +214,7 @@ feature {NONE} -- Implementation
set_default_port set_default_port
do do
if is_tunneled then if is_secure then
port := wss_port_default port := wss_port_default
else else
port := ws_port_default port := ws_port_default

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="web_socket_client" uuid="934F36F1-D417-4695-A5A9-2D005B35BB1B" library_target="web_socket_client"> <system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="web_socket_client" uuid="EE010507-597F-4FAD-8EFA-B7251E800911" library_target="web_socket_client">
<target name="web_socket_client"> <target name="web_socket_client">
<root all_classes="true"/> <root all_classes="true"/>
<file_rule> <file_rule>
@@ -16,47 +16,28 @@
<library name="crypto" location="$ISE_LIBRARY\unstable\library\text\encryption\crypto\crypto.ecf"/> <library name="crypto" location="$ISE_LIBRARY\unstable\library\text\encryption\crypto\crypto.ecf"/>
<library name="encoder" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\text\encoder\encoder.ecf"/> <library name="encoder" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\text\encoder\encoder.ecf"/>
<library name="net" location="$ISE_LIBRARY\library\net\net.ecf"/> <library name="net" location="$ISE_LIBRARY\library\net\net.ecf"/>
<library name="net_ssl" location="$ISE_LIBRARY\unstable\library\network\socket\netssl\net_ssl.ecf">
<condition>
<custom name="client_ssl_disabled" excluded_value="true"/>
</condition>
</library>
<library name="thread" location="$ISE_LIBRARY\library\thread\thread.ecf"/> <library name="thread" location="$ISE_LIBRARY\library\thread\thread.ecf"/>
<library name="uri" location="$ISE_LIBRARY\library\text\uri\uri.ecf"/> <library name="uri" location="$ISE_LIBRARY\library\text\uri\uri.ecf"/>
<library name="lib_http_network" location="..\..\http_network\http_network.ecf"/>
<library name="lib_web_socket_protocol" location="..\protocol\web_socket_protocol.ecf"/> <library name="lib_web_socket_protocol" location="..\protocol\web_socket_protocol.ecf"/>
<cluster name="web_socket_client" location=".\src\" recursive="true"> <cluster name="web_socket_client" location=".\src\" recursive="true">
<file_rule> <file_rule>
<exclude>/socket$</exclude>
<exclude>/no_ssl$</exclude> <exclude>/no_ssl$</exclude>
<exclude>/ssl$</exclude> <exclude>/ssl$</exclude>
<exclude>/spec$</exclude> <exclude>/spec$</exclude>
</file_rule> </file_rule>
<cluster name="ssl" location="$|ssl\" recursive="true"> <cluster name="ssl" location="$|ssl\" recursive="true">
<condition> <condition>
<custom name="client_ssl_disabled" excluded_value="true"/> <custom name="ssl_enabled" value="true"/>
</condition>
<condition>
<custom name="net_ssl_enabled" value="true"/>
</condition> </condition>
</cluster> </cluster>
<cluster name="no_ssl" location="$|no_ssl\" recursive="true"> <cluster name="no_ssl" location="$|no_ssl\" recursive="true">
<condition> <condition>
<custom name="client_ssl_disabled" value="true"/> <custom name="ssl_enabled" excluded_value="true"/>
</condition> <custom name="net_ssl_enabled" excluded_value="true"/>
</cluster>
<cluster name="socket" location="$|socket\">
<file_rule>
<exclude>/tcp_stream_socket.e$</exclude>
<condition>
<version type="compiler" max="15.2.0.0"/>
</condition>
</file_rule>
<cluster name="socket_ssl" location="$|ssl\" recursive="true" hidden="true">
<condition>
<custom name="client_ssl_disabled" excluded_value="true"/>
</condition>
</cluster>
</cluster>
<cluster name="spec_before_15_01" location="$|spec\before_15_01\" recursive="true">
<condition>
<version type="compiler" max="15.2.0.0"/>
</condition> </condition>
</cluster> </cluster>
</cluster> </cluster>

View File

@@ -23,8 +23,8 @@ feature {NONE} -- Initialization
opts.set_verbose_level ("debug") opts.set_verbose_level ("debug")
opts.set_ssl_enabled (True) -- If SSL is supported opts.set_ssl_enabled (True) -- If SSL is supported
opts.set_ssl_ca_crt ("C:\OpenSSL-Win64\bin\ca.crt") -- Change to use your own crt file. opts.set_ssl_ca_crt ("ca.crt") -- Change to use your own crt file.
opts.set_ssl_ca_key ("C:\OpenSSL-Win64\bin\ca.key") -- Change to use your own key file. opts.set_ssl_ca_key ("ca.key") -- Change to use your own key file.
opts.set_port (default_port_number) opts.set_port (default_port_number)
end end

View File

@@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE-----
MIICWDCCAcGgAwIBAgIJAJnXGtV+PtiYMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMTUwNDAzMjIxNTA0WhcNMTYwNDAyMjIxNTA0WjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
gQDFMK6ojzg+KlklhTossR13c51izMgGc3B0z9ttfHIcx2kxra3HtHcKIl5wSUvn
G8zmSyFAyQTs5LUv65q46FM9qU8tP+vTeFCfNXvjRcIEpouta3J53K0xuUlxz4d4
4D6qvdDWAez/0AkI4y5etW5zXtg7IQorJhsI9TmfGuruzwIDAQABo1AwTjAdBgNV
HQ4EFgQUbWpk2HoHa0YqpEwr7CGEatBFTMkwHwYDVR0jBBgwFoAUbWpk2HoHa0Yq
pEwr7CGEatBFTMkwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAi+h4/
IgEocWkdRZBKHEcTrRxz5WhEDJMoVo9LhnXvCfn1G/4p6Un6sYv7Xzpi9NuSY8uV
cjfJJXhtF3AtyZ70iTAxWaRWjGaZ03PYOjlledJ5rqJEt6CCn8m+JsfznduZvbxQ
zQ6jCLXfyD/tvemB+yYEI3NntvRKx5/zt6Q26Q==
-----END CERTIFICATE-----

View File

@@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDFMK6ojzg+KlklhTossR13c51izMgGc3B0z9ttfHIcx2kxra3H
tHcKIl5wSUvnG8zmSyFAyQTs5LUv65q46FM9qU8tP+vTeFCfNXvjRcIEpouta3J5
3K0xuUlxz4d44D6qvdDWAez/0AkI4y5etW5zXtg7IQorJhsI9TmfGuruzwIDAQAB
AoGAR5efMg+dieRyLU8rieJcImxVbfOPg9gRsjdtIVkXTR+RL7ow59q7hXBo/Td/
WU8cm1gXoJ/bK+71YYqWyB+BaLRIWvRWb7Gdw203tu4e136Ca5uuY+71qdbVTVcl
NQ7J+T+eAQFP+a+DdT3ZQxu9eze87SMbu6i5YSpIk2kusOECQQDunv/DQ+nc+NgR
DF+Td3sNYUVRT9a1CWi6abAG6reXwp8MS4NobWDf+Ps4JODhEEwlIdq5qL7qqYBZ
Gc1TJJ53AkEA0404Fn6vAzzegBcS4RLlYTK7nMr0m4pMmDMCI6YzAYdMmKHp1e6f
IwxSmQrmwyAgwcT01bc0+A8yipcC2BWQaQJBAJ01QZm635OGmos41KsKF5bsE8gL
SpBBH69Yu/ECqGwie7iU84FUNnO4zIHjwghlPVVlZX3Vz9o4S+fn2N9DC+cCQGyZ
QyCxGdC0r5fbwHJQS/ZQn+UGfvlVzqoXDVMVn3t6ZES6YZrT61eHnOM5qGqklIxE
Old3vDZXPt/MU8Zvk3kCQBOgUx2VxvTrHN37hk9/QIDiM62+RenBm1M3ah8xTosf
1mSeEb6d9Kwb3TgPBmA7YXzJuAQfRIvEPMPxT5SSr6Q=
-----END RSA PRIVATE KEY-----

View File

@@ -32,18 +32,16 @@
<root class="APPLICATION" feature="make_and_launch"/> <root class="APPLICATION" feature="make_and_launch"/>
<option concurrency="thread" root_concurrency="thread"> <option concurrency="thread" root_concurrency="thread">
</option> </option>
<variable name="httpd_ssl_enabled" value="true"/>
</target> </target>
<target name="echo_websocket_server_mt_no_ssl" extends="echo_websocket_server_mt"> <target name="echo_websocket_server_mt_ssl" extends="echo_websocket_server_mt">
<variable name="httpd_ssl_enabled" value="false"/> <variable name="ssl_enabled" value="true"/>
</target> </target>
<target name="echo_websocket_server_scoop" extends="common"> <target name="echo_websocket_server_scoop" extends="common">
<root class="APPLICATION" feature="make_and_launch"/> <root class="APPLICATION" feature="make_and_launch"/>
<option concurrency="scoop" root_concurrency="scoop"> <option concurrency="scoop" root_concurrency="scoop">
</option> </option>
</target>
<target name="echo_websocket_server_scoop_ssl" extends="echo_websocket_server_scoop">
<variable name="httpd_ssl_enabled" value="true"/> <variable name="httpd_ssl_enabled" value="true"/>
</target> </target>
<target name="echo_websocket_server_scoop_no_ssl" extends="echo_websocket_server_scoop">
<variable name="httpd_ssl_enabled" value="false"/>
</target>
</system> </system>

View File

@@ -23,8 +23,8 @@ feature {NONE} -- Initialization
keep_alive_timeout := default_keep_alive_timeout keep_alive_timeout := default_keep_alive_timeout
max_keep_alive_requests := default_max_keep_alive_requests max_keep_alive_requests := default_max_keep_alive_requests
is_secure := False is_secure := False
create ca_crt.make_empty create secure_certificate.make_empty
create ca_key.make_empty create secure_certificate_key.make_empty
end end
feature -- Access feature -- Access
@@ -75,8 +75,8 @@ feature -- Access
-- To disable KeepAlive, set `max_keep_alive_requests' to 0. -- To disable KeepAlive, set `max_keep_alive_requests' to 0.
-- By default: 100 . -- By default: 100 .
has_ssl_support: BOOLEAN has_secure_support: BOOLEAN
-- Has SSL support? -- Has SSL/TLS secure support?
deferred deferred
end end
@@ -96,30 +96,30 @@ feature -- Access: SSL
is_secure: BOOLEAN is_secure: BOOLEAN
-- Is SSL/TLS session?. -- Is SSL/TLS session?.
ca_crt: detachable IMMUTABLE_STRING_32 secure_certificate: detachable IMMUTABLE_STRING_32
-- the signed certificate. -- the signed certificate.
ca_key: detachable IMMUTABLE_STRING_32 secure_certificate_key: detachable IMMUTABLE_STRING_32
-- private key to the certificate. -- private key to the certificate authority.
ssl_protocol: NATURAL secure_protocol: NATURAL
-- By default protocol is tls 1.2. -- By default protocol is tls 1.2.
feature -- Element change feature -- Element change
set_ssl_settings (v: detachable separate TUPLE [protocol: separate READABLE_STRING_GENERAL; ca_crt, ca_key: detachable separate READABLE_STRING_GENERAL]) set_secure_settings (v: detachable separate TUPLE [protocol: separate READABLE_STRING_GENERAL; ca_crt, ca_key: detachable separate READABLE_STRING_GENERAL])
local local
prot: STRING_32 prot: STRING_32
do do
is_secure := False is_secure := False
ca_crt := Void secure_certificate := Void
ca_key := Void secure_certificate_key := Void
if v /= Void then if v /= Void then
is_secure := True is_secure := True
create prot.make_from_separate (v.protocol) create prot.make_from_separate (v.protocol)
set_ssl_protocol_from_string (prot) set_secure_protocol_from_string (prot)
set_ca_crt (v.ca_crt) set_secure_certificate (v.ca_crt)
set_ca_key (v.ca_key) set_secure_certificate_key (v.ca_key)
end end
end end
@@ -229,7 +229,7 @@ feature -- Element change
set_is_secure (b: BOOLEAN) set_is_secure (b: BOOLEAN)
-- Set `is_secure' to `b'. -- Set `is_secure' to `b'.
do do
if b and has_ssl_support then if b and has_secure_support then
is_secure := True is_secure := True
if if
http_server_port = 80 http_server_port = 80
@@ -245,8 +245,8 @@ feature -- Element change
end end
end end
ensure ensure
is_secure_set: has_ssl_support implies is_secure is_secure_set: has_secure_support implies is_secure
is_not_secure: not has_ssl_support implies not is_secure is_not_secure: not has_secure_support implies not is_secure
end end
mark_secure mark_secure
@@ -254,84 +254,84 @@ feature -- Element change
do do
set_is_secure (True) set_is_secure (True)
ensure ensure
is_secure_set: has_ssl_support implies is_secure is_secure_set: has_secure_support implies is_secure
-- http_server_port_set: has_ssl_support implies http_server_port = 443 -- http_server_port_set: has_secure_support implies http_server_port = 443
is_not_secure: not has_ssl_support implies not is_secure is_not_secure: not has_secure_support implies not is_secure
-- default_port: not has_ssl_support implies http_server_port = 80 -- default_port: not has_secure_support implies http_server_port = 80
end end
feature -- Element change feature -- Element change
set_ca_crt (a_value: detachable separate READABLE_STRING_GENERAL) set_secure_certificate (a_value: detachable separate READABLE_STRING_GENERAL)
-- Set `ca_crt' from `a_value'. -- Set `secure_certificate' from `a_value'.
do do
if a_value /= Void then if a_value /= Void then
create ca_crt.make_from_separate (a_value) create secure_certificate.make_from_separate (a_value)
else else
ca_crt := Void secure_certificate := Void
end end
end end
set_ca_key (a_value: detachable separate READABLE_STRING_GENERAL) set_secure_certificate_key (a_value: detachable separate READABLE_STRING_GENERAL)
-- Set `ca_key' with `a_value'. -- Set `secure_certificate_key' with `a_value'.
do do
if a_value /= Void then if a_value /= Void then
create ca_key.make_from_separate (a_value) create secure_certificate_key.make_from_separate (a_value)
else else
ca_key := Void secure_certificate_key := Void
end end
end end
set_ssl_protocol (a_version: NATURAL) set_secure_protocol (a_version: NATURAL)
-- Set `ssl_protocol' with `a_version' -- Set `secure_protocol' with `a_version'
do do
ssl_protocol := a_version secure_protocol := a_version
ensure ensure
ssl_protocol_set: ssl_protocol = a_version secure_protocol_set: secure_protocol = a_version
end end
set_ssl_protocol_from_string (a_ssl_version: READABLE_STRING_GENERAL) set_secure_protocol_from_string (a_ssl_version: READABLE_STRING_GENERAL)
-- Set `ssl_protocol' with `a_ssl_version' -- Set `secure_protocol' with `a_ssl_version'
do do
if a_ssl_version.is_case_insensitive_equal ("ssl_2_3") then if a_ssl_version.is_case_insensitive_equal ("ssl_2_3") then
set_ssl_protocol_to_ssl_2_or_3 set_secure_protocol_to_ssl_2_or_3
elseif a_ssl_version.is_case_insensitive_equal ("tls_1_0") then elseif a_ssl_version.is_case_insensitive_equal ("tls_1_0") then
set_ssl_protocol_to_tls_1_0 set_secure_protocol_to_tls_1_0
elseif a_ssl_version.is_case_insensitive_equal ("tls_1_1") then elseif a_ssl_version.is_case_insensitive_equal ("tls_1_1") then
set_ssl_protocol_to_tls_1_1 set_secure_protocol_to_tls_1_1
elseif a_ssl_version.is_case_insensitive_equal ("tls_1_2") then elseif a_ssl_version.is_case_insensitive_equal ("tls_1_2") then
set_ssl_protocol_to_tls_1_2 set_secure_protocol_to_tls_1_2
elseif a_ssl_version.is_case_insensitive_equal ("dtls_1_0") then elseif a_ssl_version.is_case_insensitive_equal ("dtls_1_0") then
set_ssl_protocol_to_dtls_1_0 set_secure_protocol_to_dtls_1_0
else -- Default else -- Default
set_ssl_protocol_to_tls_1_2 set_secure_protocol_to_tls_1_2
end end
end end
feature -- SSL Helpers feature -- SSL Helpers
set_ssl_protocol_to_ssl_2_or_3 set_secure_protocol_to_ssl_2_or_3
-- Set `ssl_protocol' with `Ssl_23'. -- Set `secure_protocol' with `Ssl_23'.
deferred deferred
end end
set_ssl_protocol_to_tls_1_0 set_secure_protocol_to_tls_1_0
-- Set `ssl_protocol' with `Tls_1_0'. -- Set `secure_protocol' with `Tls_1_0'.
deferred deferred
end end
set_ssl_protocol_to_tls_1_1 set_secure_protocol_to_tls_1_1
-- Set `ssl_protocol' with `Tls_1_1'. -- Set `secure_protocol' with `Tls_1_1'.
deferred deferred
end end
set_ssl_protocol_to_tls_1_2 set_secure_protocol_to_tls_1_2
-- Set `ssl_protocol' with `Tls_1_2'. -- Set `secure_protocol' with `Tls_1_2'.
deferred deferred
end end
set_ssl_protocol_to_dtls_1_0 set_secure_protocol_to_dtls_1_0
-- Set `ssl_protocol' with `Dtls_1_0'. -- Set `secure_protocol' with `Dtls_1_0'.
deferred deferred
end end

View File

@@ -9,6 +9,9 @@ note
deferred class deferred class
HTTPD_CONSTANTS HTTPD_CONSTANTS
inherit
HTTP_SECURE_HELPER
feature -- Default connection settings feature -- Default connection settings
default_http_server_port: INTEGER = 80 default_http_server_port: INTEGER = 80

View File

@@ -65,4 +65,7 @@
</cluster> </cluster>
</cluster> </cluster>
</target> </target>
<target name="httpd_ssl" extends="httpd">
<variable name="ssl_enabled" value="true" />
</target>
</system> </system>

View File

@@ -525,7 +525,7 @@ feature -- Parsing
if a_socket.was_error then if a_socket.was_error then
report_error ("Socket error") report_error ("Socket error")
if is_verbose then if is_verbose then
log (request_header +"%N" + Result + "%N## was_error=False! ##", debug_level) log (request_header +"%N" + Result + "%N## Network error: " + a_socket.error + " ##", debug_level)
end end
end end
else else

View File

@@ -113,7 +113,7 @@ feature -- Execution
log (" - socket_recv_timeout = " + configuration.socket_recv_timeout.out + " seconds") log (" - socket_recv_timeout = " + configuration.socket_recv_timeout.out + " seconds")
log (" - keep_alive_timeout = " + configuration.keep_alive_timeout.out + " seconds") log (" - keep_alive_timeout = " + configuration.keep_alive_timeout.out + " seconds")
log (" - max_keep_alive_requests = " + configuration.max_keep_alive_requests.out) log (" - max_keep_alive_requests = " + configuration.max_keep_alive_requests.out)
if configuration.has_ssl_support then if configuration.has_secure_support then
if configuration.is_secure then if configuration.is_secure then
log (" - SSL = enabled") log (" - SSL = enabled")
else else

View File

@@ -11,7 +11,7 @@ feature -- Access
new_client_socket (a_is_secure: BOOLEAN): HTTPD_STREAM_SOCKET new_client_socket (a_is_secure: BOOLEAN): HTTPD_STREAM_SOCKET
do do
if a_is_secure then if a_is_secure then
create {HTTPD_STREAM_SSL_SOCKET} Result.make_empty create {HTTPD_STREAM_SECURE_SOCKET} Result.make_empty
else else
create Result.make_empty create Result.make_empty
end end

View File

@@ -6,10 +6,10 @@ note
revision: "$Revision$" revision: "$Revision$"
class class
HTTPD_STREAM_SSL_SOCKET HTTPD_STREAM_SECURE_SOCKET
inherit inherit
HTTP_STREAM_SSL_SOCKET HTTP_STREAM_SECURE_SOCKET
HTTPD_STREAM_SOCKET HTTPD_STREAM_SOCKET
undefine undefine
@@ -27,7 +27,7 @@ inherit
read_stream_noexception, read_stream_noexception,
read_into_pointer_noexception, read_into_pointer_noexception,
put_pointer_content_noexception, put_pointer_content_noexception,
is_ssl_supported is_secure_connection_supported
end end
create create

View File

@@ -16,38 +16,38 @@ feature -- Status
Server_details: STRING_8 = "Server: Standalone Eiffel Server" Server_details: STRING_8 = "Server: Standalone Eiffel Server"
has_ssl_support: BOOLEAN = False has_secure_support: BOOLEAN = False
-- Precursor -- Precursor
feature -- SSL Helpers feature -- SSL Helpers
set_ssl_protocol_to_ssl_2_or_3 set_secure_protocol_to_ssl_2_or_3
-- Set `ssl_protocol' with `Ssl_23'. -- Set `secure_protocol' with `Ssl_23'.
do do
-- Ignored -- Ignored
end end
set_ssl_protocol_to_tls_1_0 set_secure_protocol_to_tls_1_0
-- Set `ssl_protocol' with `Tls_1_0'. -- Set `secure_protocol' with `Tls_1_0'.
do do
-- Ignored -- Ignored
end end
set_ssl_protocol_to_tls_1_1 set_secure_protocol_to_tls_1_1
-- Set `ssl_protocol' with `Tls_1_1'. -- Set `secure_protocol' with `Tls_1_1'.
do do
-- Ignored -- Ignored
end end
set_ssl_protocol_to_tls_1_2 set_secure_protocol_to_tls_1_2
-- Set `ssl_protocol' with `Tls_1_2'. -- Set `secure_protocol' with `Tls_1_2'.
do do
-- Ignored -- Ignored
end end
set_ssl_protocol_to_dtls_1_0 set_secure_protocol_to_dtls_1_0
-- Set `ssl_protocol' with `Dtls_1_0'. -- Set `secure_protocol' with `Dtls_1_0'.
do do
-- Ignored -- Ignored
end end

View File

@@ -21,48 +21,48 @@ feature {NONE} -- Initialization
-- Create a new instance and set ssl protocol to tls_1_2. -- Create a new instance and set ssl protocol to tls_1_2.
do do
Precursor Precursor
set_ssl_protocol_to_tls_1_2 set_secure_protocol_to_tls_1_2
ensure then ensure then
ssl_protocol_set: ssl_protocol = {SSL_PROTOCOL}.tls_1_2 secure_protocol_set: secure_protocol = {SSL_PROTOCOL}.tls_1_2
end end
feature -- Access feature -- Access
Server_details: STRING_8 = "Server: Standalone Eiffel Server (https)" Server_details: STRING_8 = "Server: Standalone Eiffel Server (secure)"
has_ssl_support: BOOLEAN = True has_secure_support: BOOLEAN = True
-- Precursor -- Precursor
feature -- SSL Helpers feature -- SSL Helpers
set_ssl_protocol_to_ssl_2_or_3 set_secure_protocol_to_ssl_2_or_3
-- Set `ssl_protocol' with `Ssl_23'. -- Set `secure_protocol' with `Ssl_23'.
do do
set_ssl_protocol ({SSL_PROTOCOL}.Ssl_23) set_secure_protocol ({SSL_PROTOCOL}.Ssl_23)
end end
set_ssl_protocol_to_tls_1_0 set_secure_protocol_to_tls_1_0
-- Set `ssl_protocol' with `Tls_1_0'. -- Set `secure_protocol' with `Tls_1_0'.
do do
set_ssl_protocol ({SSL_PROTOCOL}.Tls_1_0) set_secure_protocol ({SSL_PROTOCOL}.Tls_1_0)
end end
set_ssl_protocol_to_tls_1_1 set_secure_protocol_to_tls_1_1
-- Set `ssl_protocol' with `Tls_1_1'. -- Set `secure_protocol' with `Tls_1_1'.
do do
set_ssl_protocol ({SSL_PROTOCOL}.Tls_1_1) set_secure_protocol ({SSL_PROTOCOL}.Tls_1_1)
end end
set_ssl_protocol_to_tls_1_2 set_secure_protocol_to_tls_1_2
-- Set `ssl_protocol' with `Tls_1_2'. -- Set `secure_protocol' with `Tls_1_2'.
do do
set_ssl_protocol ({SSL_PROTOCOL}.Tls_1_2) set_secure_protocol ({SSL_PROTOCOL}.Tls_1_2)
end end
set_ssl_protocol_to_dtls_1_0 set_secure_protocol_to_dtls_1_0
-- Set `ssl_protocol' with `Dtls_1_0'. -- Set `secure_protocol' with `Dtls_1_0'.
do do
set_ssl_protocol ({SSL_PROTOCOL}.Dtls_1_0) set_secure_protocol ({SSL_PROTOCOL}.Dtls_1_0)
end end

View File

@@ -1,6 +1,6 @@
note note
description: "[ description: "[
SSL enabled server SECURE enabled server
]" ]"
date: "$Date$" date: "$Date$"
revision: "$Revision$" revision: "$Revision$"
@@ -21,24 +21,24 @@ feature {NONE} -- Factory
new_listening_socket (a_addr: detachable INET_ADDRESS; a_http_port: INTEGER): HTTPD_STREAM_SOCKET new_listening_socket (a_addr: detachable INET_ADDRESS; a_http_port: INTEGER): HTTPD_STREAM_SOCKET
local local
s_ssl: HTTPD_STREAM_SSL_SOCKET s_secure: HTTPD_STREAM_SECURE_SOCKET
do do
if configuration.is_secure then if configuration.is_secure then
if a_addr /= Void then if a_addr /= Void then
create s_ssl.make_server_by_address_and_port (a_addr, a_http_port) create s_secure.make_server_by_address_and_port (a_addr, a_http_port)
Result := s_ssl Result := s_secure
else else
create s_ssl.make_server_by_port (a_http_port) create s_secure.make_server_by_port (a_http_port)
end end
s_ssl.set_tls_protocol (configuration.ssl_protocol) s_secure.set_tls_protocol (configuration.secure_protocol)
if attached configuration.ca_crt as l_crt then if attached configuration.secure_certificate as l_crt then
s_ssl.set_certificate_file_name (l_crt) s_secure.set_certificate_file_name (l_crt)
end end
if attached configuration.ca_key as l_key then if attached configuration.secure_certificate_key as l_key then
s_ssl.set_key_file_name (l_key) s_secure.set_key_file_name (l_key)
end end
Result := s_ssl Result := s_secure
else else
Result := Precursor (a_addr, a_http_port) Result := Precursor (a_addr, a_http_port)
end end

View File

@@ -76,7 +76,7 @@ feature {NONE} -- Initialization
verbose := opts.option_boolean_value ("verbose", verbose) verbose := opts.option_boolean_value ("verbose", verbose)
-- See `{HTTPD_REQUEST_HANDLER_I}.*_verbose_level` -- See `{HTTPD_REQUEST_HANDLER_I}.*_verbose_level`
if opts.has_integer_option ("verbose_level") then if opts.has_integer_option ("verbose_level") then
verbose_level := opts.option_integer_value ("verbose_level", verbose_level) verbose_level := opts.option_integer_value ("verbose_level", verbose_level)
elseif attached {READABLE_STRING_GENERAL} opts.option ("verbose_level") as s_verbose_level then elseif attached {READABLE_STRING_GENERAL} opts.option ("verbose_level") as s_verbose_level then
@@ -115,11 +115,17 @@ feature {NONE} -- Initialization
keep_alive_timeout := opts.option_integer_value ("keep_alive_timeout", keep_alive_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) max_keep_alive_requests := opts.option_integer_value ("max_keep_alive_requests", max_keep_alive_requests)
if if
opts.option_boolean_value ("ssl_enabled", ssl_enabled) and then opts.option_boolean_value ("is_secure", is_secure) and then
attached opts.option_string_32_value ("secure_protocol", "tls_1_2") as l_secure_prot
then
secure_settings := [l_secure_prot, opts.option_string_32_value ("secure_certificate", Void), opts.option_string_32_value ("secure_certificate_key", Void)]
elseif
-- OBSOLETE: backward compatible with old settings name [oct/2016].
opts.option_boolean_value ("ssl_enabled", is_secure) and then
attached opts.option_string_32_value ("ssl_protocol", "tls_1_2") as ssl_prot attached opts.option_string_32_value ("ssl_protocol", "tls_1_2") as ssl_prot
then then
ssl_settings := [ssl_prot, opts.option_string_32_value ("ssl_ca_crt", Void), opts.option_string_32_value ("ssl_ca_key", Void)] secure_settings := [ssl_prot, opts.option_string_32_value ("ssl_ca_crt", Void), opts.option_string_32_value ("ssl_ca_key", Void)]
end end
end end
@@ -135,7 +141,7 @@ feature {NONE} -- Initialization
-- Set `single_threaded' to True. -- Set `single_threaded' to True.
do do
max_concurrent_connections := 1 max_concurrent_connections := 1
end end
feature -- Execution feature -- Execution
@@ -143,7 +149,7 @@ feature -- Execution
do do
cfg.set_is_verbose (verbose) cfg.set_is_verbose (verbose)
cfg.set_verbose_level (verbose_level) cfg.set_verbose_level (verbose_level)
cfg.set_ssl_settings (ssl_settings) cfg.set_secure_settings (secure_settings)
cfg.set_http_server_name (server_name) cfg.set_http_server_name (server_name)
cfg.http_server_port := port_number cfg.http_server_port := port_number
cfg.set_max_concurrent_connections (max_concurrent_connections) cfg.set_max_concurrent_connections (max_concurrent_connections)
@@ -165,7 +171,7 @@ feature -- Execution
debug ("ew_standalone") debug ("ew_standalone")
if verbose then if verbose then
io.error.put_string ("Launching standalone web server on port " + port_number.out) io.error.put_string ("Launching standalone web server on port " + port_number.out)
if ssl_enabled then if is_secure then
io.error.put_string ("%N https://") io.error.put_string ("%N https://")
else else
io.error.put_string ("%N http://") io.error.put_string ("%N http://")
@@ -213,26 +219,36 @@ feature {NONE} -- Implementation
-- Help defining the verbosity. -- Help defining the verbosity.
-- The higher, the more output. -- 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_concurrent_connections: INTEGER
max_tcp_clients: INTEGER
socket_timeout: INTEGER
socket_recv_timeout: INTEGER
keep_alive_timeout: INTEGER
max_keep_alive_requests: INTEGER
single_threaded: BOOLEAN single_threaded: BOOLEAN
do do
Result := max_concurrent_connections = 0 Result := max_concurrent_connections = 0
end end
max_tcp_clients: INTEGER
socket_timeout: INTEGER
socket_recv_timeout: INTEGER
keep_alive_timeout: INTEGER
max_keep_alive_requests: INTEGER
is_secure_connection_supported: BOOLEAN
-- Is SSL supported in current compiled system?
do
Result := {WGI_STANDALONE_CONSTANTS}.is_secure_connection_supported
end
is_secure: BOOLEAN
-- Is secure server? i.e using SSL?
do
Result := attached secure_settings as l_secure_settings and then
attached l_secure_settings.protocol as prot and then not prot.is_whitespace
end
secure_settings: detachable TUPLE [protocol: READABLE_STRING_GENERAL; ca_crt, ca_key: detachable READABLE_STRING_GENERAL]
feature -- Status report feature -- Status report
connector: WGI_STANDALONE_CONNECTOR [G] connector: WGI_STANDALONE_CONNECTOR [G]
@@ -244,7 +260,7 @@ feature -- Status report
end end
;note ;note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[ source: "[
Eiffel Software Eiffel Software

View File

@@ -11,6 +11,14 @@ class
inherit inherit
WSF_SERVICE_LAUNCHER_OPTIONS WSF_SERVICE_LAUNCHER_OPTIONS
feature -- Status report
is_secure_connection_supported: BOOLEAN
-- Is SSL/TLS supported by current compiled system?
do
Result := {WGI_STANDALONE_CONSTANTS}.is_secure_connection_supported
end
feature -- Access: output feature -- Access: output
is_verbose: BOOLEAN is_verbose: BOOLEAN
@@ -24,40 +32,40 @@ feature -- Access: output
do do
if attached {READABLE_STRING_GENERAL} option ("verbose_level") as l_verbose_level and then l_verbose_level.is_valid_as_string_8 then if attached {READABLE_STRING_GENERAL} option ("verbose_level") as l_verbose_level and then l_verbose_level.is_valid_as_string_8 then
Result := l_verbose_level.to_string_8 Result := l_verbose_level.to_string_8
end end
end end
feature -- Access: connection feature -- Access: connection
port: INTEGER port: INTEGER assign set_port
-- Listening port number. -- Listening port number.
do do
Result := option_integer_value ("port", 0) Result := option_integer_value ("port", 0)
end end
server_name: detachable READABLE_STRING_8 server_name: detachable READABLE_STRING_8 assign set_server_name
-- Listening only for connection on `server_name' if defined. -- Listening only for connection on `server_name' if defined.
do do
if attached {READABLE_STRING_GENERAL} option ("server_name") as l_server_name and then l_server_name.is_valid_as_string_8 then if attached {READABLE_STRING_GENERAL} option ("server_name") as l_server_name and then l_server_name.is_valid_as_string_8 then
Result := l_server_name.to_string_8 Result := l_server_name.to_string_8
end end
end end
base_url: detachable READABLE_STRING_8 base_url: detachable READABLE_STRING_8 assign set_base_url
do do
if attached {READABLE_STRING_GENERAL} option ("base") as l_base and then l_base.is_valid_as_string_8 then if attached {READABLE_STRING_GENERAL} option ("base") as l_base and then l_base.is_valid_as_string_8 then
Result := l_base.to_string_8 Result := l_base.to_string_8
end end
end end
max_concurrent_connections: INTEGER max_concurrent_connections: INTEGER assign set_max_concurrent_connections
-- Maximum of concurrent connections. -- Maximum of concurrent connections.
-- Define the size of the concurrent pool. -- Define the size of the concurrent pool.
do do
Result := option_integer_value ("max_concurrent_connections", 0) Result := option_integer_value ("max_concurrent_connections", 0)
end end
max_tcp_clients: INTEGER max_tcp_clients: INTEGER assign set_max_tcp_clients
-- Listen on socket for at most `queue' connections. -- Listen on socket for at most `queue' connections.
do do
Result := option_integer_value ("max_tcp_clients", 0) Result := option_integer_value ("max_tcp_clients", 0)
@@ -65,7 +73,7 @@ feature -- Access: connection
feature -- Access: network feature -- Access: network
socket_timeout: INTEGER socket_timeout: INTEGER assign set_socket_timeout
-- Amount of seconds that the server waits for receipts and transmissions during communications. -- Amount of seconds that the server waits for receipts and transmissions during communications.
-- note: with timeout of 0, socket can wait for ever. -- note: with timeout of 0, socket can wait for ever.
-- By default: {HTTPD_CONFIGURATION_I}.default_socket_timeout seconds, which is appropriate for most situations. -- By default: {HTTPD_CONFIGURATION_I}.default_socket_timeout seconds, which is appropriate for most situations.
@@ -73,7 +81,7 @@ feature -- Access: network
Result := option_integer_value ("socket_timeout", 0) Result := option_integer_value ("socket_timeout", 0)
end end
socket_recv_timeout: INTEGER socket_recv_timeout: INTEGER assign set_socket_recv_timeout
-- Amount of seconds that the server waits for receiving data during communications. -- Amount of seconds that the server waits for receiving data during communications.
-- note: with timeout of 0, socket can wait for ever. -- note: with timeout of 0, socket can wait for ever.
-- By default: {HTTPD_CONFIGURATION_I}.default_socket_recv_timeout seconds. -- By default: {HTTPD_CONFIGURATION_I}.default_socket_recv_timeout seconds.
@@ -83,7 +91,7 @@ feature -- Access: network
feature -- Access: persistent connection feature -- Access: persistent connection
keep_alive_timeout: INTEGER keep_alive_timeout: INTEGER assign set_keep_alive_timeout
-- Persistent connection timeout. -- Persistent connection timeout.
-- Number of seconds the server waits after a request has been served before it closes the connection. -- Number of seconds the server waits after a request has been served before it closes the connection.
-- Timeout unit in Seconds. -- Timeout unit in Seconds.
@@ -92,7 +100,7 @@ feature -- Access: persistent connection
Result := option_integer_value ("keep_alive_timeout", 0) Result := option_integer_value ("keep_alive_timeout", 0)
end end
max_keep_alive_requests: INTEGER max_keep_alive_requests: INTEGER assign set_max_keep_alive_requests
-- Maximum number of requests allowed per persistent connection. -- Maximum number of requests allowed per persistent connection.
-- Recommended a high setting. -- Recommended a high setting.
-- To disable KeepAlive, set `max_keep_alive_requests' to 0. -- To disable KeepAlive, set `max_keep_alive_requests' to 0.
@@ -103,34 +111,34 @@ feature -- Access: persistent connection
feature -- Access: SSL feature -- Access: SSL
ssl_enabled: BOOLEAN is_secure: BOOLEAN assign set_is_secure
-- Is SSL/TLS session? -- Is SSL/TLS session?
do do
Result := option_boolean_value ("ssl_enabled", False) Result := option_boolean_value ("is_secure", False)
end end
ssl_protocol: detachable READABLE_STRING_GENERAL secure_protocol: detachable READABLE_STRING_GENERAL assign set_secure_protocol
-- SSL protocol name, by default TLS 1.2 -- SSL protocol name, by default TLS 1.2
do do
if attached {READABLE_STRING_GENERAL} option ("ssl_protocol") as l_prot and then l_prot.is_valid_as_string_8 then if attached {READABLE_STRING_GENERAL} option ("secure_protocol") as l_prot and then l_prot.is_valid_as_string_8 then
Result := l_prot.to_string_8 Result := l_prot.to_string_8
end end
end end
ssl_ca_crt: detachable READABLE_STRING_GENERAL secure_certificate: detachable READABLE_STRING_GENERAL assign set_secure_certificate
-- Signed certificate. -- Signed certificate.
do do
if attached {READABLE_STRING_GENERAL} option ("ssl_ca_crt") as l_ssl_ca_crt then if attached {READABLE_STRING_GENERAL} option ("secure_certificate") as l_ssl_ca_crt then
Result := l_ssl_ca_crt Result := l_ssl_ca_crt
end end
end end
ssl_ca_key: detachable READABLE_STRING_GENERAL secure_certificate_key: detachable READABLE_STRING_GENERAL assign set_secure_certificate_key
-- Private key for the certificate. -- Private key for the certificate.
do do
if attached {READABLE_STRING_GENERAL} option ("ssl_ca_key") as l_ssl_ca_key then if attached {READABLE_STRING_GENERAL} option ("secure_certificate_key") as l_ssl_ca_key then
Result := l_ssl_ca_key Result := l_ssl_ca_key
end end
end end
feature -- Element change feature -- Element change
@@ -156,6 +164,11 @@ feature -- Element change
set_string_option ("server_name", v) set_string_option ("server_name", v)
end end
set_base_url (v: detachable READABLE_STRING_8)
do
set_string_option ("base_url", v)
end
set_max_tcp_clients (v: like max_tcp_clients) set_max_tcp_clients (v: like max_tcp_clients)
-- Set `max_tcp_clients' with `v'. -- Set `max_tcp_clients' with `v'.
do do
@@ -192,60 +205,69 @@ feature -- Element change
set_numeric_option ("max_keep_alive_requests", nb) set_numeric_option ("max_keep_alive_requests", nb)
end end
set_ssl_enabled (b: BOOLEAN) set_is_secure (b: BOOLEAN)
-- Set secured connection enabled to `b'.
-- i.e if connection is using SSL/TLS.
do do
set_boolean_option ("ssl_enabled", b) set_boolean_option ("is_secure", b)
end end
set_ssl_protocol_to_ssl_2_or_3 set_secure_protocol_to_ssl_2_or_3
-- Set `ssl_protocol' with `Ssl_23'. -- Set `ssl_protocol' with `Ssl_23'.
do do
set_ssl_protocol ("ssl_2_3") set_secure_protocol ("ssl_2_3")
end end
set_ssl_protocol_to_tls_1_0 set_secure_protocol_to_tls_1_0
-- Set `ssl_protocol' with `Tls_1_0'. -- Set `ssl_protocol' with `Tls_1_0'.
do do
set_ssl_protocol ("tls_1_0") set_secure_protocol ("tls_1_0")
end end
set_ssl_protocol_to_tls_1_1 set_secure_protocol_to_tls_1_1
-- Set `ssl_protocol' with `Tls_1_1'. -- Set `ssl_protocol' with `Tls_1_1'.
do do
set_ssl_protocol ("tls_1_1") set_secure_protocol ("tls_1_1")
end end
set_ssl_protocol_to_tls_1_2 set_secure_protocol_to_tls_1_2
-- Set `ssl_protocol' with `Tls_1_2'. -- Set `ssl_protocol' with `Tls_1_2'.
do do
set_ssl_protocol ("tls_1_2") set_secure_protocol ("tls_1_2")
end end
set_ssl_protocol_to_dtls_1_0 set_secure_protocol_to_dtls_1_0
-- Set `ssl_protocol' with `Dtls_1_0'. -- Set `ssl_protocol' with `Dtls_1_0'.
do do
set_ssl_protocol ("dtls_1_0") set_secure_protocol ("dtls_1_0")
end end
set_ssl_protocol (a_prot: detachable READABLE_STRING_GENERAL) set_secure_protocol (a_prot: detachable READABLE_STRING_GENERAL)
-- Set `ssl_protocol' with `a_version' -- Set `secure_protocol' with `a_version'
do do
set_string_option ("ssl_protocol", a_prot) set_string_option ("secure_protocol", a_prot)
end end
set_ssl_ca_crt (a_value: detachable READABLE_STRING_GENERAL) set_secure_certificate (a_value: detachable READABLE_STRING_GENERAL)
-- Set `ssl_ca_crt' from `a_value'. -- Set `secure_certificate' from `a_value'.
do do
set_string_option ("ssl_ca_crt", a_value) set_string_option ("secure_certificate", a_value)
end end
set_ssl_ca_key (a_value: detachable READABLE_STRING_GENERAL) set_secure_certificate_key (a_value: detachable READABLE_STRING_GENERAL)
-- Set `ssl_ca_key' with `a_value'. -- Set `secure_certificate_key' with `a_value'.
do do
set_string_option ("ssl_ca_key", a_value) set_string_option ("secure_certificate_key", a_value)
end end
note note
copyright: "2011-2016, Javier Velilla, Jocelyn Fiat and others" copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
5949 Hollister Ave., Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end end

View File

@@ -75,6 +75,12 @@ feature -- Merging
end end
end end
import_ini_file_options (a_filename: READABLE_STRING_GENERAL)
-- Import options from ini file `a_filename'.
do
append_options (create {WSF_SERVICE_LAUNCHER_OPTIONS_FROM_INI}.make_from_file (a_filename))
end
feature -- Access feature -- Access
option (a_name: READABLE_STRING_GENERAL): detachable ANY option (a_name: READABLE_STRING_GENERAL): detachable ANY