Compare commits
20 Commits
restructur
...
es_rev9933
| Author | SHA1 | Date | |
|---|---|---|---|
| 193f22ebc8 | |||
| 5e79751522 | |||
| ac908e4efd | |||
| 885195dbaa | |||
| 2e49febca8 | |||
| 53f4f64596 | |||
| dff9007aa6 | |||
| c34f89df9b | |||
|
|
4a47a00747 | ||
|
|
12508c8e21 | ||
|
|
3d58ef84fa | ||
|
|
3a120f3311 | ||
|
|
d45b90e52a | ||
| c74b9e0c45 | |||
| b8aee435dd | |||
|
|
a4d737d548 | ||
|
|
16f667af2c | ||
|
|
27a5c9d969 | ||
| 32ad7f0c65 | |||
|
|
b66cfce138 |
@@ -30,8 +30,8 @@ feature -- Basic operations
|
||||
response.set_status_code ({HTTP_STATUS_CODE}.ok)
|
||||
response.header.put_content_type_text_html
|
||||
response.header.put_content_length (s.count)
|
||||
if attached request.http_connection as l_connection and then l_connection.is_case_insensitive_equal_general ("keep-alive") then
|
||||
response.header.put_header_key_value ("Connection", "keep-alive")
|
||||
if request.is_keep_alive_http_connection then
|
||||
response.header.put_connection_keep_alive
|
||||
end
|
||||
response.put_string (s)
|
||||
end
|
||||
|
||||
4
examples/simple_file/service.ini
Normal file
4
examples/simple_file/service.ini
Normal file
@@ -0,0 +1,4 @@
|
||||
port=9090
|
||||
verbose=true
|
||||
socket_recv_timeout=15
|
||||
keep_alive_timeout=30
|
||||
@@ -21,6 +21,7 @@ feature {NONE} -- Initialization
|
||||
do
|
||||
Precursor
|
||||
set_service_option ("port", 9090)
|
||||
import_service_options (create {WSF_SERVICE_LAUNCHER_OPTIONS_FROM_INI}.make_from_file ("service.ini"))
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
note
|
||||
description : "simple application root class"
|
||||
date : "$Date$"
|
||||
revision : "$Revision$"
|
||||
description: "simple application root class"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
APPLICATION
|
||||
|
||||
inherit
|
||||
WSF_DEFAULT_SERVICE [APPLICATION_EXECUTION]
|
||||
WSF_STANDALONE_SERVICE [APPLICATION_EXECUTION]
|
||||
redefine
|
||||
initialize
|
||||
end
|
||||
@@ -19,11 +19,17 @@ feature {NONE} -- Initialization
|
||||
|
||||
initialize
|
||||
-- Initialize current service.
|
||||
local
|
||||
opts: WSF_STANDALONE_SERVICE_OPTIONS
|
||||
do
|
||||
-- Specific to `standalone' connector (the EiffelWeb server).
|
||||
-- See `{WSF_STANDALONE_SERVICE_LAUNCHER}.initialize'
|
||||
set_service_option ("port", 9090)
|
||||
import_service_options (create {WSF_SERVICE_LAUNCHER_OPTIONS_FROM_INI}.make_from_file ("simple.ini"))
|
||||
create opts
|
||||
opts.port := 9090
|
||||
opts.socket_recv_timeout := 5 -- seconds
|
||||
|
||||
opts.import_ini_file_options ("simple.ini")
|
||||
import_service_options (opts)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -32,8 +32,8 @@ feature -- Basic operations
|
||||
response.set_status_code ({HTTP_STATUS_CODE}.ok)
|
||||
response.header.put_content_type_text_html
|
||||
response.header.put_content_length (s.count)
|
||||
if attached request.http_connection as l_connection and then l_connection.is_case_insensitive_equal_general ("keep-alive") then
|
||||
response.header.put_header_key_value ("Connection", "keep-alive")
|
||||
if request.is_keep_alive_http_connection then
|
||||
response.header.put_connection_keep_alive
|
||||
end
|
||||
response.put_string (s)
|
||||
end
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
</option>
|
||||
<setting name="console_application" value="true"/>
|
||||
<setting name="concurrency" value="scoop"/>
|
||||
<variable name="httpd_ssl_enabled" value="true"/>
|
||||
<variable name="ssl_enabled" value="true"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="default_standalone" location="..\..\library\server\wsf\default\standalone-safe.ecf"/>
|
||||
<library name="wsf_standalone" location="..\..\library\server\wsf\connector\standalone-safe.ecf"/>
|
||||
<library name="http" location="..\..\library\network\protocol\http\http-safe.ecf"/>
|
||||
<library name="wsf" location="..\..\library\server\wsf\wsf-safe.ecf"/>
|
||||
<cluster name="simple" location=".\" recursive="true"/>
|
||||
|
||||
@@ -35,8 +35,8 @@ feature -- Basic operations
|
||||
response.set_status_code ({HTTP_STATUS_CODE}.ok)
|
||||
response.header.put_content_type_text_html
|
||||
response.header.put_content_length (s.count)
|
||||
if attached request.http_connection as l_connection and then l_connection.is_case_insensitive_equal_general ("keep-alive") then
|
||||
response.header.put_header_key_value ("Connection", "keep-alive")
|
||||
if request.is_keep_alive_http_connection then
|
||||
response.header.put_connection_keep_alive
|
||||
end
|
||||
response.put_string (s)
|
||||
end
|
||||
@@ -96,9 +96,10 @@ $(document).ready(function() {
|
||||
|
||||
function connect(){
|
||||
|
||||
var host = "##WSSCHEME##://127.0.0.1:##PORTNUMBER##";
|
||||
var host = "##WSSCHEME##://127.0.0.1:##PORTNUMBER##/app";
|
||||
|
||||
try{
|
||||
|
||||
socket = new WebSocket(host);
|
||||
message('<p class="event">Socket Status: '+socket.readyState);
|
||||
socket.onopen = function(){
|
||||
|
||||
@@ -18,12 +18,17 @@
|
||||
<library name="encoder" location="..\..\text\encoder\encoder-safe.ecf"/>
|
||||
<library name="http" location="..\protocol\http\http-safe.ecf"/>
|
||||
<library name="http_auth" location="..\..\server\authentication\http_authorization\http_authorization-safe.ecf"/>
|
||||
<library name="http_network" location="..\http_network\http_network-safe.ecf"/>
|
||||
<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">
|
||||
<condition>
|
||||
<custom name="net_http_client_disabled" excluded_value="true"/>
|
||||
<custom name="netssl_http_client_enabled" value="true"/>
|
||||
</condition>
|
||||
<condition>
|
||||
<custom name="net_http_client_disabled" excluded_value="true"/>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
</condition>
|
||||
</library>
|
||||
<library name="uri" location="$ISE_LIBRARY\library\text\uri\uri-safe.ecf"/>
|
||||
<cluster name="src" location=".\src\">
|
||||
@@ -37,18 +42,6 @@
|
||||
<custom name="net_http_client_disabled" excluded_value="true"/>
|
||||
</condition>
|
||||
</cluster>
|
||||
<cluster name="net_ssl_disabled" location="$|no_ssl\">
|
||||
<condition>
|
||||
<custom name="net_http_client_disabled" excluded_value="true"/>
|
||||
<custom name="netssl_http_client_enabled" excluded_value="true"/>
|
||||
</condition>
|
||||
</cluster>
|
||||
<cluster name="net_ssl_enabled" location="$|ssl\">
|
||||
<condition>
|
||||
<custom name="net_http_client_disabled" excluded_value="true"/>
|
||||
<custom name="netssl_http_client_enabled" value="true"/>
|
||||
</condition>
|
||||
</cluster>
|
||||
</cluster>
|
||||
<cluster name="spec_libcurl" location="$|spec\libcurl\" recursive="true">
|
||||
<condition>
|
||||
|
||||
@@ -18,12 +18,17 @@
|
||||
<library name="encoder" location="..\..\text\encoder\encoder.ecf"/>
|
||||
<library name="http" location="..\protocol\http\http.ecf"/>
|
||||
<library name="http_auth" location="..\..\server\authentication\http_authorization\http_authorization.ecf"/>
|
||||
<library name="http_network" location="..\http_network\http_network.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="net_http_client_disabled" excluded_value="true"/>
|
||||
<custom name="netssl_http_client_enabled" value="true"/>
|
||||
</condition>
|
||||
<condition>
|
||||
<custom name="net_http_client_disabled" excluded_value="true"/>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
</condition>
|
||||
</library>
|
||||
<library name="uri" location="$ISE_LIBRARY\library\text\uri\uri.ecf"/>
|
||||
<cluster name="src" location=".\src\">
|
||||
@@ -37,18 +42,6 @@
|
||||
<custom name="net_http_client_disabled" excluded_value="true"/>
|
||||
</condition>
|
||||
</cluster>
|
||||
<cluster name="net_ssl_disabled" location="$|no_ssl\">
|
||||
<condition>
|
||||
<custom name="net_http_client_disabled" excluded_value="true"/>
|
||||
<custom name="netssl_http_client_enabled" excluded_value="true"/>
|
||||
</condition>
|
||||
</cluster>
|
||||
<cluster name="net_ssl_enabled" location="$|ssl\">
|
||||
<condition>
|
||||
<custom name="net_http_client_disabled" excluded_value="true"/>
|
||||
<custom name="netssl_http_client_enabled" value="true"/>
|
||||
</condition>
|
||||
</cluster>
|
||||
</cluster>
|
||||
<cluster name="spec_libcurl" location="$|spec\libcurl\" recursive="true">
|
||||
<condition>
|
||||
|
||||
@@ -27,20 +27,6 @@
|
||||
<cluster name="src" location=".\src\">
|
||||
<cluster name="spec_net" location="$|spec\net\">
|
||||
<cluster name="net_implementation" location="$|implementation\" hidden="true"/>
|
||||
<cluster name="net_ssl_disabled" location="$|no_ssl\">
|
||||
<condition>
|
||||
<custom name="ssl_enabled" excluded_value="true"/>
|
||||
<custom name="netssl_http_client_enabled" excluded_value="true"/>
|
||||
</condition>
|
||||
</cluster>
|
||||
<cluster name="net_ssl_enabled" location="$|ssl\">
|
||||
<condition>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
</condition>
|
||||
<condition>
|
||||
<custom name="netssl_http_client_enabled" value="true"/>
|
||||
</condition>
|
||||
</cluster>
|
||||
</cluster>
|
||||
<cluster name="default_net" location="$|default\net\"/>
|
||||
</cluster>
|
||||
|
||||
@@ -27,20 +27,6 @@
|
||||
<cluster name="src" location=".\src\">
|
||||
<cluster name="spec_net" location="$|spec\net\">
|
||||
<cluster name="net_implementation" location="$|implementation\" hidden="true"/>
|
||||
<cluster name="net_ssl_disabled" location="$|no_ssl\">
|
||||
<condition>
|
||||
<custom name="ssl_enabled" excluded_value="true"/>
|
||||
<custom name="netssl_http_client_enabled" excluded_value="true"/>
|
||||
</condition>
|
||||
</cluster>
|
||||
<cluster name="net_ssl_enabled" location="$|ssl\">
|
||||
<condition>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
</condition>
|
||||
<condition>
|
||||
<custom name="netssl_http_client_enabled" value="true"/>
|
||||
</condition>
|
||||
</cluster>
|
||||
</cluster>
|
||||
<cluster name="default_net" location="$|default\net\"/>
|
||||
</cluster>
|
||||
|
||||
@@ -14,7 +14,7 @@ inherit
|
||||
close
|
||||
end
|
||||
|
||||
NET_HTTP_CLIENT_INFO
|
||||
HTTP_SECURE_HELPER
|
||||
|
||||
create
|
||||
make
|
||||
@@ -32,7 +32,7 @@ feature -- Status report
|
||||
do
|
||||
Result := True
|
||||
if base_url.starts_with_general ("https://") then
|
||||
Result := has_https_support
|
||||
Result := is_secure_connection_supported
|
||||
end
|
||||
end
|
||||
|
||||
@@ -172,7 +172,7 @@ feature {NONE} -- Implementation
|
||||
end
|
||||
|
||||
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)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
note
|
||||
description: "Additional information related to NET HTTP Client.."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
NET_HTTP_CLIENT_INFO
|
||||
|
||||
feature -- Access
|
||||
|
||||
has_https_support: BOOLEAN = False
|
||||
-- Is HTTPS supported?
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
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
|
||||
@@ -1,24 +0,0 @@
|
||||
note
|
||||
description: "Additional information related to NET HTTP Client.."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
NET_HTTP_CLIENT_INFO
|
||||
|
||||
feature -- Access
|
||||
|
||||
has_https_support: BOOLEAN = True
|
||||
-- Is HTTPS supported?
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
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
|
||||
@@ -34,9 +34,31 @@
|
||||
<custom name="httpd_ssl_enabled" value="true"/>
|
||||
</condition>
|
||||
</library>
|
||||
|
||||
<external_include location="$(ISE_LIBRARY)/unstable/library/network/socket/netssl/spec/include">
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
<version type="compiler" max="16.11.0.0"/>
|
||||
</condition>
|
||||
</external_include>
|
||||
<external_include location="$(ISE_LIBRARY)\unstable\library\network\socket\netssl\spec\include">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
<version type="compiler" max="16.11.0.0"/>
|
||||
</condition>
|
||||
</external_include>
|
||||
<external_cflag value="-D_WINSOCKAPI_">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
<version type="compiler" max="16.11.0.0"/>
|
||||
</condition>
|
||||
</external_cflag>
|
||||
<cluster name="network" location=".\src\">
|
||||
<file_rule>
|
||||
<exclude>/httpd_stream_socket_ext.e$</exclude>
|
||||
<exclude>/http_stream_socket_ext.e$</exclude>
|
||||
<condition>
|
||||
<version type="compiler" max="16.11.0.0"/>
|
||||
</condition>
|
||||
@@ -59,7 +81,7 @@
|
||||
<custom name="httpd_ssl_enabled" value="true"/>
|
||||
</condition>
|
||||
<file_rule>
|
||||
<exclude>/httpd_stream_ssl_socket_ext.e$</exclude>
|
||||
<exclude>/http_stream_secure_socket_ext.e$</exclude>
|
||||
<condition>
|
||||
<version type="compiler" max="16.11.0.0"/>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
@@ -95,4 +117,7 @@
|
||||
</cluster>
|
||||
</cluster>
|
||||
</target>
|
||||
<target name="http_network_ssl" extends="http_network">
|
||||
<variable name="ssl_enabled" value="true" />
|
||||
</target>
|
||||
</system>
|
||||
|
||||
@@ -34,9 +34,31 @@
|
||||
<custom name="httpd_ssl_enabled" value="true"/>
|
||||
</condition>
|
||||
</library>
|
||||
|
||||
<external_include location="$(ISE_LIBRARY)/unstable/library/network/socket/netssl/spec/include">
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
<version type="compiler" max="16.11.0.0"/>
|
||||
</condition>
|
||||
</external_include>
|
||||
<external_include location="$(ISE_LIBRARY)\unstable\library\network\socket\netssl\spec\include">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
<version type="compiler" max="16.11.0.0"/>
|
||||
</condition>
|
||||
</external_include>
|
||||
<external_cflag value="-D_WINSOCKAPI_">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
<version type="compiler" max="16.11.0.0"/>
|
||||
</condition>
|
||||
</external_cflag>
|
||||
<cluster name="network" location=".\src\">
|
||||
<file_rule>
|
||||
<exclude>/httpd_stream_socket_ext.e$</exclude>
|
||||
<exclude>/http_stream_socket_ext.e$</exclude>
|
||||
<condition>
|
||||
<version type="compiler" max="16.11.0.0"/>
|
||||
</condition>
|
||||
@@ -59,7 +81,7 @@
|
||||
<custom name="httpd_ssl_enabled" value="true"/>
|
||||
</condition>
|
||||
<file_rule>
|
||||
<exclude>/httpd_stream_ssl_socket_ext.e$</exclude>
|
||||
<exclude>/http_stream_secure_socket_ext.e$</exclude>
|
||||
<condition>
|
||||
<version type="compiler" max="16.11.0.0"/>
|
||||
<custom name="ssl_enabled" value="true"/>
|
||||
@@ -95,4 +117,7 @@
|
||||
</cluster>
|
||||
</cluster>
|
||||
</target>
|
||||
<target name="http_network_ssl" extends="http_network">
|
||||
<variable name="ssl_enabled" value="true" />
|
||||
</target>
|
||||
</system>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
indexing
|
||||
description: "Functions used by the EiffelWeb httpd networking classes. "
|
||||
description: "Functions used by the EiffelWeb http networking classes. "
|
||||
copyright: "Copyright (c) 2011-2016, Jocelyn Fiat, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
@@ -12,8 +12,8 @@ indexing
|
||||
]"
|
||||
*/
|
||||
|
||||
#ifndef _ew_httpd_net_h_
|
||||
#define _ew_httpd_net_h_
|
||||
#ifndef _ew_network_h_
|
||||
#define _ew_network_h_
|
||||
|
||||
#include "eif_config.h"
|
||||
|
||||
@@ -81,7 +81,7 @@ feature {NONE} -- Externals
|
||||
c_set_sock_recv_timeout (a_fd, a_level: INTEGER; a_timeout_seconds: INTEGER)
|
||||
-- C routine to set socket option `SO_RCVTIMEO' with `a_timeout_seconds' seconds.
|
||||
external
|
||||
"C inline use %"ew_httpd_net.h%""
|
||||
"C inline use %"ew_network.h%""
|
||||
alias
|
||||
"[
|
||||
#ifdef SO_RCVTIMEO
|
||||
@@ -105,7 +105,7 @@ feature {NONE} -- Externals
|
||||
c_set_sock_send_timeout (a_fd, a_level: INTEGER; a_timeout_seconds: INTEGER)
|
||||
-- C routine to set socket option `SO_SNDTIMEO' with `a_timeout_seconds' seconds.
|
||||
external
|
||||
"C inline use %"ew_httpd_net.h%""
|
||||
"C inline use %"ew_network.h%""
|
||||
alias
|
||||
"[
|
||||
#ifdef SO_RCVTIMEO
|
||||
@@ -131,7 +131,7 @@ feature {NONE} -- No-Exception network operation
|
||||
-- External routine to read a `len' number of characters
|
||||
-- into buffer `buf' from socket `a_fd' with options `flags'.
|
||||
external
|
||||
"C inline use %"ew_httpd_net.h%""
|
||||
"C inline use %"ew_network.h%""
|
||||
alias
|
||||
"[
|
||||
recv((int) $a_fd, (char *) $buf, (int) $len, (int) $flags)
|
||||
@@ -150,7 +150,7 @@ feature {NONE} -- No-Exception network operation
|
||||
-- length `length' to socket `fd'.
|
||||
-- Note: does not raise exception on error, but return error value as Result.
|
||||
external
|
||||
"C inline use %"ew_httpd_net.h%""
|
||||
"C inline use %"ew_network.h%""
|
||||
alias
|
||||
"[
|
||||
send((int) $a_fd, (char *) $buf, (int) $len, (int) 0)
|
||||
|
||||
@@ -508,9 +508,16 @@ feature -- Others
|
||||
|
||||
put_expires (a_seconds: INTEGER)
|
||||
-- Put "Expires" header to `a_seconds' seconds
|
||||
-- and also "Cache-Control: max-age=.." .
|
||||
-- To be supported by most browser.
|
||||
local
|
||||
dt: DATE_TIME
|
||||
do
|
||||
put_expires_string (a_seconds.out)
|
||||
end
|
||||
create dt.make_now_utc
|
||||
dt.second_add (a_seconds)
|
||||
put_expires_date (dt)
|
||||
put_cache_control ("max-age=" + a_seconds.out)
|
||||
end
|
||||
|
||||
put_expires_string (a_expires: STRING)
|
||||
-- Put "Expires" header with `a_expires' string value
|
||||
@@ -544,6 +551,26 @@ feature -- Others
|
||||
put_pragma ("no-cache")
|
||||
end
|
||||
|
||||
feature -- Connection
|
||||
|
||||
put_connection (a_conn: READABLE_STRING_8)
|
||||
-- Put "Connection" header with `a_conn' value.
|
||||
do
|
||||
put_header_key_value ({HTTP_HEADER_NAMES}.header_connection, a_conn)
|
||||
end
|
||||
|
||||
put_connection_keep_alive
|
||||
-- Put "Connection" header with "keep-alive".
|
||||
do
|
||||
put_connection ("keep-alive")
|
||||
end
|
||||
|
||||
put_connection_close
|
||||
-- Put "Connection" header with "close".
|
||||
do
|
||||
put_connection ("close")
|
||||
end
|
||||
|
||||
feature -- Redirection
|
||||
|
||||
put_location (a_uri: READABLE_STRING_8)
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
<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="protocol" uuid="97582991-7BF3-4F4D-8944-8141ADE34274" library_target="protocol">
|
||||
<target name="protocol">
|
||||
<root all_classes="true"/>
|
||||
<option void_safety="none">
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
|
||||
<cluster name="src" location=".\" recursive="true"/>
|
||||
</target>
|
||||
|
||||
@@ -22,9 +22,9 @@ feature {NONE} -- Initialization
|
||||
opts.set_is_verbose (True) -- For debug purpose
|
||||
opts.set_verbose_level ("debug")
|
||||
|
||||
opts.set_ssl_enabled (True) -- If SSL is supported
|
||||
opts.set_ssl_ca_crt ("ca.crt") -- Change to use your own crt file.
|
||||
opts.set_ssl_ca_key ("ca.key") -- Change to use your own key file.
|
||||
opts.set_is_secure (True) -- If SSL is supported
|
||||
opts.set_secure_certificate ("ca.crt") -- Change to use your own crt file.
|
||||
opts.set_secure_certificate_key ("ca.key") -- Change to use your own key file.
|
||||
|
||||
opts.set_port (default_port_number)
|
||||
end
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-16-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-16-0 http://www.eiffel.com/developers/xml/configuration-1-16-0.xsd" name="echo_websocket_server" uuid="C9B3DA5F-DF0D-4C0F-924A-130B5C1E6604">
|
||||
<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="echo_websocket_server" uuid="C9B3DA5F-DF0D-4C0F-924A-130B5C1E6604">
|
||||
<target name="common">
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
@@ -7,11 +7,12 @@
|
||||
<exclude>/CVS$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
</file_rule>
|
||||
<option concurrency="none" debug="true" warning="true" full_class_checking="false" is_attached_by_default="true" is_obsolete_routine_type="true" void_safety="all" syntax="transitional">
|
||||
<option debug="true" warning="true" full_class_checking="false" is_attached_by_default="true" is_obsolete_routine_type="true" void_safety="all" syntax="transitional">
|
||||
<debug name="ws" enabled="true"/>
|
||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||
</option>
|
||||
<setting name="console_application" value="true"/>
|
||||
<setting name="concurrency" value="scoop"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf">
|
||||
<option>
|
||||
<assertions precondition="true"/>
|
||||
@@ -30,18 +31,16 @@
|
||||
</target>
|
||||
<target name="echo_websocket_server_mt" extends="common">
|
||||
<root class="APPLICATION" feature="make_and_launch"/>
|
||||
<option concurrency="thread" root_concurrency="thread">
|
||||
</option>
|
||||
<setting name="concurrency" value="thread"/>
|
||||
</target>
|
||||
<target name="echo_websocket_server_mt_ssl" extends="echo_websocket_server_mt">
|
||||
<variable name="ssl_enabled" value="true"/>
|
||||
</target>
|
||||
<target name="echo_websocket_server_scoop" extends="common">
|
||||
<root class="APPLICATION" feature="make_and_launch"/>
|
||||
<option concurrency="scoop" root_concurrency="scoop">
|
||||
</option>
|
||||
<setting name="concurrency" value="scoop"/>
|
||||
</target>
|
||||
<target name="echo_websocket_server_scoop_ssl" extends="echo_websocket_server_scoop">
|
||||
<variable name="httpd_ssl_enabled" value="true"/>
|
||||
<variable name="ssl_enabled" value="true"/>
|
||||
</target>
|
||||
</system>
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="crypto" location="$ISE_LIBRARY\unstable\library\text\encryption\crypto\crypto-safe.ecf"/>
|
||||
<library name="encoder" location="..\..\..\text\encoder\encoder-safe.ecf"/>
|
||||
<library name="standalone_websocket_connector" location="..\..\..\server\wsf\connector\standalone_websocket-safe.ecf" readonly="false"/>
|
||||
<library name="wsf" location="..\..\..\server\wsf\wsf-safe.ecf" readonly="false"/>
|
||||
<library name="standalone_websocket_connector" location="..\..\..\server\wsf\connector\standalone_websocket-safe.ecf"/>
|
||||
<library name="wsf" location="..\..\..\server\wsf\wsf-safe.ecf"/>
|
||||
|
||||
<library name="net" location="$ISE_LIBRARY\library\net\net-safe.ecf"/>
|
||||
<library name="thread" location="$ISE_LIBRARY\library\thread\thread-safe.ecf">
|
||||
@@ -25,9 +25,6 @@
|
||||
</condition>
|
||||
</library>
|
||||
<library name="time" location="$ISE_LIBRARY\library\time\time-safe.ecf"/>
|
||||
<!--
|
||||
<cluster name="protocol" location="..\protocol\" recursive="true"/>
|
||||
-->
|
||||
<cluster name="websocket_server" location=".\src\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base.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="http_network" location="..\..\http_network\http_network.ecf" readonly="false"/>
|
||||
<library name="httpd" location="lib\httpd\httpd.ecf"/>
|
||||
<library name="standalone_websocket_connector" location="..\..\..\server\wsf\connector\standalone_websocket.ecf"/>
|
||||
<library name="wsf" location="..\..\..\server\wsf\wsf.ecf"/>
|
||||
<library name="net" location="$ISE_LIBRARY\library\net\net.ecf"/>
|
||||
<library name="thread" location="$ISE_LIBRARY\library\thread\thread.ecf">
|
||||
<condition>
|
||||
@@ -24,7 +24,6 @@
|
||||
</condition>
|
||||
</library>
|
||||
<library name="time" location="$ISE_LIBRARY\library\time\time.ecf"/>
|
||||
<cluster name="protocol" location="..\protocol\" recursive="true"/>
|
||||
<cluster name="websocket_server" location=".\src\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
|
||||
@@ -10,11 +10,6 @@
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="connector_standalone" location="standalone-safe.ecf" readonly="false"/>
|
||||
<library name="ewsgi" location="..\..\ewsgi-safe.ecf" readonly="false"/>
|
||||
<library name="httpd_edit" location="lib\httpd\httpd-safe.ecf" readonly="false">
|
||||
<option debug="true">
|
||||
<debug name="dbglog" enabled="true"/>
|
||||
</option>
|
||||
</library>
|
||||
<library name="wsf" location="..\..\..\wsf\wsf-safe.ecf" readonly="false"/>
|
||||
<cluster name="tests" location="tests\" recursive="true"/>
|
||||
</target>
|
||||
@@ -27,7 +22,7 @@
|
||||
<target name="test_connector_standalone" extends="test_standalone_scoop">
|
||||
</target>
|
||||
<target name="test_standalone_scoop_ssl" extends="test_standalone_scoop">
|
||||
<variable name="httpd_ssl_enabled" value="true"/>
|
||||
<variable name="ssl_enabled" value="true"/>
|
||||
<variable name="libcurl_http_client_disabled" value="true"/>
|
||||
<variable name="net_http_client_disabled" value="false"/>
|
||||
<variable name="netssl_http_client_enabled" value="true"/>
|
||||
|
||||
@@ -131,6 +131,12 @@ feature -- Output operation
|
||||
wgi_response.put_substring (s, a_begin_index, a_end_index)
|
||||
end
|
||||
|
||||
put_file_content (f: FILE; a_offset: INTEGER; a_count: INTEGER)
|
||||
-- Send `a_count' bytes from the content of file `f' starting at offset `a_offset'.
|
||||
do
|
||||
wgi_response.put_file_content (f, a_offset, a_count)
|
||||
end
|
||||
|
||||
flush
|
||||
-- Flush if it makes sense
|
||||
do
|
||||
|
||||
@@ -142,6 +142,14 @@ feature -- Output operation
|
||||
deferred
|
||||
end
|
||||
|
||||
put_file_content (f: FILE; a_offset: INTEGER; a_count: INTEGER)
|
||||
-- Send `a_count' bytes from the content of file `f' starting at offset `a_offset'.
|
||||
require
|
||||
message_writable: message_writable
|
||||
not_too_big: a_offset + a_count <= f.count
|
||||
deferred
|
||||
end
|
||||
|
||||
flush
|
||||
-- Flush if it makes sense
|
||||
deferred
|
||||
|
||||
@@ -37,6 +37,53 @@ feature -- Output
|
||||
end
|
||||
end
|
||||
|
||||
put_file_content (a_file: FILE; a_offset: INTEGER; a_byte_count: INTEGER)
|
||||
-- Send `a_byte_count' bytes from the content of file `a_file' starting at offset `a_offset'.
|
||||
--| Could be redefined for optimization.
|
||||
require
|
||||
a_file_closed_or_openread: a_file.exists and then (a_file.is_access_readable or a_file.is_closed)
|
||||
is_open_write: is_open_write
|
||||
a_file_not_void: a_file /= Void
|
||||
local
|
||||
l_close_needed: BOOLEAN
|
||||
l_remain: INTEGER
|
||||
l_done: BOOLEAN
|
||||
s: STRING
|
||||
do
|
||||
if a_file.exists and then a_file.is_access_readable then
|
||||
if a_file.is_open_read then
|
||||
l_close_needed := False
|
||||
else
|
||||
l_close_needed := True
|
||||
a_file.open_read
|
||||
end
|
||||
if a_offset > 0 then
|
||||
a_file.move (a_offset)
|
||||
end
|
||||
from
|
||||
l_remain := a_byte_count
|
||||
l_done := False
|
||||
until
|
||||
a_file.exhausted or l_done
|
||||
loop
|
||||
a_file.read_stream (l_remain.min (4_096))
|
||||
s := a_file.last_string
|
||||
if s.is_empty then
|
||||
-- network error?
|
||||
l_done := True
|
||||
else
|
||||
put_string (s)
|
||||
l_remain := l_remain - s.count
|
||||
check l_remain >= 0 end
|
||||
l_done := l_remain = 0
|
||||
end
|
||||
end
|
||||
if l_close_needed then
|
||||
a_file.close
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
put_character (c: CHARACTER_8)
|
||||
-- Write `c' to output stream.
|
||||
--| Could be redefined for optimization
|
||||
|
||||
@@ -103,6 +103,12 @@ feature -- Output operation
|
||||
output.put_substring (s, start_index, end_index)
|
||||
end
|
||||
|
||||
put_file_content (f: FILE; a_offset: INTEGER; a_count: INTEGER)
|
||||
-- Send `a_count' bytes from the content of file `f' starting at offset `a_offset'.
|
||||
do
|
||||
output.put_file_content (f, a_offset, a_count)
|
||||
end
|
||||
|
||||
flush
|
||||
do
|
||||
output.flush
|
||||
|
||||
@@ -455,14 +455,11 @@ feature -- Parsing
|
||||
-- Except for HTTP/1.0, persistent connection is the default.
|
||||
is_persistent_connection_requested := True
|
||||
if is_http_version_1_0 then
|
||||
is_persistent_connection_requested := attached request_header_map.item ("Connection") as l_connection and then
|
||||
l_connection.is_case_insensitive_equal_general ("keep-alive")
|
||||
is_persistent_connection_requested := has_keep_alive_http_connection_header (request_header_map)
|
||||
else
|
||||
-- By default HTTP:1/1 support persistent connection.
|
||||
if attached request_header_map.item ("Connection") as l_connection then
|
||||
if l_connection.is_case_insensitive_equal_general ("close") then
|
||||
is_persistent_connection_requested := False
|
||||
end
|
||||
if has_close_http_connection_header (request_header_map) then
|
||||
is_persistent_connection_requested := False
|
||||
else
|
||||
is_persistent_connection_requested := True
|
||||
end
|
||||
@@ -476,6 +473,46 @@ feature -- Parsing
|
||||
end
|
||||
end
|
||||
|
||||
has_keep_alive_http_connection_header (h_map: like request_header_map): BOOLEAN
|
||||
-- Does Current request header map `h_map' have "keep-alive" connection header?
|
||||
local
|
||||
i: INTEGER
|
||||
do
|
||||
if attached h_map.item ("Connection") as l_connection then
|
||||
-- Could be for instance "keep-alive, Upgrade"
|
||||
i := l_connection.substring_index ("keep-alive", 1)
|
||||
if i > 0 then
|
||||
i := i + 9 -- "keep-alive" has 10 characters
|
||||
check i <= l_connection.count end
|
||||
if i = l_connection.count then
|
||||
Result := True
|
||||
else
|
||||
Result := l_connection [i + 1] = ',' or l_connection [i + 1].is_space
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
has_close_http_connection_header (h_map: like request_header_map): BOOLEAN
|
||||
-- Does Current request header map `h_map' have "close" connection header?
|
||||
local
|
||||
i: INTEGER
|
||||
do
|
||||
if attached h_map.item ("Connection") as l_connection then
|
||||
-- Could be for instance "close, ..."
|
||||
i := l_connection.substring_index ("close", 1)
|
||||
if i > 0 then
|
||||
i := i + 4 -- "close" has 5 characters
|
||||
check i <= l_connection.count end
|
||||
if i = l_connection.count then
|
||||
Result := True
|
||||
else
|
||||
Result := l_connection [i + 1] = ',' or l_connection [i + 1].is_space
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
analyze_request_line (line: STRING)
|
||||
-- Analyze `line' as a HTTP request line.
|
||||
-- note: may update `has_error'.
|
||||
|
||||
@@ -18,13 +18,10 @@
|
||||
<library name="ewsgi" location="..\..\ewsgi\ewsgi-safe.ecf"/>
|
||||
<library name="http" location="..\..\..\network\protocol\http\http-safe.ecf"/>
|
||||
<library name="standalone" location="standalone-safe.ecf" readonly="false"/>
|
||||
<library name="nino" location="nino-safe.ecf" readonly="false">
|
||||
<renaming old_name="HTTP_CONSTANTS" new_name="NINO_HTTP_CONSTANTS"/>
|
||||
</library>
|
||||
<library name="standalone_ws" location="standalone_websocket-safe.ecf" readonly="false"/>
|
||||
<library name="openshift" location="openshift-safe.ecf" readonly="false"/>
|
||||
<library name="nino" location="nino-safe.ecf" readonly="false"/>
|
||||
<library name="time" location="$ISE_LIBRARY\library\time\time-safe.ecf"/>
|
||||
<library name="wsf" location="..\wsf-safe.ecf"/>
|
||||
<cluster name="wsf_cgi" location=".\cgi\" recursive="true"/>
|
||||
<cluster name="wsf_libfcgi" location=".\libfcgi\" recursive="true"/>
|
||||
<cluster name="wsf_standalone" location=".\standalone\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-16-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-16-0 http://www.eiffel.com/developers/xml/configuration-1-16-0.xsd" name="wsf_standalone" uuid="9BF2D71A-0986-4025-9C97-15B65F07C568" library_target="wsf_standalone">
|
||||
<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="wsf_standalone" uuid="9BF2D71A-0986-4025-9C97-15B65F07C568" library_target="wsf_standalone">
|
||||
<target name="wsf_standalone">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
@@ -7,8 +7,9 @@
|
||||
<exclude>/\.git$</exclude>
|
||||
<exclude>/\.svn$</exclude>
|
||||
</file_rule>
|
||||
<option concurrency="none" warning="true" full_class_checking="true" is_attached_by_default="true" is_obsolete_routine_type="true" void_safety="all" syntax="provisional">
|
||||
<option warning="true" full_class_checking="true" is_attached_by_default="true" is_obsolete_routine_type="true" void_safety="all" syntax="provisional">
|
||||
</option>
|
||||
<setting name="concurrency" value="scoop" />
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="connector_standalone" location="..\..\ewsgi\connectors\standalone\standalone-safe.ecf" use_application_options="true"/>
|
||||
<library name="encoder" location="..\..\..\text\encoder\encoder-safe.ecf" readonly="false"/>
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
note
|
||||
description: "[
|
||||
Service using standalone connector launcher.
|
||||
]"
|
||||
author: "$Author$"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
WSF_STANDALONE_SERVICE [G -> WSF_EXECUTION create make end]
|
||||
|
||||
inherit
|
||||
WSF_LAUNCHABLE_SERVICE
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
launch (opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
|
||||
local
|
||||
l_launcher: WSF_STANDALONE_SERVICE_LAUNCHER [G]
|
||||
do
|
||||
create l_launcher.make_and_launch (opts)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-16-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-16-0 http://www.eiffel.com/developers/xml/configuration-1-16-0.xsd" name="default_standalone" uuid="5CBA8C5A-3191-434A-8DE1-C0C3CAC9C4F4" library_target="default_standalone">
|
||||
<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="default_standalone" uuid="5CBA8C5A-3191-434A-8DE1-C0C3CAC9C4F4" library_target="default_standalone">
|
||||
<target name="default_standalone">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
@@ -7,11 +7,12 @@
|
||||
<exclude>/\.git$</exclude>
|
||||
<exclude>/\.svn$</exclude>
|
||||
</file_rule>
|
||||
<option concurrency="none" warning="true" full_class_checking="true" is_attached_by_default="true" is_obsolete_routine_type="true" void_safety="all" syntax="provisional">
|
||||
<option warning="true" full_class_checking="true" is_attached_by_default="true" is_obsolete_routine_type="true" void_safety="all" syntax="provisional">
|
||||
</option>
|
||||
<setting name="concurrency" value="scoop"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="wsf" location="..\wsf-safe.ecf" use_application_options="true"/>
|
||||
<library name="wsf_standalone" location="..\connector\standalone-safe.ecf" use_application_options="true"/>
|
||||
<library name="wsf_standalone" location="..\connector\standalone-safe.ecf"/>
|
||||
<cluster name="default_standalone" location=".\standalone\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" void_safety="none" syntax="provisional">
|
||||
</option>
|
||||
<setting name="concurrency" value="scoop"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
|
||||
<library name="wsf" location="..\wsf.ecf"/>
|
||||
<library name="wsf_standalone" location="..\connector\standalone.ecf"/>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
note
|
||||
description: "Objects than can pre-process incoming data and post-process outgoing data."
|
||||
author: "Olivier Ligot"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
@@ -9,9 +8,23 @@ deferred class
|
||||
|
||||
feature -- Access
|
||||
|
||||
next: detachable WSF_FILTER
|
||||
next: detachable WSF_FILTER assign set_next
|
||||
-- Next filter
|
||||
|
||||
last: WSF_FILTER
|
||||
-- Last filter in the chain following `next'.
|
||||
do
|
||||
from
|
||||
Result := Current
|
||||
until
|
||||
not attached Result.next as l_next
|
||||
loop
|
||||
Result := l_next
|
||||
end
|
||||
ensure
|
||||
is_closing: Result /= Void and then Result.next = Void
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_next (a_next: like next)
|
||||
@@ -22,6 +35,24 @@ feature -- Element change
|
||||
next_set: next = a_next
|
||||
end
|
||||
|
||||
append (a_filter: attached like next)
|
||||
-- Append `a_filter' to the `last' filter.
|
||||
do
|
||||
last.set_next (a_filter)
|
||||
end
|
||||
|
||||
insert_after (a_filter: attached like next)
|
||||
-- Append `a_filter' to the `last' filter.
|
||||
local
|
||||
f: like next
|
||||
do
|
||||
f := next
|
||||
set_next (a_filter)
|
||||
if f /= Void then
|
||||
a_filter.append (f)
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Basic operations
|
||||
|
||||
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
|
||||
@@ -29,22 +29,19 @@ feature {NONE} -- Initialization
|
||||
deferred
|
||||
end
|
||||
|
||||
append_filter (a_filter: WSF_FILTER)
|
||||
-- Append `a_filter' to the end of the `filter' chain.
|
||||
do
|
||||
filter.append (a_filter)
|
||||
end
|
||||
|
||||
append_filters (a_filters: ITERABLE [WSF_FILTER])
|
||||
-- Append collection `a_filters' of filters to the end of the `filter' chain.
|
||||
local
|
||||
f: like filter
|
||||
l_next_filter: detachable like filter
|
||||
do
|
||||
from
|
||||
f := filter
|
||||
l_next_filter := f.next
|
||||
until
|
||||
l_next_filter = Void
|
||||
loop
|
||||
f := l_next_filter
|
||||
l_next_filter := f.next
|
||||
end
|
||||
check f_attached_without_next: f /= Void and then f.next = Void end
|
||||
f := filter.last
|
||||
across
|
||||
a_filters as ic
|
||||
loop
|
||||
@@ -59,5 +56,4 @@ feature -- Access
|
||||
filter: WSF_FILTER
|
||||
-- Filter
|
||||
|
||||
|
||||
end
|
||||
|
||||
@@ -39,6 +39,7 @@ feature {NONE} -- Initialization
|
||||
|
||||
make_with_path (d: like document_root)
|
||||
do
|
||||
max_age := -1
|
||||
if d.is_empty then
|
||||
document_root := execution_environment.current_working_path
|
||||
else
|
||||
@@ -87,6 +88,7 @@ feature -- Access
|
||||
document_root: PATH
|
||||
|
||||
max_age: INTEGER
|
||||
-- Max age, initialized at -1 by default.
|
||||
|
||||
index_disabled: BOOLEAN
|
||||
-- Index disabled?
|
||||
@@ -367,15 +369,17 @@ feature -- Execution
|
||||
create fres.make_with_content_type (ct, f.path.name)
|
||||
fres.set_status_code ({HTTP_STATUS_CODE}.ok)
|
||||
|
||||
-- cache control
|
||||
-- cache control
|
||||
create dt.make_now_utc
|
||||
fres.header.put_cache_control ("private, max-age=" + max_age.out)
|
||||
fres.header.put_utc_date (dt)
|
||||
if max_age > 0 then
|
||||
dt := dt.twin
|
||||
dt.second_add (max_age)
|
||||
if max_age >= 0 then
|
||||
fres.set_max_age (max_age)
|
||||
if max_age > 0 then
|
||||
dt := dt.twin
|
||||
dt.second_add (max_age)
|
||||
end
|
||||
fres.set_expires_date (dt)
|
||||
end
|
||||
fres.header.put_expires_date (dt)
|
||||
|
||||
fres.set_answer_head_request_method (req.request_method.same_string ({HTTP_REQUEST_METHODS}.method_head))
|
||||
res.send (fres)
|
||||
@@ -388,14 +392,15 @@ feature -- Execution
|
||||
do
|
||||
create dt.make_now_utc
|
||||
create h.make
|
||||
h.put_cache_control ("private, max-age=" + max_age.out)
|
||||
h.put_utc_date (dt)
|
||||
if max_age > 0 then
|
||||
dt := dt.twin
|
||||
dt.second_add (max_age)
|
||||
if max_age >= 0 then
|
||||
h.put_cache_control ("max-age=" + max_age.out)
|
||||
if max_age > 0 then
|
||||
dt := dt.twin
|
||||
dt.second_add (max_age)
|
||||
end
|
||||
h.put_expires_date (dt)
|
||||
end
|
||||
h.put_expires_date (dt)
|
||||
|
||||
if a_utc_date /= Void then
|
||||
h.put_last_modified (a_utc_date)
|
||||
end
|
||||
@@ -637,7 +642,7 @@ feature {NONE} -- implementation: date time
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
|
||||
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
|
||||
@@ -13,6 +13,7 @@ inherit
|
||||
put_character,
|
||||
put_string,
|
||||
put_substring,
|
||||
put_file_content,
|
||||
flush,
|
||||
message_writable,
|
||||
message_committed
|
||||
@@ -108,6 +109,13 @@ feature -- Output operation
|
||||
Precursor (s, a_begin_index, a_end_index)
|
||||
end
|
||||
|
||||
put_file_content (f: FILE; a_offset: INTEGER; a_count: INTEGER)
|
||||
-- Send `a_count' bytes from the content of file `f' starting at offset `a_offset'.
|
||||
do
|
||||
process_header
|
||||
Precursor (f, a_offset, a_count)
|
||||
end
|
||||
|
||||
flush
|
||||
-- Flush if it makes sense
|
||||
do
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
note
|
||||
description : "Objects that ..."
|
||||
author : "$Author$"
|
||||
date : "$Date$"
|
||||
revision : "$Revision$"
|
||||
description: "Response to send a file back to the client"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
WSF_FILE_RESPONSE
|
||||
@@ -105,22 +104,46 @@ feature {NONE} -- Initialization
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_expires_in_seconds (sec: INTEGER)
|
||||
set_max_age (sec: INTEGER)
|
||||
do
|
||||
set_expires (sec.out)
|
||||
header.put_cache_control ("max-age=" + sec.out)
|
||||
end
|
||||
|
||||
set_public_max_age (sec: INTEGER)
|
||||
do
|
||||
header.put_cache_control ("public, max-age=" + sec.out)
|
||||
end
|
||||
|
||||
set_private_max_age (sec: INTEGER)
|
||||
do
|
||||
header.put_cache_control ("private, max-age=" + sec.out)
|
||||
end
|
||||
|
||||
set_expires_in_seconds (sec: INTEGER)
|
||||
-- Set Expires and Cache-control: max-age... to value related `sec' seconds.
|
||||
do
|
||||
header.put_expires (sec)
|
||||
end
|
||||
|
||||
set_expires (s: STRING)
|
||||
-- Set Expires header value to `s'.
|
||||
do
|
||||
header.put_expires_string (s)
|
||||
end
|
||||
|
||||
set_expires_date (dt: DATE_TIME)
|
||||
-- Set Expires header value to date time `dt'.
|
||||
do
|
||||
header.put_expires_date (dt)
|
||||
end
|
||||
|
||||
set_no_cache
|
||||
local
|
||||
h: like header
|
||||
do
|
||||
h := header
|
||||
h.put_expires (0)
|
||||
h.put_cache_control ("max-age=0")
|
||||
h.put_cache_control ("no-cache, must-revalidate")
|
||||
h.put_pragma_no_cache
|
||||
end
|
||||
@@ -250,7 +273,7 @@ feature {NONE} -- Implementation: file system helper
|
||||
f: RAW_FILE
|
||||
do
|
||||
create f.make_with_path (file_path)
|
||||
create Result.make_from_epoch (f.change_date)
|
||||
create Result.make_from_epoch (f.date)
|
||||
end
|
||||
|
||||
file_extension (fn: PATH): STRING_32
|
||||
@@ -293,19 +316,11 @@ feature {NONE} -- Implementation: output
|
||||
create f.make_with_path (fn)
|
||||
check f.is_readable end
|
||||
|
||||
f.open_read
|
||||
from
|
||||
until
|
||||
f.exhausted
|
||||
loop
|
||||
f.read_stream (4_096)
|
||||
res.put_string (f.last_string)
|
||||
end
|
||||
f.close
|
||||
res.put_file_content (f, 0, f.count)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
|
||||
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
|
||||
@@ -1200,11 +1200,19 @@ feature -- HTTP_*
|
||||
|
||||
http_connection: detachable READABLE_STRING_8
|
||||
-- Contents of the Connection: header from the current wgi_request, if there is one.
|
||||
-- Example: 'Keep-Alive'.
|
||||
-- Example: 'keep-alive'.
|
||||
do
|
||||
Result := wgi_request.http_connection
|
||||
end
|
||||
|
||||
is_keep_alive_http_connection: BOOLEAN
|
||||
-- Is a keep-alive connection?
|
||||
do
|
||||
if attached http_connection as conn then
|
||||
Result := conn.starts_with ("keep-alive")
|
||||
end
|
||||
end
|
||||
|
||||
http_expect: detachable READABLE_STRING_8
|
||||
-- The Expect request-header field is used to indicate that particular server behaviors are required by the client.
|
||||
-- Example: '100-continue'.
|
||||
|
||||
@@ -383,6 +383,16 @@ feature -- Body
|
||||
increment_transfered_content_length (a_end_index - a_begin_index + 1)
|
||||
end
|
||||
|
||||
put_file_content (f: FILE; a_offset: INTEGER; a_count: INTEGER)
|
||||
-- Send `a_count' bytes from the content of file `f' starting at offset `a_offset'.
|
||||
require
|
||||
message_writable: message_writable
|
||||
not_too_big: a_offset + a_count <= f.count
|
||||
do
|
||||
wgi_response.put_file_content (f, a_offset, a_count)
|
||||
increment_transfered_content_length (a_count)
|
||||
end
|
||||
|
||||
feature -- Chunk body
|
||||
|
||||
put_chunk (a_content: READABLE_STRING_8; a_ext: detachable READABLE_STRING_8)
|
||||
@@ -572,7 +582,7 @@ feature {NONE} -- Implemenation
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
|
||||
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
|
||||
@@ -108,6 +108,49 @@ feature -- Output operation
|
||||
output.append_substring (s, start_index, end_index)
|
||||
end
|
||||
|
||||
put_file_content (a_file: FILE; a_offset: INTEGER; a_byte_count: INTEGER)
|
||||
-- Send `a_byte_count' bytes from the content of file `a_file' starting at offset `a_offset'.
|
||||
--| Could be redefined for optimization.
|
||||
local
|
||||
l_close_needed: BOOLEAN
|
||||
l_remain: INTEGER
|
||||
l_done: BOOLEAN
|
||||
s: STRING
|
||||
do
|
||||
if a_file.exists and then a_file.is_access_readable then
|
||||
if a_file.is_open_read then
|
||||
l_close_needed := False
|
||||
else
|
||||
l_close_needed := True
|
||||
a_file.open_read
|
||||
end
|
||||
if a_offset > 0 then
|
||||
a_file.move (a_offset)
|
||||
end
|
||||
from
|
||||
l_remain := a_byte_count
|
||||
l_done := False
|
||||
until
|
||||
a_file.exhausted or l_done
|
||||
loop
|
||||
a_file.read_stream (l_remain.min (4_096))
|
||||
s := a_file.last_string
|
||||
if s.is_empty then
|
||||
-- network error?
|
||||
l_done := True
|
||||
else
|
||||
put_string (s)
|
||||
l_remain := l_remain - s.count
|
||||
check l_remain >= 0 end
|
||||
l_done := l_remain = 0
|
||||
end
|
||||
end
|
||||
if l_close_needed then
|
||||
a_file.close
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
flush
|
||||
do
|
||||
output.wipe_out
|
||||
|
||||
@@ -291,11 +291,8 @@ feature {NONE} -- Implementation
|
||||
response.set_status_code (a_status_code)
|
||||
response.header.put_content_type_text_html
|
||||
response.header.put_content_length (s.count)
|
||||
if
|
||||
attached request.http_connection as l_connection and then
|
||||
l_connection.is_case_insensitive_equal_general ("keep-alive")
|
||||
then
|
||||
response.header.put_header_key_value ("Connection", "keep-alive")
|
||||
if request.is_keep_alive_http_connection then
|
||||
response.header.put_connection_keep_alive
|
||||
end
|
||||
response.put_string (s)
|
||||
end
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<library name="filter" location="..\examples\filter\filter-safe.ecf" readonly="false"/>
|
||||
<library name="hello_world" location="..\library\server\ewsgi\examples\hello_world\hello-safe.ecf" readonly="false"/>
|
||||
<library name="http" location="..\library\network\protocol\http\http-safe.ecf" readonly="false"/>
|
||||
<library name="httpd" location="..\library\server\ewsgi\connectors\standalone\lib\httpd\httpd-safe.ecf" readonly="false"/>
|
||||
<library name="httpd" location="..\library\server\httpd\httpd-safe.ecf" readonly="false"/>
|
||||
<library name="http_authorization" location="..\library\server\authentication\http_authorization\http_authorization-safe.ecf" readonly="false"/>
|
||||
<library name="http_client" location="..\library\network\http_client\http_client-safe.ecf" readonly="false"/>
|
||||
<library name="libfcgi" location="..\library\server\libfcgi\libfcgi-safe.ecf" readonly="false"/>
|
||||
|
||||
@@ -67,6 +67,6 @@
|
||||
<target name="all_stable_with_ssl" extends="all_stable">
|
||||
<description>Compiling with ssl enabled</description>
|
||||
<root all_classes="true"/>
|
||||
<variable name="httpd_ssl_enabled" value="true"/>
|
||||
<variable name="ssl_enabled" value="true"/>
|
||||
</target>
|
||||
</system>
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
</target>
|
||||
<target name="{$WIZ.project.name/}_any" extends="common">
|
||||
<root class="{$APP_ROOT/}" feature="make_and_launch"/>
|
||||
{if condition="$WIZ.connectors.use_standalone ~ $WIZ_YES"}<library name="standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\connector\standalone-safe.ecf"/>{/if}
|
||||
{if condition="$WIZ.connectors.use_cgi ~ $WIZ_YES"}<library name="cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\connector\cgi-safe.ecf"/>{/if}
|
||||
{if condition="$WIZ.connectors.use_libfcgi ~ $WIZ_YES"}<library name="libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\connector\libfcgi-safe.ecf"/>{/if}
|
||||
{if condition="$WIZ.connectors.use_standalone ~ $WIZ_YES"}<library name="standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\connector\standalone-safe.ecf"/>{/if}
|
||||
<cluster name="launcher" location=".\launcher\" recursive="true">
|
||||
<cluster name="launcher" location=".\launcher\">
|
||||
<cluster name="any_launcher" location="$|any"/>
|
||||
</cluster>
|
||||
<cluster name="src" location=".\src\" recursive="true"/>
|
||||
|
||||
@@ -20,28 +20,27 @@ feature -- Execution
|
||||
launch (opts: detachable WSF_SERVICE_LAUNCHER_OPTIONS)
|
||||
-- Launch Web Server Application using optionals `opts'.
|
||||
local
|
||||
launcher: WSF_SERVICE_LAUNCHER
|
||||
launcher: WSF_SERVICE_LAUNCHER [G]
|
||||
do
|
||||
l_id := launcher_id
|
||||
if not attached launcher_id as l_id then
|
||||
{unless condition="$WIZ.connectors.use_standalone ~ $WIZ_YES"}{literal}
|
||||
io.error.put_string ("Application launcher not found!%N")
|
||||
(create {EXCEPTIONS}).die (-1){/literal}{/unless}
|
||||
{if condition="$WIZ.connectors.use_standalone ~ $WIZ_YES"}{literal}
|
||||
-- Choose a default -> standalone
|
||||
create {WSF_STANDALONE_SERVICE_LAUNCHER} launcher.make_and_launch (opts){/literal}{/if}
|
||||
create {WSF_STANDALONE_SERVICE_LAUNCHER [G]} launcher.make_and_launch (opts){/literal}{/if}
|
||||
{if condition="$WIZ.connectors.use_standalone ~ $WIZ_YES"}{literal}
|
||||
elseif is_standalone_launcher_id (l_id) then
|
||||
create {WSF_STANDALONE_SERVICE_LAUNCHER} launcher.make_and_launch (opts){/literal}{/if}
|
||||
create {WSF_STANDALONE_SERVICE_LAUNCHER [G]} launcher.make_and_launch (opts){/literal}{/if}
|
||||
{if condition="$WIZ.connectors.use_libfcgi ~ $WIZ_YES"}{literal}
|
||||
elseif is_libfcgi_launcher_id (l_id) then
|
||||
create {WSF_LIBFCGI_SERVICE_LAUNCHER} launcher.make_and_launch (opts){/literal}{/if}
|
||||
create {WSF_LIBFCGI_SERVICE_LAUNCHER [G]} launcher.make_and_launch (opts){/literal}{/if}
|
||||
{if condition="$WIZ.connectors.use_cgi ~ $WIZ_YES"}{literal}
|
||||
elseif is_cgi_launcher_id (l_id) then
|
||||
create {WSF_CGI_SERVICE_LAUNCHER} launcher.make_and_launch (opts){/literal}{/if}
|
||||
create {WSF_CGI_SERVICE_LAUNCHER [G]} launcher.make_and_launch (opts){/literal}{/if}
|
||||
{if condition="$WIZ.connectors.use_standalone ~ $WIZ_YES"}{literal}
|
||||
elseif is_standalone_launcher_id (l_id) then
|
||||
create {WSF_STANDALONE_SERVICE_LAUNCHER} launcher.make_and_launch (opts){/literal}{/if}
|
||||
create {WSF_STANDALONE_SERVICE_LAUNCHER [G]} launcher.make_and_launch (opts){/literal}{/if}
|
||||
{literal}
|
||||
else
|
||||
io.error.put_string ("Application launcher not found!%N")
|
||||
@@ -53,31 +52,39 @@ feature -- Execution
|
||||
-- Launcher id based on the executable extension name if any.
|
||||
-- This can be redefine to customize for your application.
|
||||
--| ex: standalone, cgi, libfcgi or Void.
|
||||
local
|
||||
p: PATH
|
||||
s: READABLE_STRING_32
|
||||
do
|
||||
if attached (create {PATH}.make_from_string (execution_environment.arguments.command_name)).extension as ext then
|
||||
Result := ext
|
||||
create p.make_from_string (execution_environment.arguments.command_name)
|
||||
if attached p.extension as ext then
|
||||
if ext.is_case_insensitive_equal_general ("exe") then
|
||||
-- Windows
|
||||
s := p.name
|
||||
create p.make_from_string (s.head (s.count - 4))
|
||||
Result := p.extension
|
||||
else
|
||||
Result := ext
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Status report
|
||||
{/literal}
|
||||
feature -- Status report{/literal}
|
||||
{if condition="$WIZ.connectors.use_standalone ~ $WIZ_YES"}
|
||||
is_standalone_launcher_id (a_id: READABLE_STRING_GENERAL): BOOLEAN
|
||||
do
|
||||
Result := a_id.is_case_insensitive ("standalone")
|
||||
Result := a_id.is_case_insensitive_equal ("standalone")
|
||||
end{/if}
|
||||
|
||||
{if condition="$WIZ.connectors.use_cgi ~ $WIZ_YES"}
|
||||
is_cgi_launcher_id (a_id: READABLE_STRING_GENERAL): BOOLEAN
|
||||
do
|
||||
Result := a_id.is_case_insensitive ("cgi")
|
||||
Result := a_id.is_case_insensitive_equal ("cgi")
|
||||
end{/if}
|
||||
|
||||
{if condition="$WIZ.connectors.use_libfcgi ~ $WIZ_YES"}
|
||||
is_libfcgi_launcher_id (a_id: READABLE_STRING_GENERAL): BOOLEAN
|
||||
do
|
||||
Result := a_id.is_case_insensitive ("libfcgi")
|
||||
or a_id.is_case_insensitive ("fcgi")
|
||||
Result := a_id.is_case_insensitive_equal ("libfcgi")
|
||||
or a_id.is_case_insensitive_equal ("fcgi")
|
||||
end{/if}
|
||||
|
||||
end
|
||||
|
||||
@@ -14,10 +14,8 @@ inherit
|
||||
redefine
|
||||
initialize
|
||||
end
|
||||
{if condition="$WIZ.routers.use_router ~ $WIZ_YES"}
|
||||
WSF_ROUTED_SERVICE{/if}
|
||||
{if isset="$APP_ROOT"}APPLICATION_LAUNCHER [{$APP_ROOT/}_EXECUTION]{/if}
|
||||
{unless isset="$APP_ROOT"}APPLICATION_LAUNCHER [APPLICATION_EXECUTION]{/if}
|
||||
{unless isset="$APP_ROOT"}APPLICATION_LAUNCHER [APPLICATION_EXECUTION]{/unless}
|
||||
|
||||
{literal}create
|
||||
make_and_launch
|
||||
@@ -29,6 +27,7 @@ feature {NONE} -- Initialization
|
||||
do
|
||||
Precursor
|
||||
set_service_option ("port", {$WIZ.standalone_connector.port/})
|
||||
set_service_option ("verbose", "{$WIZ.standalone_connector.verbose/}")
|
||||
end
|
||||
|
||||
|
||||
|
||||
@@ -11,15 +11,15 @@ class
|
||||
|
||||
inherit
|
||||
{unless condition="$WIZ.routers.use_router ~ $WIZ_YES"}
|
||||
{unless condition="$WIZ.routers.use_filter ~ $WIZ_YES"}
|
||||
{unless condition="$WIZ.filters.use_filter ~ $WIZ_YES"}
|
||||
WSF_EXECUTION{/unless}
|
||||
{if condition="$WIZ.routers.use_filter ~ $WIZ_YES"}
|
||||
{if condition="$WIZ.filters.use_filter ~ $WIZ_YES"}
|
||||
WSF_FILTERED_EXECUTION{/if}
|
||||
{/unless}
|
||||
{if condition="$WIZ.routers.use_router ~ $WIZ_YES"}
|
||||
{unless condition="$WIZ.routers.use_filter ~ $WIZ_YES"}
|
||||
{unless condition="$WIZ.filters.use_filter ~ $WIZ_YES"}
|
||||
WSF_ROUTED_EXECUTION{/unless}
|
||||
{if condition="$WIZ.routers.use_filter ~ $WIZ_YES"}
|
||||
{if condition="$WIZ.filters.use_filter ~ $WIZ_YES"}
|
||||
WSF_FILTERED_ROUTED_EXECUTION{/if}
|
||||
{/if}
|
||||
|
||||
@@ -28,7 +28,6 @@ inherit
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
{/literal}
|
||||
|
||||
{unless condition="$WIZ.routers.use_router ~ $WIZ_YES"}{literal}
|
||||
feature -- Execution
|
||||
|
||||
@@ -42,9 +41,9 @@ feature -- Execution
|
||||
--| To send back easily a simple plaintext message.
|
||||
create mesg.make_with_body ("Hello Eiffel Web")
|
||||
response.send (mesg)
|
||||
end{/unless}
|
||||
|
||||
{if condition="$WIZ.routers.use_filter ~ $WIZ_YES"}{literal}
|
||||
end
|
||||
{/literal}{/unless}
|
||||
{if condition="$WIZ.filters.use_filter ~ $WIZ_YES"}{literal}
|
||||
feature -- Filter
|
||||
|
||||
create_filter
|
||||
@@ -56,15 +55,18 @@ feature -- Filter
|
||||
|
||||
setup_filter
|
||||
-- Setup `filter'
|
||||
local
|
||||
f: like filter
|
||||
do
|
||||
append_filters (<<
|
||||
create {WSF_CORS_FILTER},
|
||||
create {WSF_LOGGING_FILTER}
|
||||
>>)
|
||||
create {WSF_CORS_FILTER} f
|
||||
f.set_next (create {WSF_LOGGING_FILTER})
|
||||
|
||||
--| Chain more filters like {WSF_CUSTOM_HEADER_FILTER}, ...
|
||||
--| and your owns filters.
|
||||
end{/if}
|
||||
|
||||
filter.append (f)
|
||||
end
|
||||
{/literal}{/if}
|
||||
{if condition="$WIZ.routers.use_router ~ $WIZ_YES"}{literal}
|
||||
feature -- Router
|
||||
|
||||
@@ -78,12 +80,12 @@ feature -- Router
|
||||
--| /* are dispatched to serve files/directories contained in "www" directory
|
||||
|
||||
--| Self documentation
|
||||
router.handle_with_request_methods ("/doc", create {WSF_ROUTER_SELF_DOCUMENTATION_HANDLER}.make (router), router.methods_GET)
|
||||
router.handle ("/doc", create {WSF_ROUTER_SELF_DOCUMENTATION_HANDLER}.make (router), router.methods_GET)
|
||||
|
||||
--| Files publisher
|
||||
create fhdl.make_hidden ("www")
|
||||
fhdl.set_directory_index (<<"index.html">>)
|
||||
router.handle_with_request_methods ("", fhdl, router.methods_GET)
|
||||
router.handle ("", fhdl, router.methods_GET)
|
||||
end{/literal}{/if}
|
||||
|
||||
end
|
||||
|
||||
@@ -53,6 +53,8 @@ echo Install framework ewf
|
||||
%SAFE_MD% %TMP_CONTRIB_DIR%\library\web\framework\ewf
|
||||
echo Install library: ewf/ewsgi
|
||||
%COPYCMD% %TMP_DIR%\library\server\ewsgi %TMP_CONTRIB_DIR%\library\web\framework\ewf\ewsgi
|
||||
echo Install library: ewf/httpd
|
||||
%COPYCMD% %TMP_DIR%\library\server\httpd %TMP_CONTRIB_DIR%\library\web\framework\ewf\httpd
|
||||
echo Install library: ewf/libfcgi
|
||||
%COPYCMD% %TMP_DIR%\library\server\libfcgi %TMP_CONTRIB_DIR%\library\web\framework\ewf\libfcgi
|
||||
echo Install library: ewf/wsf
|
||||
@@ -86,6 +88,10 @@ echo Install library: error
|
||||
%COPYCMD% %TMP_DIR%\library\utility\general\error %TMP_CONTRIB_DIR%\library\utility\general\error
|
||||
echo Install library: http_client
|
||||
%COPYCMD% %TMP_DIR%\library\network\http_client %TMP_CONTRIB_DIR%\library\network\http_client
|
||||
echo Install library: http_network
|
||||
%COPYCMD% %TMP_DIR%\library\network\http_network %TMP_CONTRIB_DIR%\library\network\http_network
|
||||
echo Install library: websocket
|
||||
%COPYCMD% %TMP_DIR%\library\network\websocket %TMP_CONTRIB_DIR%\library\network\websocket
|
||||
echo Install library: http
|
||||
%COPYCMD% %TMP_DIR%\library\network\protocol\http %TMP_CONTRIB_DIR%\library\network\protocol\http
|
||||
echo Install library: content_negotiation
|
||||
|
||||
@@ -55,6 +55,10 @@ echo Uninstall library: error
|
||||
%RDCMD% %TMP_CONTRIB_DIR%\library\utility\general\error
|
||||
echo Uninstall library: http_client
|
||||
%RDCMD% %TMP_CONTRIB_DIR%\library\network\http_client
|
||||
echo Uninstall library: http_network
|
||||
%RDCMD% %TMP_CONTRIB_DIR%\library\network\http_network
|
||||
echo Uninstall library: websocket
|
||||
%RDCMD% %TMP_CONTRIB_DIR%\library\network\websocket
|
||||
echo Uninstall library: http
|
||||
%RDCMD% %TMP_CONTRIB_DIR%\library\network\protocol\http
|
||||
echo Uninstall library: content_negotiation
|
||||
|
||||
Reference in New Issue
Block a user