From a44ca1a76c17a9b9730001656e3497014c31377d Mon Sep 17 00:00:00 2001 From: Jocelyn Fiat Date: Tue, 14 Feb 2017 14:47:07 +0100 Subject: [PATCH 01/30] Converted all ecf files to ecf version 1-16-0 . --- .../SimpleWebServer/web_server-safe.ecf | 23 +--- .../example/SimpleWebServer/web_server.ecf | 9 +- .../library/network/server/nino/nino-safe.ecf | 35 +---- contrib/library/network/server/nino/nino.ecf | 8 +- doc/workbook/basics/simple/simple.ecf | 31 +++-- .../basics/simple_html/simple_html.ecf | 31 +++-- .../generating_response/exel/exel.ecf | 31 +++-- .../generating_response/headers/headers.ecf | 35 +++-- .../generating_response/search/search.ecf | 31 +++-- .../generating_response/status/status.ecf | 31 +++-- .../handling_cookies/example/example.ecf | 31 +++-- .../handling_request/form/get/form.ecf | 31 +++-- .../handling_request/form/post/form.ecf | 31 +++-- .../headers/browser_name/browsers.ecf | 31 +++-- .../headers/cgi_variables/cgi_variables.ecf | 31 +++-- .../headers/header_fields/header_fields.ecf | 31 +++-- .../handling_request/upload_file/upload.ecf | 31 +++-- .../protocol/syndication/atom/atom-safe.ecf | 17 +-- .../protocol/syndication/atom/atom.ecf | 5 +- .../protocol/syndication/rss/rss-safe.ecf | 17 +-- .../library/protocol/syndication/rss/rss.ecf | 5 +- draft/library/security/oauth/oauth-safe.ecf | 17 +-- draft/library/security/oauth/oauth.ecf | 5 +- .../custom-template/js_widget_template.ecf | 19 ++- .../examples/custom/js_widget_custom.ecf | 21 ++- .../wsf_js_widget/examples/demo/demo.ecf | 38 +++--- .../wsf_js_widget/wsf_js_widget-safe.ecf | 22 +--- .../server/wsf_js_widget/wsf_js_widget.ecf | 5 +- draft/src/gewf/gewf.ecf | 13 +- examples/_update_needed/filter/filter.ecf | 29 +++-- examples/debug/debug.ecf | 29 ++--- examples/desktop_app/desktop_app.ecf | 19 ++- examples/form/form.ecf | 36 +++--- .../v0/filter/{filter-safe.ecf => filter.ecf} | 28 ++-- .../v0/restbucksCRUD/client/client-safe.ecf | 19 --- .../v0/restbucksCRUD/client/client.ecf | 11 +- .../{restbucks-safe.ecf => restbucks.ecf} | 40 +++--- examples/proxy/proxy.ecf | 18 ++- .../rest/restbucks_CRUD/client/client.ecf | 11 +- examples/rest/restbucks_CRUD/restbucks.ecf | 37 +++--- examples/simple/simple.ecf | 32 ++--- examples/simple_file/service_file.ecf | 13 +- examples/simple_ssl/simple_ssl.ecf | 18 +-- .../launcher/hello_with_launcher.ecf | 11 +- .../message/hello_with_execute.ecf | 11 +- examples/tutorial/step_2/hello/hello.ecf | 23 ++-- examples/tutorial/step_3/hello/hello.ecf | 11 +- examples/tutorial/step_4/hello/hello.ecf | 15 +-- examples/upload_image/upload_image.ecf | 31 +++-- examples/websocket/websocket_app.ecf | 13 +- .../network/http_client/http_client-safe.ecf | 79 +----------- library/network/http_client/http_client.ecf | 5 +- .../http_client/libcurl_http_client-safe.ecf | 25 +--- .../http_client/libcurl_http_client.ecf | 5 +- .../http_client/net_http_client-safe.ecf | 36 +----- .../network/http_client/net_http_client.ecf | 5 +- .../tests/{test-safe.ecf => test.ecf} | 13 +- .../http_network/http_network-safe.ecf | 122 +----------------- library/network/http_network/http_network.ecf | 5 +- .../content_negotiation/conneg-safe.ecf | 24 +--- .../protocol/content_negotiation/conneg.ecf | 7 +- .../content_negotiation/test/test-safe.ecf | 24 ---- .../content_negotiation/test/test.ecf | 13 +- library/network/protocol/http/http-safe.ecf | 22 +--- library/network/protocol/http/http.ecf | 5 +- .../protocol/http/tests/tests-safe.ecf | 22 ---- library/network/protocol/http/tests/tests.ecf | 11 +- .../{ws_client-safe.ecf => ws_client.ecf} | 10 +- .../client/web_socket_client-safe.ecf | 44 +------ .../websocket/client/web_socket_client.ecf | 5 +- .../protocol/web_socket_protocol-safe.ecf | 10 +- .../protocol/web_socket_protocol.ecf | 5 +- ...ver-safe.ecf => echo_websocket_server.ecf} | 20 +-- .../server/websocket_server-safe.ecf | 24 +--- .../websocket/server/websocket_server.ecf | 7 +- .../notification_email-safe.ecf | 43 +----- .../notification_email/notification_email.ecf | 17 ++- .../process/external_mailer_process.e | 19 +++ .../process/external_mailer_process_factory.e | 48 +++++++ .../until_16_05/external_mailer_process.e | 19 +++ .../external_mailer_process_factory.e | 38 ++++++ .../smtp/ssl/notification_ssl_smtp_mailer.e | 41 ++++++ .../smtp/ssl/ssl_smtp_protocol.e | 36 ++++++ .../openid/consumer/demo/demo-safe.ecf | 27 +--- .../security/openid/consumer/demo/demo.ecf | 27 ++++ .../security/openid/consumer/openid-safe.ecf | 22 +--- library/security/openid/consumer/openid.ecf | 5 +- .../openid/consumer/tests/tests-safe.ecf | 19 --- .../security/openid/consumer/tests/tests.ecf | 21 +++ .../example/demo_basic_auth.ecf | 16 +-- .../http_authorization-safe.ecf | 18 +-- .../http_authorization/http_authorization.ecf | 5 +- .../testing/{testing-safe.ecf => testing.ecf} | 14 +- .../server/ewsgi/connectors/cgi/cgi-safe.ecf | 20 +-- library/server/ewsgi/connectors/cgi/cgi.ecf | 5 +- .../ewsgi/connectors/libfcgi/libfcgi-safe.ecf | 21 +-- .../ewsgi/connectors/libfcgi/libfcgi.ecf | 7 +- .../ewsgi/connectors/nino/nino-safe.ecf | 23 +--- library/server/ewsgi/connectors/nino/nino.ecf | 8 +- .../ewsgi/connectors/null/null-safe.ecf | 19 +-- library/server/ewsgi/connectors/null/null.ecf | 5 +- .../connectors/standalone/standalone-safe.ecf | 24 +--- .../connectors/standalone/standalone.ecf | 5 +- ...tandalone-safe.ecf => test_standalone.ecf} | 19 +-- library/server/ewsgi/ewsgi-safe.ecf | 26 +--- library/server/ewsgi/ewsgi.ecf | 5 +- library/server/ewsgi/ewsgi_spec-safe.ecf | 18 +-- library/server/ewsgi/ewsgi_spec.ecf | 5 +- .../ewsgi/examples/hello_world/hello-safe.ecf | 18 --- .../ewsgi/examples/hello_world/hello.ecf | 5 +- library/server/httpd/httpd-safe.ecf | 71 +--------- library/server/httpd/httpd.ecf | 8 +- library/server/libfcgi/libfcgi-safe.ecf | 68 +--------- library/server/libfcgi/libfcgi.ecf | 5 +- .../server/libfcgi/tests/eiffelweb-safe.ecf | 18 --- library/server/libfcgi/tests/eiffelweb.ecf | 8 +- .../ewsgi/connectors/libfcgi/libfcgi-safe.ecf | 25 +--- .../v0/ewsgi/connectors/libfcgi/libfcgi.ecf | 7 +- .../v0/ewsgi/connectors/nino/nino-safe.ecf | 30 +---- .../v0/ewsgi/connectors/nino/nino.ecf | 8 +- .../server/obsolete/v0/ewsgi/ewsgi-safe.ecf | 28 +--- library/server/obsolete/v0/ewsgi/ewsgi.ecf | 5 +- .../v0/wsf/connector/libfcgi-safe.ecf | 24 +--- .../obsolete/v0/wsf/connector/libfcgi.ecf | 5 +- .../obsolete/v0/wsf/connector/nino-safe.ecf | 27 +--- .../server/obsolete/v0/wsf/connector/nino.ecf | 8 +- .../obsolete/v0/wsf/default/libfcgi-safe.ecf | 19 +-- .../obsolete/v0/wsf/default/libfcgi.ecf | 5 +- .../obsolete/v0/wsf/default/nino-safe.ecf | 19 +-- .../server/obsolete/v0/wsf/default/nino.ecf | 8 +- library/server/obsolete/v0/wsf/wsf-safe.ecf | 39 +----- library/server/obsolete/v0/wsf/wsf.ecf | 5 +- .../obsolete/v0/wsf/wsf_extension-safe.ecf | 22 +--- .../server/obsolete/v0/wsf/wsf_extension.ecf | 5 +- .../v0/wsf/wsf_policy_driven-safe.ecf | 24 +--- .../obsolete/v0/wsf/wsf_policy_driven.ecf | 5 +- .../v0/wsf/wsf_router_context-safe.ecf | 18 +-- .../obsolete/v0/wsf/wsf_router_context.ecf | 5 +- .../obsolete/v0/wsf/wsf_session-safe.ecf | 22 +--- .../server/obsolete/v0/wsf/wsf_session.ecf | 7 +- .../obsolete/v0/wsf_html/wsf_html-safe.ecf | 23 +--- .../server/obsolete/v0/wsf_html/wsf_html.ecf | 5 +- library/server/wsf/connector/all-safe.ecf | 28 +--- library/server/wsf/connector/all.ecf | 5 +- library/server/wsf/connector/cgi-safe.ecf | 24 +--- library/server/wsf/connector/cgi.ecf | 5 +- library/server/wsf/connector/libfcgi-safe.ecf | 24 +--- library/server/wsf/connector/libfcgi.ecf | 5 +- library/server/wsf/connector/nino-safe.ecf | 27 +--- library/server/wsf/connector/nino.ecf | 8 +- .../server/wsf/connector/openshift-safe.ecf | 20 +-- library/server/wsf/connector/openshift.ecf | 5 +- .../server/wsf/connector/standalone-safe.ecf | 24 +--- library/server/wsf/connector/standalone.ecf | 11 +- .../connector/standalone_websocket-safe.ecf | 28 +--- .../wsf/connector/standalone_websocket.ecf | 5 +- library/server/wsf/default/cgi-safe.ecf | 19 +-- library/server/wsf/default/cgi.ecf | 5 +- library/server/wsf/default/libfcgi-safe.ecf | 19 +-- library/server/wsf/default/libfcgi.ecf | 5 +- library/server/wsf/default/nino-safe.ecf | 19 +-- library/server/wsf/default/nino.ecf | 8 +- library/server/wsf/default/openshift-safe.ecf | 19 +-- library/server/wsf/default/openshift.ecf | 5 +- .../server/wsf/default/standalone-safe.ecf | 19 +-- library/server/wsf/default/standalone.ecf | 7 +- library/server/wsf/tests/echo/echo-safe.ecf | 22 ---- library/server/wsf/tests/echo/echo.ecf | 20 +++ library/server/wsf/tests/tests-safe.ecf | 39 ------ library/server/wsf/tests/tests.ecf | 21 ++- library/server/wsf/wsf-safe.ecf | 33 +---- library/server/wsf/wsf.ecf | 5 +- library/server/wsf/wsf_extension-safe.ecf | 22 +--- library/server/wsf/wsf_extension.ecf | 5 +- library/server/wsf/wsf_policy_driven-safe.ecf | 24 +--- library/server/wsf/wsf_policy_driven.ecf | 5 +- .../server/wsf/wsf_router_context-safe.ecf | 18 +-- library/server/wsf/wsf_router_context.ecf | 5 +- library/server/wsf/wsf_session-safe.ecf | 22 +--- library/server/wsf/wsf_session.ecf | 7 +- library/server/wsf_html/wsf_html-safe.ecf | 23 +--- library/server/wsf_html/wsf_html.ecf | 5 +- library/server/wsf_proxy/wsf_proxy-safe.ecf | 36 +----- library/server/wsf_proxy/wsf_proxy.ecf | 5 +- library/text/encoder/encoder-safe.ecf | 21 +-- library/text/encoder/encoder.ecf | 5 +- library/text/encoder/tests/tests-safe.ecf | 18 --- library/text/encoder/tests/tests.ecf | 21 +++ library/text/parser/feed/feed-safe.ecf | 19 +-- library/text/parser/feed/feed.ecf | 5 +- library/text/parser/feed/tests/tests-safe.ecf | 16 --- library/text/parser/feed/tests/tests.ecf | 16 +++ .../parser/uri_template/tests/tests-safe.ecf | 18 --- .../text/parser/uri_template/tests/tests.ecf | 21 +++ .../parser/uri_template/uri_template-safe.ecf | 19 +-- .../text/parser/uri_template/uri_template.ecf | 5 +- library/utility/general/error/error-safe.ecf | 17 +-- library/utility/general/error/error.ecf | 5 +- .../error/tests/{tests-safe.ecf => tests.ecf} | 13 +- precomp/wsf-mt-safe.ecf | 9 +- precomp/wsf-mt.ecf | 12 ++ precomp/wsf-safe.ecf | 8 +- precomp/wsf-scoop-safe.ecf | 9 +- precomp/wsf-scoop.ecf | 12 ++ precomp/wsf.ecf | 11 ++ tests/all-safe.ecf | 75 ----------- tests/all-stable-safe.ecf | 60 --------- tests/all-stable.ecf | 5 +- tests/all.ecf | 17 ++- tests/dev/{hello-safe.ecf => hello.ecf} | 22 ++-- tests/server/wsf_html/test.ecf | 13 +- tools/estudio_wizard/console_wizard.ecf | 14 +- .../wizard/estudio_console_wizard-safe.ecf | 11 -- .../lib/wizard/estudio_console_wizard.ecf | 14 ++ ...wizard-safe.ecf => estudio_gui_wizard.ecf} | 13 +- .../rootdir/resources/${APP_NAME}.ecf | 15 ++- .../rootdir_custom/resources/template.ecf | 8 +- tools/estudio_wizard/wizard.ecf | 16 ++- 218 files changed, 1377 insertions(+), 2760 deletions(-) rename examples/obsolete/v0/filter/{filter-safe.ecf => filter.ecf} (56%) delete mode 100644 examples/obsolete/v0/restbucksCRUD/client/client-safe.ecf rename examples/obsolete/v0/restbucksCRUD/{restbucks-safe.ecf => restbucks.ecf} (61%) rename library/network/http_client/tests/{test-safe.ecf => test.ecf} (70%) delete mode 100644 library/network/protocol/content_negotiation/test/test-safe.ecf delete mode 100644 library/network/protocol/http/tests/tests-safe.ecf rename library/network/websocket/client/example/ws_client/{ws_client-safe.ecf => ws_client.ecf} (61%) rename library/network/websocket/server/example/echo_websocket_server/{echo_websocket_server-safe.ecf => echo_websocket_server.ecf} (67%) create mode 100644 library/runtime/process/notification_email/process/external_mailer_process.e create mode 100644 library/runtime/process/notification_email/process/external_mailer_process_factory.e create mode 100644 library/runtime/process/notification_email/process/until_16_05/external_mailer_process.e create mode 100644 library/runtime/process/notification_email/process/until_16_05/external_mailer_process_factory.e create mode 100644 library/runtime/process/notification_email/smtp/ssl/notification_ssl_smtp_mailer.e create mode 100644 library/runtime/process/notification_email/smtp/ssl/ssl_smtp_protocol.e create mode 100644 library/security/openid/consumer/demo/demo.ecf delete mode 100644 library/security/openid/consumer/tests/tests-safe.ecf create mode 100644 library/security/openid/consumer/tests/tests.ecf rename library/server/authentication/http_authorization/testing/{testing-safe.ecf => testing.ecf} (55%) rename library/server/ewsgi/connectors/standalone/{test_standalone-safe.ecf => test_standalone.ecf} (56%) delete mode 100644 library/server/ewsgi/examples/hello_world/hello-safe.ecf delete mode 100644 library/server/libfcgi/tests/eiffelweb-safe.ecf delete mode 100644 library/server/wsf/tests/echo/echo-safe.ecf create mode 100644 library/server/wsf/tests/echo/echo.ecf delete mode 100644 library/server/wsf/tests/tests-safe.ecf delete mode 100644 library/text/encoder/tests/tests-safe.ecf create mode 100644 library/text/encoder/tests/tests.ecf delete mode 100644 library/text/parser/feed/tests/tests-safe.ecf create mode 100644 library/text/parser/feed/tests/tests.ecf delete mode 100644 library/text/parser/uri_template/tests/tests-safe.ecf create mode 100644 library/text/parser/uri_template/tests/tests.ecf rename library/utility/general/error/tests/{tests-safe.ecf => tests.ecf} (58%) create mode 100644 precomp/wsf-mt.ecf create mode 100644 precomp/wsf-scoop.ecf create mode 100644 precomp/wsf.ecf delete mode 100644 tests/all-safe.ecf delete mode 100644 tests/all-stable-safe.ecf rename tests/dev/{hello-safe.ecf => hello.ecf} (64%) delete mode 100644 tools/estudio_wizard/lib/wizard/estudio_console_wizard-safe.ecf create mode 100644 tools/estudio_wizard/lib/wizard/estudio_console_wizard.ecf rename tools/estudio_wizard/lib/wizard/{estudio_gui_wizard-safe.ecf => estudio_gui_wizard.ecf} (50%) diff --git a/contrib/library/network/server/nino/example/SimpleWebServer/web_server-safe.ecf b/contrib/library/network/server/nino/example/SimpleWebServer/web_server-safe.ecf index 4c1a19a9..8dbe2853 100644 --- a/contrib/library/network/server/nino/example/SimpleWebServer/web_server-safe.ecf +++ b/contrib/library/network/server/nino/example/SimpleWebServer/web_server-safe.ecf @@ -1,22 +1,3 @@ - - - - - /.git$ - /.svn$ - /CVS$ - /EIFGENs$ - - - - - - - - - - + + diff --git a/contrib/library/network/server/nino/example/SimpleWebServer/web_server.ecf b/contrib/library/network/server/nino/example/SimpleWebServer/web_server.ecf index 33f040f8..92def8ac 100644 --- a/contrib/library/network/server/nino/example/SimpleWebServer/web_server.ecf +++ b/contrib/library/network/server/nino/example/SimpleWebServer/web_server.ecf @@ -1,5 +1,5 @@ - + @@ -8,10 +8,9 @@ /CVS$ /EIFGENs$ - - + + + diff --git a/contrib/library/network/server/nino/nino-safe.ecf b/contrib/library/network/server/nino/nino-safe.ecf index 233a68ac..bf692a34 100644 --- a/contrib/library/network/server/nino/nino-safe.ecf +++ b/contrib/library/network/server/nino/nino-safe.ecf @@ -1,34 +1,3 @@ - - - - - /.git$ - /.svn$ - /CVS$ - /EIFGENs$ - - - - - - - - - spec - - - tcp_stream_socket.e - - - - - - - - - - - - + + diff --git a/contrib/library/network/server/nino/nino.ecf b/contrib/library/network/server/nino/nino.ecf index 7af610d1..105f5bd9 100644 --- a/contrib/library/network/server/nino/nino.ecf +++ b/contrib/library/network/server/nino/nino.ecf @@ -1,5 +1,5 @@ - + @@ -8,9 +8,9 @@ /CVS$ /EIFGENs$ - - + + + diff --git a/doc/workbook/basics/simple/simple.ecf b/doc/workbook/basics/simple/simple.ecf index e4ff832f..5b4bc4fa 100644 --- a/doc/workbook/basics/simple/simple.ecf +++ b/doc/workbook/basics/simple/simple.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/basics/simple_html/simple_html.ecf b/doc/workbook/basics/simple_html/simple_html.ecf index 5712125d..d07bcf49 100644 --- a/doc/workbook/basics/simple_html/simple_html.ecf +++ b/doc/workbook/basics/simple_html/simple_html.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/generating_response/exel/exel.ecf b/doc/workbook/generating_response/exel/exel.ecf index e16eb9f7..e45eb06b 100644 --- a/doc/workbook/generating_response/exel/exel.ecf +++ b/doc/workbook/generating_response/exel/exel.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/generating_response/headers/headers.ecf b/doc/workbook/generating_response/headers/headers.ecf index 797eb842..6a00f9b3 100644 --- a/doc/workbook/generating_response/headers/headers.ecf +++ b/doc/workbook/generating_response/headers/headers.ecf @@ -1,40 +1,49 @@ - + - /EIFGENs$ - /CVS$ /.svn$ + /CVS$ + /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/generating_response/search/search.ecf b/doc/workbook/generating_response/search/search.ecf index 7c42d50b..77f3cf74 100644 --- a/doc/workbook/generating_response/search/search.ecf +++ b/doc/workbook/generating_response/search/search.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/generating_response/status/status.ecf b/doc/workbook/generating_response/status/status.ecf index de47b96a..31912fcf 100644 --- a/doc/workbook/generating_response/status/status.ecf +++ b/doc/workbook/generating_response/status/status.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/handling_cookies/example/example.ecf b/doc/workbook/handling_cookies/example/example.ecf index dea25001..b1c27695 100644 --- a/doc/workbook/handling_cookies/example/example.ecf +++ b/doc/workbook/handling_cookies/example/example.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/handling_request/form/get/form.ecf b/doc/workbook/handling_request/form/get/form.ecf index 8dde5e4d..43203dbb 100644 --- a/doc/workbook/handling_request/form/get/form.ecf +++ b/doc/workbook/handling_request/form/get/form.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/handling_request/form/post/form.ecf b/doc/workbook/handling_request/form/post/form.ecf index bd83b4bd..8094d7f3 100644 --- a/doc/workbook/handling_request/form/post/form.ecf +++ b/doc/workbook/handling_request/form/post/form.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/handling_request/headers/browser_name/browsers.ecf b/doc/workbook/handling_request/headers/browser_name/browsers.ecf index bb1df575..5e7dbf77 100644 --- a/doc/workbook/handling_request/headers/browser_name/browsers.ecf +++ b/doc/workbook/handling_request/headers/browser_name/browsers.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/handling_request/headers/cgi_variables/cgi_variables.ecf b/doc/workbook/handling_request/headers/cgi_variables/cgi_variables.ecf index 8ba57e16..bd0aa409 100644 --- a/doc/workbook/handling_request/headers/cgi_variables/cgi_variables.ecf +++ b/doc/workbook/handling_request/headers/cgi_variables/cgi_variables.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/handling_request/headers/header_fields/header_fields.ecf b/doc/workbook/handling_request/headers/header_fields/header_fields.ecf index 39e2f8a0..d244682a 100644 --- a/doc/workbook/handling_request/headers/header_fields/header_fields.ecf +++ b/doc/workbook/handling_request/headers/header_fields/header_fields.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/doc/workbook/handling_request/upload_file/upload.ecf b/doc/workbook/handling_request/upload_file/upload.ecf index 0722e151..4b449bd0 100644 --- a/doc/workbook/handling_request/upload_file/upload.ecf +++ b/doc/workbook/handling_request/upload_file/upload.ecf @@ -1,40 +1,49 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - + + + - - + + + + - - + + + + - - + + + + diff --git a/draft/library/protocol/syndication/atom/atom-safe.ecf b/draft/library/protocol/syndication/atom/atom-safe.ecf index 4af20c64..3726ba1d 100644 --- a/draft/library/protocol/syndication/atom/atom-safe.ecf +++ b/draft/library/protocol/syndication/atom/atom-safe.ecf @@ -1,16 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - + + diff --git a/draft/library/protocol/syndication/atom/atom.ecf b/draft/library/protocol/syndication/atom/atom.ecf index c5805e0f..7d743871 100644 --- a/draft/library/protocol/syndication/atom/atom.ecf +++ b/draft/library/protocol/syndication/atom/atom.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/draft/library/protocol/syndication/rss/rss-safe.ecf b/draft/library/protocol/syndication/rss/rss-safe.ecf index 83620c87..e4c7848b 100644 --- a/draft/library/protocol/syndication/rss/rss-safe.ecf +++ b/draft/library/protocol/syndication/rss/rss-safe.ecf @@ -1,16 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - + + diff --git a/draft/library/protocol/syndication/rss/rss.ecf b/draft/library/protocol/syndication/rss/rss.ecf index e039a0df..e6e69d9d 100644 --- a/draft/library/protocol/syndication/rss/rss.ecf +++ b/draft/library/protocol/syndication/rss/rss.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/draft/library/security/oauth/oauth-safe.ecf b/draft/library/security/oauth/oauth-safe.ecf index f01b254a..a7962e2e 100644 --- a/draft/library/security/oauth/oauth-safe.ecf +++ b/draft/library/security/oauth/oauth-safe.ecf @@ -1,16 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - + + diff --git a/draft/library/security/oauth/oauth.ecf b/draft/library/security/oauth/oauth.ecf index 8550c8d4..bf22e1d1 100644 --- a/draft/library/security/oauth/oauth.ecf +++ b/draft/library/security/oauth/oauth.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/draft/library/server/wsf_js_widget/examples/custom-template/js_widget_template.ecf b/draft/library/server/wsf_js_widget/examples/custom-template/js_widget_template.ecf index 04cb2f1a..66751cbc 100644 --- a/draft/library/server/wsf_js_widget/examples/custom-template/js_widget_template.ecf +++ b/draft/library/server/wsf_js_widget/examples/custom-template/js_widget_template.ecf @@ -1,33 +1,32 @@ - + /.git$ /CVS$ /EIFGENs$ - - - - - - + + + + - + - + - + diff --git a/draft/library/server/wsf_js_widget/examples/custom/js_widget_custom.ecf b/draft/library/server/wsf_js_widget/examples/custom/js_widget_custom.ecf index 58a8446a..ff4c0b08 100644 --- a/draft/library/server/wsf_js_widget/examples/custom/js_widget_custom.ecf +++ b/draft/library/server/wsf_js_widget/examples/custom/js_widget_custom.ecf @@ -1,33 +1,32 @@ - + /.git$ /CVS$ /EIFGENs$ - - - - - - + + + + + - + - + - + diff --git a/draft/library/server/wsf_js_widget/examples/demo/demo.ecf b/draft/library/server/wsf_js_widget/examples/demo/demo.ecf index 0946ac0d..91b6881a 100644 --- a/draft/library/server/wsf_js_widget/examples/demo/demo.ecf +++ b/draft/library/server/wsf_js_widget/examples/demo/demo.ecf @@ -1,44 +1,52 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - - - - - + + + + + + - - + + + + - - + + + + - - + + + + diff --git a/draft/library/server/wsf_js_widget/wsf_js_widget-safe.ecf b/draft/library/server/wsf_js_widget/wsf_js_widget-safe.ecf index f4239f00..be4a279a 100644 --- a/draft/library/server/wsf_js_widget/wsf_js_widget-safe.ecf +++ b/draft/library/server/wsf_js_widget/wsf_js_widget-safe.ecf @@ -1,21 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - + + diff --git a/draft/library/server/wsf_js_widget/wsf_js_widget.ecf b/draft/library/server/wsf_js_widget/wsf_js_widget.ecf index 8b1afe1f..0135c2a6 100644 --- a/draft/library/server/wsf_js_widget/wsf_js_widget.ecf +++ b/draft/library/server/wsf_js_widget/wsf_js_widget.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/draft/src/gewf/gewf.ecf b/draft/src/gewf/gewf.ecf index 104e7e13..e7c4c379 100644 --- a/draft/src/gewf/gewf.ecf +++ b/draft/src/gewf/gewf.ecf @@ -1,5 +1,5 @@ - + Generator for EWF project @@ -8,15 +8,14 @@ /.svn$ /EIFGENs$ - - - - - - + + + + diff --git a/examples/_update_needed/filter/filter.ecf b/examples/_update_needed/filter/filter.ecf index 5cba3aa5..3252986c 100644 --- a/examples/_update_needed/filter/filter.ecf +++ b/examples/_update_needed/filter/filter.ecf @@ -1,33 +1,34 @@ - + /EIFGENs$ /\.git$ /\.svn$ - - - - - - - - - - + + + + + + + + + + + - - + - + diff --git a/examples/debug/debug.ecf b/examples/debug/debug.ecf index 7bbda930..05634457 100644 --- a/examples/debug/debug.ecf +++ b/examples/debug/debug.ecf @@ -1,47 +1,44 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - - - - + + + + + - - - - + + + - - + - + - + diff --git a/examples/desktop_app/desktop_app.ecf b/examples/desktop_app/desktop_app.ecf index df08bef2..c26f5803 100644 --- a/examples/desktop_app/desktop_app.ecf +++ b/examples/desktop_app/desktop_app.ecf @@ -1,20 +1,19 @@ - + Vision2+web browser widget+embedded web service This example demonstrates how to build a vision2 desktop application that embed a web browser accessing the service of an embedded web service. - - - - - - - - - + + + + + + + /.svn$ diff --git a/examples/form/form.ecf b/examples/form/form.ecf index 59c01c12..fafd79bc 100644 --- a/examples/form/form.ecf +++ b/examples/form/form.ecf @@ -1,52 +1,54 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - - - - + + + + + - - - + - + + + - + + + - - + - - + diff --git a/examples/obsolete/v0/filter/filter-safe.ecf b/examples/obsolete/v0/filter/filter.ecf similarity index 56% rename from examples/obsolete/v0/filter/filter-safe.ecf rename to examples/obsolete/v0/filter/filter.ecf index 8551340b..ad34cf65 100644 --- a/examples/obsolete/v0/filter/filter-safe.ecf +++ b/examples/obsolete/v0/filter/filter.ecf @@ -1,33 +1,35 @@ - + /EIFGENs$ /\.git$ /\.svn$ - - - - - - - - - - + + + + + + + + - + - + diff --git a/examples/obsolete/v0/restbucksCRUD/client/client-safe.ecf b/examples/obsolete/v0/restbucksCRUD/client/client-safe.ecf deleted file mode 100644 index dc8c3362..00000000 --- a/examples/obsolete/v0/restbucksCRUD/client/client-safe.ecf +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - diff --git a/examples/obsolete/v0/restbucksCRUD/client/client.ecf b/examples/obsolete/v0/restbucksCRUD/client/client.ecf index 3e2cc430..586bfc0c 100644 --- a/examples/obsolete/v0/restbucksCRUD/client/client.ecf +++ b/examples/obsolete/v0/restbucksCRUD/client/client.ecf @@ -1,5 +1,5 @@ - + @@ -7,11 +7,14 @@ /.svn$ /EIFGENs$ - - + + + + - + diff --git a/examples/obsolete/v0/restbucksCRUD/restbucks-safe.ecf b/examples/obsolete/v0/restbucksCRUD/restbucks.ecf similarity index 61% rename from examples/obsolete/v0/restbucksCRUD/restbucks-safe.ecf rename to examples/obsolete/v0/restbucksCRUD/restbucks.ecf index 5ca22986..0323cb41 100644 --- a/examples/obsolete/v0/restbucksCRUD/restbucks-safe.ecf +++ b/examples/obsolete/v0/restbucksCRUD/restbucks.ecf @@ -1,35 +1,35 @@ - + /EIFGENs$ /\.git$ /\.svn$ - - - - + + + + + - - - - - - - - - - - + + + + + + + + + + + - @@ -41,11 +41,11 @@ - - + /resource$ diff --git a/examples/proxy/proxy.ecf b/examples/proxy/proxy.ecf index 9907d2c7..cb93b308 100644 --- a/examples/proxy/proxy.ecf +++ b/examples/proxy/proxy.ecf @@ -1,29 +1,27 @@ - + /.svn$ /CVS$ /EIFGENs$ - - - - - - + + + + - - - + diff --git a/examples/rest/restbucks_CRUD/client/client.ecf b/examples/rest/restbucks_CRUD/client/client.ecf index 3314de3e..e4b4caf8 100644 --- a/examples/rest/restbucks_CRUD/client/client.ecf +++ b/examples/rest/restbucks_CRUD/client/client.ecf @@ -1,5 +1,5 @@ - + @@ -7,13 +7,12 @@ /.svn$ /EIFGENs$ - - - - - + + + diff --git a/examples/rest/restbucks_CRUD/restbucks.ecf b/examples/rest/restbucks_CRUD/restbucks.ecf index a9c1ab2f..dbbe5366 100644 --- a/examples/rest/restbucks_CRUD/restbucks.ecf +++ b/examples/rest/restbucks_CRUD/restbucks.ecf @@ -1,32 +1,28 @@ - + /EIFGENs$ /\.git$ /\.svn$ - - - - - - - - - - - - - - + + + + + + + + + + + + - - diff --git a/examples/tutorial/step_3/hello/hello.ecf b/examples/tutorial/step_3/hello/hello.ecf index e5d78703..0b690750 100644 --- a/examples/tutorial/step_3/hello/hello.ecf +++ b/examples/tutorial/step_3/hello/hello.ecf @@ -1,5 +1,5 @@ - + @@ -7,14 +7,13 @@ /CVS$ /EIFGENs$ - - - - - + + + diff --git a/examples/tutorial/step_4/hello/hello.ecf b/examples/tutorial/step_4/hello/hello.ecf index 23b128c7..9bd1a698 100644 --- a/examples/tutorial/step_4/hello/hello.ecf +++ b/examples/tutorial/step_4/hello/hello.ecf @@ -1,5 +1,5 @@ - + @@ -7,15 +7,14 @@ /CVS$ /EIFGENs$ - - - - - - - + + + + + diff --git a/examples/upload_image/upload_image.ecf b/examples/upload_image/upload_image.ecf index cd20896b..46882a04 100644 --- a/examples/upload_image/upload_image.ecf +++ b/examples/upload_image/upload_image.ecf @@ -1,38 +1,37 @@ - + /EIFGENs$ /\.git$ /\.svn$ - - - - - - - + + + + + - - + - + + + - - + + + + - - - diff --git a/examples/websocket/websocket_app.ecf b/examples/websocket/websocket_app.ecf index 0718f32a..e42dfd36 100644 --- a/examples/websocket/websocket_app.ecf +++ b/examples/websocket/websocket_app.ecf @@ -1,5 +1,5 @@ - + @@ -7,15 +7,14 @@ /CVS$ /EIFGENs$ - - - - - - + + + + diff --git a/library/network/http_client/http_client-safe.ecf b/library/network/http_client/http_client-safe.ecf index 7f249cee..4c575ca4 100644 --- a/library/network/http_client/http_client-safe.ecf +++ b/library/network/http_client/http_client-safe.ecf @@ -1,78 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/library/network/http_client/http_client.ecf b/library/network/http_client/http_client.ecf index b4694aeb..30b64d24 100644 --- a/library/network/http_client/http_client.ecf +++ b/library/network/http_client/http_client.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/network/http_client/libcurl_http_client-safe.ecf b/library/network/http_client/libcurl_http_client-safe.ecf index aa49ab70..8874b1f2 100644 --- a/library/network/http_client/libcurl_http_client-safe.ecf +++ b/library/network/http_client/libcurl_http_client-safe.ecf @@ -1,24 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - + + diff --git a/library/network/http_client/libcurl_http_client.ecf b/library/network/http_client/libcurl_http_client.ecf index 7364c2eb..a6a5fc8a 100644 --- a/library/network/http_client/libcurl_http_client.ecf +++ b/library/network/http_client/libcurl_http_client.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/network/http_client/net_http_client-safe.ecf b/library/network/http_client/net_http_client-safe.ecf index b410b814..c30e33e6 100644 --- a/library/network/http_client/net_http_client-safe.ecf +++ b/library/network/http_client/net_http_client-safe.ecf @@ -1,35 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/library/network/http_client/net_http_client.ecf b/library/network/http_client/net_http_client.ecf index 30a2e5d2..dbd33baa 100644 --- a/library/network/http_client/net_http_client.ecf +++ b/library/network/http_client/net_http_client.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/network/http_client/tests/test-safe.ecf b/library/network/http_client/tests/test.ecf similarity index 70% rename from library/network/http_client/tests/test-safe.ecf rename to library/network/http_client/tests/test.ecf index 2c0cdb86..e6ccde02 100644 --- a/library/network/http_client/tests/test-safe.ecf +++ b/library/network/http_client/tests/test.ecf @@ -1,5 +1,5 @@ - + @@ -7,19 +7,22 @@ /.svn$ /EIFGENs$ - + + + - - + + - + .*libcurl_.*.e$ diff --git a/library/network/http_network/http_network-safe.ecf b/library/network/http_network/http_network-safe.ecf index fc2dec22..b29a7886 100644 --- a/library/network/http_network/http_network-safe.ecf +++ b/library/network/http_network/http_network-safe.ecf @@ -1,121 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /http_stream_socket_ext.e$ - - - - - - - - - - - - - - - - - - - - - - - /http_stream_secure_socket_ext.e$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/library/network/http_network/http_network.ecf b/library/network/http_network/http_network.ecf index 46d8f044..cdbf25c2 100644 --- a/library/network/http_network/http_network.ecf +++ b/library/network/http_network/http_network.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/network/protocol/content_negotiation/conneg-safe.ecf b/library/network/protocol/content_negotiation/conneg-safe.ecf index 5d6d4530..2effa2e5 100644 --- a/library/network/protocol/content_negotiation/conneg-safe.ecf +++ b/library/network/protocol/content_negotiation/conneg-safe.ecf @@ -1,23 +1,3 @@ - - - - - /.git$ - /.svn$ - /CVS$ - /EIFGENs$ - - - - - - - - /implementation - - - - + + diff --git a/library/network/protocol/content_negotiation/conneg.ecf b/library/network/protocol/content_negotiation/conneg.ecf index 976cc952..7a53c26b 100644 --- a/library/network/protocol/content_negotiation/conneg.ecf +++ b/library/network/protocol/content_negotiation/conneg.ecf @@ -1,5 +1,5 @@ - + @@ -8,11 +8,10 @@ /CVS$ /EIFGENs$ - - - + /implementation diff --git a/library/network/protocol/content_negotiation/test/test-safe.ecf b/library/network/protocol/content_negotiation/test/test-safe.ecf deleted file mode 100644 index 4a9f2d8f..00000000 --- a/library/network/protocol/content_negotiation/test/test-safe.ecf +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - /.git$ - /.svn$ - /CVS$ - /EIFGENs$ - - - - - - - - - - - diff --git a/library/network/protocol/content_negotiation/test/test.ecf b/library/network/protocol/content_negotiation/test/test.ecf index a1e3c37f..c9eed207 100644 --- a/library/network/protocol/content_negotiation/test/test.ecf +++ b/library/network/protocol/content_negotiation/test/test.ecf @@ -1,5 +1,5 @@ - + @@ -8,11 +8,18 @@ /CVS$ /EIFGENs$ - + + + - + + + diff --git a/library/network/protocol/http/http-safe.ecf b/library/network/protocol/http/http-safe.ecf index 4cf5101a..e8512482 100644 --- a/library/network/protocol/http/http-safe.ecf +++ b/library/network/protocol/http/http-safe.ecf @@ -1,21 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - /tests$ - - - - + + diff --git a/library/network/protocol/http/http.ecf b/library/network/protocol/http/http.ecf index b3c48093..c8cf0984 100644 --- a/library/network/protocol/http/http.ecf +++ b/library/network/protocol/http/http.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/network/protocol/http/tests/tests-safe.ecf b/library/network/protocol/http/tests/tests-safe.ecf deleted file mode 100644 index 7ad1cdd1..00000000 --- a/library/network/protocol/http/tests/tests-safe.ecf +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - diff --git a/library/network/protocol/http/tests/tests.ecf b/library/network/protocol/http/tests/tests.ecf index 212d1706..14e3a1a0 100644 --- a/library/network/protocol/http/tests/tests.ecf +++ b/library/network/protocol/http/tests/tests.ecf @@ -1,5 +1,5 @@ - + @@ -7,11 +7,14 @@ /.svn$ /EIFGENs$ - - - + + + diff --git a/library/network/websocket/client/example/ws_client/ws_client-safe.ecf b/library/network/websocket/client/example/ws_client/ws_client.ecf similarity index 61% rename from library/network/websocket/client/example/ws_client/ws_client-safe.ecf rename to library/network/websocket/client/example/ws_client/ws_client.ecf index 7079f81c..648f25b0 100644 --- a/library/network/websocket/client/example/ws_client/ws_client-safe.ecf +++ b/library/network/websocket/client/example/ws_client/ws_client.ecf @@ -1,5 +1,5 @@ - + /.git$ @@ -7,18 +7,16 @@ /CVS$ /EIFGENs$ - - - - + + - diff --git a/library/network/websocket/client/web_socket_client-safe.ecf b/library/network/websocket/client/web_socket_client-safe.ecf index d0cc963e..eccb1ee9 100644 --- a/library/network/websocket/client/web_socket_client-safe.ecf +++ b/library/network/websocket/client/web_socket_client-safe.ecf @@ -1,43 +1,3 @@ - - - - - /.git$ - /.svn$ - /CVS$ - /EIFGENs$ - - - - - - - - - - - - - /no_ssl$ - /spec$ - /ssl$ - - - - - - - - - - - - - - - - - - + + diff --git a/library/network/websocket/client/web_socket_client.ecf b/library/network/websocket/client/web_socket_client.ecf index 23ebc15e..cdf6bfe5 100644 --- a/library/network/websocket/client/web_socket_client.ecf +++ b/library/network/websocket/client/web_socket_client.ecf @@ -1,5 +1,5 @@ - + @@ -8,9 +8,8 @@ /CVS$ /EIFGENs$ - - diff --git a/library/network/websocket/protocol/web_socket_protocol-safe.ecf b/library/network/websocket/protocol/web_socket_protocol-safe.ecf index 0b08d9a0..66e8d8fd 100644 --- a/library/network/websocket/protocol/web_socket_protocol-safe.ecf +++ b/library/network/websocket/protocol/web_socket_protocol-safe.ecf @@ -1,9 +1,3 @@ - - - - - - - - + + diff --git a/library/network/websocket/protocol/web_socket_protocol.ecf b/library/network/websocket/protocol/web_socket_protocol.ecf index c3d310e4..e2ab6259 100644 --- a/library/network/websocket/protocol/web_socket_protocol.ecf +++ b/library/network/websocket/protocol/web_socket_protocol.ecf @@ -1,10 +1,7 @@ - + - - diff --git a/library/network/websocket/server/example/echo_websocket_server/echo_websocket_server-safe.ecf b/library/network/websocket/server/example/echo_websocket_server/echo_websocket_server.ecf similarity index 67% rename from library/network/websocket/server/example/echo_websocket_server/echo_websocket_server-safe.ecf rename to library/network/websocket/server/example/echo_websocket_server/echo_websocket_server.ecf index 96cfc79d..41626da8 100644 --- a/library/network/websocket/server/example/echo_websocket_server/echo_websocket_server-safe.ecf +++ b/library/network/websocket/server/example/echo_websocket_server/echo_websocket_server.ecf @@ -1,5 +1,5 @@ - + /.git$ @@ -7,21 +7,20 @@ /CVS$ /EIFGENs$ - - - + - - - - + + + + @@ -30,14 +29,15 @@ - + + + - diff --git a/library/network/websocket/server/websocket_server-safe.ecf b/library/network/websocket/server/websocket_server-safe.ecf index f2fd971d..cfaa67a4 100644 --- a/library/network/websocket/server/websocket_server-safe.ecf +++ b/library/network/websocket/server/websocket_server-safe.ecf @@ -1,23 +1,3 @@ - - - - - /.git$ - /.svn$ - /CVS$ - /EIFGENs$ - - - - - - - - - - - - - + + diff --git a/library/network/websocket/server/websocket_server.ecf b/library/network/websocket/server/websocket_server.ecf index 8b5ed2aa..883fe30b 100644 --- a/library/network/websocket/server/websocket_server.ecf +++ b/library/network/websocket/server/websocket_server.ecf @@ -1,5 +1,5 @@ - + @@ -8,12 +8,11 @@ /CVS$ /EIFGENs$ - - - + diff --git a/library/runtime/process/notification_email/notification_email-safe.ecf b/library/runtime/process/notification_email/notification_email-safe.ecf index 46863fca..68cb51d0 100644 --- a/library/runtime/process/notification_email/notification_email-safe.ecf +++ b/library/runtime/process/notification_email/notification_email-safe.ecf @@ -1,42 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/library/runtime/process/notification_email/notification_email.ecf b/library/runtime/process/notification_email/notification_email.ecf index 5f5937a6..2636daeb 100644 --- a/library/runtime/process/notification_email/notification_email.ecf +++ b/library/runtime/process/notification_email/notification_email.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,9 @@ /.svn$ /EIFGENs$ - - + @@ -24,6 +24,12 @@ + + + + + + @@ -36,6 +42,11 @@ + + + + + diff --git a/library/runtime/process/notification_email/process/external_mailer_process.e b/library/runtime/process/notification_email/process/external_mailer_process.e new file mode 100644 index 00000000..90416001 --- /dev/null +++ b/library/runtime/process/notification_email/process/external_mailer_process.e @@ -0,0 +1,19 @@ +note + description: "[ + Objects that ... + ]" + author: "$Author$" + date: "$Date$" + revision: "$Revision$" + +class + EXTERNAL_MAILER_PROCESS + +inherit + BASE_PROCESS_IMP + +create + make, + make_with_command_line + +end diff --git a/library/runtime/process/notification_email/process/external_mailer_process_factory.e b/library/runtime/process/notification_email/process/external_mailer_process_factory.e new file mode 100644 index 00000000..3fade188 --- /dev/null +++ b/library/runtime/process/notification_email/process/external_mailer_process_factory.e @@ -0,0 +1,48 @@ +note + description: "[ + Objects that ... + ]" + author: "$Author$" + date: "$Date$" + revision: "$Revision$" + +class + EXTERNAL_MAILER_PROCESS_FACTORY + +inherit + PROCESS_FACTORY + redefine + process_launcher, + process_launcher_with_command_line + end + +feature -- Access + + process_launcher (a_file_name: READABLE_STRING_GENERAL; args: detachable LIST [READABLE_STRING_GENERAL]; a_working_directory: detachable READABLE_STRING_GENERAL): EXTERNAL_MAILER_PROCESS + -- Returns a process launcher used to launch program `a_file_name' with arguments `args' + -- and working directory `a_working_directory'. + -- Use Void for `a_working_directory' if no working directory is specified. + -- Use Void for `args' if no arguments are required. + do + create {EXTERNAL_MAILER_PROCESS} Result.make (a_file_name, args, a_working_directory) + end + + process_launcher_with_command_line (a_cmd_line: READABLE_STRING_GENERAL; a_working_directory: detachable READABLE_STRING_GENERAL): EXTERNAL_MAILER_PROCESS + -- Returns a process launcher to launch command line `cmd_line' that specifies an executable and + -- optional arguments, using `a_working_directory' as its working directory. + -- Use Void for `a_working_directory' if no working directory is required. + do + create {EXTERNAL_MAILER_PROCESS} Result.make_with_command_line (a_cmd_line, a_working_directory) + end + +note + copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Olivier Ligot, 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 diff --git a/library/runtime/process/notification_email/process/until_16_05/external_mailer_process.e b/library/runtime/process/notification_email/process/until_16_05/external_mailer_process.e new file mode 100644 index 00000000..90416001 --- /dev/null +++ b/library/runtime/process/notification_email/process/until_16_05/external_mailer_process.e @@ -0,0 +1,19 @@ +note + description: "[ + Objects that ... + ]" + author: "$Author$" + date: "$Date$" + revision: "$Revision$" + +class + EXTERNAL_MAILER_PROCESS + +inherit + BASE_PROCESS_IMP + +create + make, + make_with_command_line + +end diff --git a/library/runtime/process/notification_email/process/until_16_05/external_mailer_process_factory.e b/library/runtime/process/notification_email/process/until_16_05/external_mailer_process_factory.e new file mode 100644 index 00000000..832a3bdf --- /dev/null +++ b/library/runtime/process/notification_email/process/until_16_05/external_mailer_process_factory.e @@ -0,0 +1,38 @@ +note + description: "[ + Objects that ... + ]" + author: "$Author$" + date: "$Date$" + revision: "$Revision$" + +class + EXTERNAL_MAILER_PROCESS_FACTORY + +inherit + BASE_PROCESS_FACTORY + redefine + process_launcher, + process_launcher_with_command_line + end + +feature -- Access + + process_launcher (a_file_name: READABLE_STRING_GENERAL; args: detachable LIST [READABLE_STRING_GENERAL]; a_working_directory: detachable READABLE_STRING_GENERAL): EXTERNAL_MAILER_PROCESS + -- Returns a process launcher used to launch program `a_file_name' with arguments `args' + -- and working directory `a_working_directory'. + -- Use Void for `a_working_directory' if no working directory is specified. + -- Use Void for `args' if no arguments are required. + do + create {EXTERNAL_MAILER_PROCESS} Result.make (a_file_name, args, a_working_directory) + end + + process_launcher_with_command_line (a_cmd_line: READABLE_STRING_GENERAL; a_working_directory: detachable READABLE_STRING_GENERAL): EXTERNAL_MAILER_PROCESS + -- Returns a process launcher to launch command line `cmd_line' that specifies an executable and + -- optional arguments, using `a_working_directory' as its working directory. + -- Use Void for `a_working_directory' if no working directory is required. + do + create {EXTERNAL_MAILER_PROCESS} Result.make_with_command_line (a_cmd_line, a_working_directory) + end + +end diff --git a/library/runtime/process/notification_email/smtp/ssl/notification_ssl_smtp_mailer.e b/library/runtime/process/notification_email/smtp/ssl/notification_ssl_smtp_mailer.e new file mode 100644 index 00000000..ed936baf --- /dev/null +++ b/library/runtime/process/notification_email/smtp/ssl/notification_ssl_smtp_mailer.e @@ -0,0 +1,41 @@ +note + description: "[ + Notification mailer based on STMP protocol. + + Note: it is based on EiffelNet {SMTP_PROTOCOL} implementation, and may not be complete. + ]" + author: "$Author: jfiat $" + date: "$Date: 2015-06-30 11:07:17 +0200 (mar., 30 juin 2015) $" + revision: "$Revision: 97586 $" + +class + NOTIFICATION_SSL_SMTP_MAILER + +inherit + NOTIFICATION_SMTP_MAILER + redefine + smtp_protocol + end + +create + make, + make_with_user + +feature {NONE} -- Initialization + + smtp_protocol: SSL_SMTP_PROTOCOL + -- SMTP protocol. + +invariant +note + copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Olivier Ligot, 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 + diff --git a/library/runtime/process/notification_email/smtp/ssl/ssl_smtp_protocol.e b/library/runtime/process/notification_email/smtp/ssl/ssl_smtp_protocol.e new file mode 100644 index 00000000..78f1a116 --- /dev/null +++ b/library/runtime/process/notification_email/smtp/ssl/ssl_smtp_protocol.e @@ -0,0 +1,36 @@ +note + description: "Summary description for {SSL_SMTP_PROTOCOL}." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + SSL_SMTP_PROTOCOL + +inherit + SMTP_PROTOCOL + redefine + socket + end + +create + make + +feature -- Access + + socket: detachable SSL_NETWORK_STREAM_SOCKET + -- Socket use to communicate + +invariant + +note + copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Olivier Ligot, 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 diff --git a/library/security/openid/consumer/demo/demo-safe.ecf b/library/security/openid/consumer/demo/demo-safe.ecf index 8eac088d..be1d546b 100644 --- a/library/security/openid/consumer/demo/demo-safe.ecf +++ b/library/security/openid/consumer/demo/demo-safe.ecf @@ -1,26 +1,3 @@ - - - - - /.svn$ - /CVS$ - /EIFGENs$ - - - - - - - - - - - - - - - - + + diff --git a/library/security/openid/consumer/demo/demo.ecf b/library/security/openid/consumer/demo/demo.ecf new file mode 100644 index 00000000..84f9931a --- /dev/null +++ b/library/security/openid/consumer/demo/demo.ecf @@ -0,0 +1,27 @@ + + + + + + /.svn$ + /CVS$ + /EIFGENs$ + + + + + + + + + + + + + + + + + diff --git a/library/security/openid/consumer/openid-safe.ecf b/library/security/openid/consumer/openid-safe.ecf index 8aec8717..971babd6 100644 --- a/library/security/openid/consumer/openid-safe.ecf +++ b/library/security/openid/consumer/openid-safe.ecf @@ -1,21 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - + + diff --git a/library/security/openid/consumer/openid.ecf b/library/security/openid/consumer/openid.ecf index cd353d0e..d4a8d6d2 100644 --- a/library/security/openid/consumer/openid.ecf +++ b/library/security/openid/consumer/openid.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/security/openid/consumer/tests/tests-safe.ecf b/library/security/openid/consumer/tests/tests-safe.ecf deleted file mode 100644 index b0af2618..00000000 --- a/library/security/openid/consumer/tests/tests-safe.ecf +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - diff --git a/library/security/openid/consumer/tests/tests.ecf b/library/security/openid/consumer/tests/tests.ecf new file mode 100644 index 00000000..6b56b23f --- /dev/null +++ b/library/security/openid/consumer/tests/tests.ecf @@ -0,0 +1,21 @@ + + + + + + /.git$ + /.svn$ + /EIFGENs$ + + + + + + + + + + + + diff --git a/library/server/authentication/http_authorization/example/demo_basic_auth.ecf b/library/server/authentication/http_authorization/example/demo_basic_auth.ecf index dd83dba4..9bb8b343 100644 --- a/library/server/authentication/http_authorization/example/demo_basic_auth.ecf +++ b/library/server/authentication/http_authorization/example/demo_basic_auth.ecf @@ -1,5 +1,5 @@ - + @@ -7,15 +7,15 @@ /CVS$ /EIFGENs$ - - - - - - - + + + + + + diff --git a/library/server/authentication/http_authorization/http_authorization-safe.ecf b/library/server/authentication/http_authorization/http_authorization-safe.ecf index 4842c70e..7601858b 100644 --- a/library/server/authentication/http_authorization/http_authorization-safe.ecf +++ b/library/server/authentication/http_authorization/http_authorization-safe.ecf @@ -1,17 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - + + diff --git a/library/server/authentication/http_authorization/http_authorization.ecf b/library/server/authentication/http_authorization/http_authorization.ecf index 4e29ed39..40f312bf 100644 --- a/library/server/authentication/http_authorization/http_authorization.ecf +++ b/library/server/authentication/http_authorization/http_authorization.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/authentication/http_authorization/testing/testing-safe.ecf b/library/server/authentication/http_authorization/testing/testing.ecf similarity index 55% rename from library/server/authentication/http_authorization/testing/testing-safe.ecf rename to library/server/authentication/http_authorization/testing/testing.ecf index 0a5fa8fb..db73af51 100644 --- a/library/server/authentication/http_authorization/testing/testing-safe.ecf +++ b/library/server/authentication/http_authorization/testing/testing.ecf @@ -1,5 +1,5 @@ - + @@ -7,13 +7,15 @@ /.svn$ /EIFGENs$ - - - - - + + + + + + diff --git a/library/server/ewsgi/connectors/cgi/cgi-safe.ecf b/library/server/ewsgi/connectors/cgi/cgi-safe.ecf index 326f479c..df7469f9 100644 --- a/library/server/ewsgi/connectors/cgi/cgi-safe.ecf +++ b/library/server/ewsgi/connectors/cgi/cgi-safe.ecf @@ -1,19 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - + + diff --git a/library/server/ewsgi/connectors/cgi/cgi.ecf b/library/server/ewsgi/connectors/cgi/cgi.ecf index 449fe8be..d92d8be1 100644 --- a/library/server/ewsgi/connectors/cgi/cgi.ecf +++ b/library/server/ewsgi/connectors/cgi/cgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/ewsgi/connectors/libfcgi/libfcgi-safe.ecf b/library/server/ewsgi/connectors/libfcgi/libfcgi-safe.ecf index 89e15d79..a39072df 100644 --- a/library/server/ewsgi/connectors/libfcgi/libfcgi-safe.ecf +++ b/library/server/ewsgi/connectors/libfcgi/libfcgi-safe.ecf @@ -1,20 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - + + diff --git a/library/server/ewsgi/connectors/libfcgi/libfcgi.ecf b/library/server/ewsgi/connectors/libfcgi/libfcgi.ecf index 6d18b0ce..5b1dda68 100644 --- a/library/server/ewsgi/connectors/libfcgi/libfcgi.ecf +++ b/library/server/ewsgi/connectors/libfcgi/libfcgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,12 +7,11 @@ /\.git$ /\.svn$ - - - + diff --git a/library/server/ewsgi/connectors/nino/nino-safe.ecf b/library/server/ewsgi/connectors/nino/nino-safe.ecf index 27ca8446..99bd45b1 100644 --- a/library/server/ewsgi/connectors/nino/nino-safe.ecf +++ b/library/server/ewsgi/connectors/nino/nino-safe.ecf @@ -1,22 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - + + diff --git a/library/server/ewsgi/connectors/nino/nino.ecf b/library/server/ewsgi/connectors/nino/nino.ecf index 39974ba4..03126bb7 100644 --- a/library/server/ewsgi/connectors/nino/nino.ecf +++ b/library/server/ewsgi/connectors/nino/nino.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,11 @@ /\.git$ /\.svn$ - - + + + diff --git a/library/server/ewsgi/connectors/null/null-safe.ecf b/library/server/ewsgi/connectors/null/null-safe.ecf index b4473379..3a6a2fca 100644 --- a/library/server/ewsgi/connectors/null/null-safe.ecf +++ b/library/server/ewsgi/connectors/null/null-safe.ecf @@ -1,18 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - + + diff --git a/library/server/ewsgi/connectors/null/null.ecf b/library/server/ewsgi/connectors/null/null.ecf index b5aa764f..67fe6203 100644 --- a/library/server/ewsgi/connectors/null/null.ecf +++ b/library/server/ewsgi/connectors/null/null.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/ewsgi/connectors/standalone/standalone-safe.ecf b/library/server/ewsgi/connectors/standalone/standalone-safe.ecf index fe2e274d..5e27cc37 100644 --- a/library/server/ewsgi/connectors/standalone/standalone-safe.ecf +++ b/library/server/ewsgi/connectors/standalone/standalone-safe.ecf @@ -1,23 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - + + diff --git a/library/server/ewsgi/connectors/standalone/standalone.ecf b/library/server/ewsgi/connectors/standalone/standalone.ecf index fd5e231f..dc44cdae 100644 --- a/library/server/ewsgi/connectors/standalone/standalone.ecf +++ b/library/server/ewsgi/connectors/standalone/standalone.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/ewsgi/connectors/standalone/test_standalone-safe.ecf b/library/server/ewsgi/connectors/standalone/test_standalone.ecf similarity index 56% rename from library/server/ewsgi/connectors/standalone/test_standalone-safe.ecf rename to library/server/ewsgi/connectors/standalone/test_standalone.ecf index 84dba0fa..9a195bd4 100644 --- a/library/server/ewsgi/connectors/standalone/test_standalone-safe.ecf +++ b/library/server/ewsgi/connectors/standalone/test_standalone.ecf @@ -1,23 +1,26 @@ - + - - - - - + + + + - + + + - + + + diff --git a/library/server/ewsgi/ewsgi-safe.ecf b/library/server/ewsgi/ewsgi-safe.ecf index c536c87d..e513f2c0 100644 --- a/library/server/ewsgi/ewsgi-safe.ecf +++ b/library/server/ewsgi/ewsgi-safe.ecf @@ -1,25 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - - - + + diff --git a/library/server/ewsgi/ewsgi.ecf b/library/server/ewsgi/ewsgi.ecf index d4e5e408..7442a0b2 100644 --- a/library/server/ewsgi/ewsgi.ecf +++ b/library/server/ewsgi/ewsgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/ewsgi/ewsgi_spec-safe.ecf b/library/server/ewsgi/ewsgi_spec-safe.ecf index 4da91d4a..6ab652e7 100644 --- a/library/server/ewsgi/ewsgi_spec-safe.ecf +++ b/library/server/ewsgi/ewsgi_spec-safe.ecf @@ -1,17 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - + + diff --git a/library/server/ewsgi/ewsgi_spec.ecf b/library/server/ewsgi/ewsgi_spec.ecf index 39f696e0..fe5871d2 100644 --- a/library/server/ewsgi/ewsgi_spec.ecf +++ b/library/server/ewsgi/ewsgi_spec.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/ewsgi/examples/hello_world/hello-safe.ecf b/library/server/ewsgi/examples/hello_world/hello-safe.ecf deleted file mode 100644 index 9b1b132e..00000000 --- a/library/server/ewsgi/examples/hello_world/hello-safe.ecf +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - diff --git a/library/server/ewsgi/examples/hello_world/hello.ecf b/library/server/ewsgi/examples/hello_world/hello.ecf index ea014b23..ac7d961a 100644 --- a/library/server/ewsgi/examples/hello_world/hello.ecf +++ b/library/server/ewsgi/examples/hello_world/hello.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/httpd/httpd-safe.ecf b/library/server/httpd/httpd-safe.ecf index 0c70796f..112d3023 100644 --- a/library/server/httpd/httpd-safe.ecf +++ b/library/server/httpd/httpd-safe.ecf @@ -1,70 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - - - - - - - - - /concurrency$ - /no_ssl$ - /ssl$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/library/server/httpd/httpd.ecf b/library/server/httpd/httpd.ecf index d4012fd7..b1da17f5 100644 --- a/library/server/httpd/httpd.ecf +++ b/library/server/httpd/httpd.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - @@ -64,4 +63,7 @@ + + + diff --git a/library/server/libfcgi/libfcgi-safe.ecf b/library/server/libfcgi/libfcgi-safe.ecf index c94eb0ee..1a7f72be 100644 --- a/library/server/libfcgi/libfcgi-safe.ecf +++ b/library/server/libfcgi/libfcgi-safe.ecf @@ -1,67 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /fake$ - /linux$ - /mac$ - - - - - - /fake$ - /mac$ - /windows$ - - - - - - /fake$ - /linux$ - /windows$ - - - - - - - - + + diff --git a/library/server/libfcgi/libfcgi.ecf b/library/server/libfcgi/libfcgi.ecf index 8131c309..af7e4d69 100644 --- a/library/server/libfcgi/libfcgi.ecf +++ b/library/server/libfcgi/libfcgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/libfcgi/tests/eiffelweb-safe.ecf b/library/server/libfcgi/tests/eiffelweb-safe.ecf deleted file mode 100644 index 16a5f343..00000000 --- a/library/server/libfcgi/tests/eiffelweb-safe.ecf +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - diff --git a/library/server/libfcgi/tests/eiffelweb.ecf b/library/server/libfcgi/tests/eiffelweb.ecf index f7157475..29711322 100644 --- a/library/server/libfcgi/tests/eiffelweb.ecf +++ b/library/server/libfcgi/tests/eiffelweb.ecf @@ -1,5 +1,5 @@ - + @@ -7,10 +7,10 @@ /\.git$ /\.svn$ - - + + + diff --git a/library/server/obsolete/v0/ewsgi/connectors/libfcgi/libfcgi-safe.ecf b/library/server/obsolete/v0/ewsgi/connectors/libfcgi/libfcgi-safe.ecf index d59d3d4e..827058cb 100644 --- a/library/server/obsolete/v0/ewsgi/connectors/libfcgi/libfcgi-safe.ecf +++ b/library/server/obsolete/v0/ewsgi/connectors/libfcgi/libfcgi-safe.ecf @@ -1,24 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - /wgi_.*_connector.e$ - - - - - + + diff --git a/library/server/obsolete/v0/ewsgi/connectors/libfcgi/libfcgi.ecf b/library/server/obsolete/v0/ewsgi/connectors/libfcgi/libfcgi.ecf index 43238190..7dbbdd97 100644 --- a/library/server/obsolete/v0/ewsgi/connectors/libfcgi/libfcgi.ecf +++ b/library/server/obsolete/v0/ewsgi/connectors/libfcgi/libfcgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,18 +7,15 @@ /\.git$ /\.svn$ - - - /.*_service.e$ /wgi_.*_connector.e$ - /wgi_.*_handler.e$ diff --git a/library/server/obsolete/v0/ewsgi/connectors/nino/nino-safe.ecf b/library/server/obsolete/v0/ewsgi/connectors/nino/nino-safe.ecf index 3ce5811e..25da9f82 100644 --- a/library/server/obsolete/v0/ewsgi/connectors/nino/nino-safe.ecf +++ b/library/server/obsolete/v0/ewsgi/connectors/nino/nino-safe.ecf @@ -1,29 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - /.*_service.e$ - /wgi_.*_connector.e$ - /wgi_.*_handler.e$ - - - - - + + diff --git a/library/server/obsolete/v0/ewsgi/connectors/nino/nino.ecf b/library/server/obsolete/v0/ewsgi/connectors/nino/nino.ecf index 1011a571..ef06f62f 100644 --- a/library/server/obsolete/v0/ewsgi/connectors/nino/nino.ecf +++ b/library/server/obsolete/v0/ewsgi/connectors/nino/nino.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,11 @@ /\.git$ /\.svn$ - - + + + diff --git a/library/server/obsolete/v0/ewsgi/ewsgi-safe.ecf b/library/server/obsolete/v0/ewsgi/ewsgi-safe.ecf index 3a904bbc..9de24746 100644 --- a/library/server/obsolete/v0/ewsgi/ewsgi-safe.ecf +++ b/library/server/obsolete/v0/ewsgi/ewsgi-safe.ecf @@ -1,27 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - - - - - + + diff --git a/library/server/obsolete/v0/ewsgi/ewsgi.ecf b/library/server/obsolete/v0/ewsgi/ewsgi.ecf index 4e0c04f4..52fab724 100644 --- a/library/server/obsolete/v0/ewsgi/ewsgi.ecf +++ b/library/server/obsolete/v0/ewsgi/ewsgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/obsolete/v0/wsf/connector/libfcgi-safe.ecf b/library/server/obsolete/v0/wsf/connector/libfcgi-safe.ecf index ed09ba53..dce6a99d 100644 --- a/library/server/obsolete/v0/wsf/connector/libfcgi-safe.ecf +++ b/library/server/obsolete/v0/wsf/connector/libfcgi-safe.ecf @@ -1,23 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - + + diff --git a/library/server/obsolete/v0/wsf/connector/libfcgi.ecf b/library/server/obsolete/v0/wsf/connector/libfcgi.ecf index 8202c47a..05884218 100644 --- a/library/server/obsolete/v0/wsf/connector/libfcgi.ecf +++ b/library/server/obsolete/v0/wsf/connector/libfcgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/obsolete/v0/wsf/connector/nino-safe.ecf b/library/server/obsolete/v0/wsf/connector/nino-safe.ecf index b3d46573..c3b1e5ef 100644 --- a/library/server/obsolete/v0/wsf/connector/nino-safe.ecf +++ b/library/server/obsolete/v0/wsf/connector/nino-safe.ecf @@ -1,26 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - - - - + + diff --git a/library/server/obsolete/v0/wsf/connector/nino.ecf b/library/server/obsolete/v0/wsf/connector/nino.ecf index ba0da66e..daec7594 100644 --- a/library/server/obsolete/v0/wsf/connector/nino.ecf +++ b/library/server/obsolete/v0/wsf/connector/nino.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,11 @@ /\.git$ /\.svn$ - - + + + diff --git a/library/server/obsolete/v0/wsf/default/libfcgi-safe.ecf b/library/server/obsolete/v0/wsf/default/libfcgi-safe.ecf index cebdfea7..1549ae3a 100644 --- a/library/server/obsolete/v0/wsf/default/libfcgi-safe.ecf +++ b/library/server/obsolete/v0/wsf/default/libfcgi-safe.ecf @@ -1,18 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - + + diff --git a/library/server/obsolete/v0/wsf/default/libfcgi.ecf b/library/server/obsolete/v0/wsf/default/libfcgi.ecf index da05ddba..f398a970 100644 --- a/library/server/obsolete/v0/wsf/default/libfcgi.ecf +++ b/library/server/obsolete/v0/wsf/default/libfcgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/obsolete/v0/wsf/default/nino-safe.ecf b/library/server/obsolete/v0/wsf/default/nino-safe.ecf index 4937ce34..078a78e1 100644 --- a/library/server/obsolete/v0/wsf/default/nino-safe.ecf +++ b/library/server/obsolete/v0/wsf/default/nino-safe.ecf @@ -1,18 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - + + diff --git a/library/server/obsolete/v0/wsf/default/nino.ecf b/library/server/obsolete/v0/wsf/default/nino.ecf index ce4bb3e8..fb806bb6 100644 --- a/library/server/obsolete/v0/wsf/default/nino.ecf +++ b/library/server/obsolete/v0/wsf/default/nino.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,11 @@ /\.git$ /\.svn$ - - + + + diff --git a/library/server/obsolete/v0/wsf/wsf-safe.ecf b/library/server/obsolete/v0/wsf/wsf-safe.ecf index 10a2f70d..034ab82a 100644 --- a/library/server/obsolete/v0/wsf/wsf-safe.ecf +++ b/library/server/obsolete/v0/wsf/wsf-safe.ecf @@ -1,38 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - - - - /policy_driven$ - - - - - - /service$ - - - - - + + diff --git a/library/server/obsolete/v0/wsf/wsf.ecf b/library/server/obsolete/v0/wsf/wsf.ecf index 624f3894..714ddb87 100644 --- a/library/server/obsolete/v0/wsf/wsf.ecf +++ b/library/server/obsolete/v0/wsf/wsf.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/obsolete/v0/wsf/wsf_extension-safe.ecf b/library/server/obsolete/v0/wsf/wsf_extension-safe.ecf index a1713f43..719546e1 100644 --- a/library/server/obsolete/v0/wsf/wsf_extension-safe.ecf +++ b/library/server/obsolete/v0/wsf/wsf_extension-safe.ecf @@ -1,21 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - + + diff --git a/library/server/obsolete/v0/wsf/wsf_extension.ecf b/library/server/obsolete/v0/wsf/wsf_extension.ecf index 3fca1079..98ee6af5 100644 --- a/library/server/obsolete/v0/wsf/wsf_extension.ecf +++ b/library/server/obsolete/v0/wsf/wsf_extension.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/obsolete/v0/wsf/wsf_policy_driven-safe.ecf b/library/server/obsolete/v0/wsf/wsf_policy_driven-safe.ecf index 84572b66..66c588b4 100644 --- a/library/server/obsolete/v0/wsf/wsf_policy_driven-safe.ecf +++ b/library/server/obsolete/v0/wsf/wsf_policy_driven-safe.ecf @@ -1,23 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - + + diff --git a/library/server/obsolete/v0/wsf/wsf_policy_driven.ecf b/library/server/obsolete/v0/wsf/wsf_policy_driven.ecf index 193a8db4..22116ce7 100644 --- a/library/server/obsolete/v0/wsf/wsf_policy_driven.ecf +++ b/library/server/obsolete/v0/wsf/wsf_policy_driven.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/obsolete/v0/wsf/wsf_router_context-safe.ecf b/library/server/obsolete/v0/wsf/wsf_router_context-safe.ecf index 9e53cd39..067f0d3c 100644 --- a/library/server/obsolete/v0/wsf/wsf_router_context-safe.ecf +++ b/library/server/obsolete/v0/wsf/wsf_router_context-safe.ecf @@ -1,17 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - + + diff --git a/library/server/obsolete/v0/wsf/wsf_router_context.ecf b/library/server/obsolete/v0/wsf/wsf_router_context.ecf index 20cbe3f5..9cc0e522 100644 --- a/library/server/obsolete/v0/wsf/wsf_router_context.ecf +++ b/library/server/obsolete/v0/wsf/wsf_router_context.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/obsolete/v0/wsf/wsf_session-safe.ecf b/library/server/obsolete/v0/wsf/wsf_session-safe.ecf index aa1b786b..dd13dd08 100644 --- a/library/server/obsolete/v0/wsf/wsf_session-safe.ecf +++ b/library/server/obsolete/v0/wsf/wsf_session-safe.ecf @@ -1,21 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - + + diff --git a/library/server/obsolete/v0/wsf/wsf_session.ecf b/library/server/obsolete/v0/wsf/wsf_session.ecf index 4ed7951c..8506b14c 100644 --- a/library/server/obsolete/v0/wsf/wsf_session.ecf +++ b/library/server/obsolete/v0/wsf/wsf_session.ecf @@ -1,5 +1,5 @@ - + @@ -7,15 +7,14 @@ /.svn$ /EIFGENs$ - - - + diff --git a/library/server/obsolete/v0/wsf_html/wsf_html-safe.ecf b/library/server/obsolete/v0/wsf_html/wsf_html-safe.ecf index 8e8e2d21..4c98532b 100644 --- a/library/server/obsolete/v0/wsf_html/wsf_html-safe.ecf +++ b/library/server/obsolete/v0/wsf_html/wsf_html-safe.ecf @@ -1,22 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - + + diff --git a/library/server/obsolete/v0/wsf_html/wsf_html.ecf b/library/server/obsolete/v0/wsf_html/wsf_html.ecf index 1677881f..f7e50a05 100644 --- a/library/server/obsolete/v0/wsf_html/wsf_html.ecf +++ b/library/server/obsolete/v0/wsf_html/wsf_html.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/wsf/connector/all-safe.ecf b/library/server/wsf/connector/all-safe.ecf index 8d3c51d0..e3e4b5b0 100644 --- a/library/server/wsf/connector/all-safe.ecf +++ b/library/server/wsf/connector/all-safe.ecf @@ -1,27 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - - - - - + + diff --git a/library/server/wsf/connector/all.ecf b/library/server/wsf/connector/all.ecf index 1381465f..740f03b7 100644 --- a/library/server/wsf/connector/all.ecf +++ b/library/server/wsf/connector/all.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/wsf/connector/cgi-safe.ecf b/library/server/wsf/connector/cgi-safe.ecf index 9901295c..53e0bd5e 100644 --- a/library/server/wsf/connector/cgi-safe.ecf +++ b/library/server/wsf/connector/cgi-safe.ecf @@ -1,23 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - + + diff --git a/library/server/wsf/connector/cgi.ecf b/library/server/wsf/connector/cgi.ecf index 40566927..a1cbfaa0 100644 --- a/library/server/wsf/connector/cgi.ecf +++ b/library/server/wsf/connector/cgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/wsf/connector/libfcgi-safe.ecf b/library/server/wsf/connector/libfcgi-safe.ecf index 61eee5f3..94f52473 100644 --- a/library/server/wsf/connector/libfcgi-safe.ecf +++ b/library/server/wsf/connector/libfcgi-safe.ecf @@ -1,23 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - + + diff --git a/library/server/wsf/connector/libfcgi.ecf b/library/server/wsf/connector/libfcgi.ecf index 2e4e9474..8ad71160 100644 --- a/library/server/wsf/connector/libfcgi.ecf +++ b/library/server/wsf/connector/libfcgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/wsf/connector/nino-safe.ecf b/library/server/wsf/connector/nino-safe.ecf index f58aa75e..4dfa55fc 100644 --- a/library/server/wsf/connector/nino-safe.ecf +++ b/library/server/wsf/connector/nino-safe.ecf @@ -1,26 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - - - - + + diff --git a/library/server/wsf/connector/nino.ecf b/library/server/wsf/connector/nino.ecf index c50711f2..4b2aec39 100644 --- a/library/server/wsf/connector/nino.ecf +++ b/library/server/wsf/connector/nino.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,11 @@ /\.git$ /\.svn$ - - + + + diff --git a/library/server/wsf/connector/openshift-safe.ecf b/library/server/wsf/connector/openshift-safe.ecf index cbcfd5cf..1f168673 100644 --- a/library/server/wsf/connector/openshift-safe.ecf +++ b/library/server/wsf/connector/openshift-safe.ecf @@ -1,19 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - + + diff --git a/library/server/wsf/connector/openshift.ecf b/library/server/wsf/connector/openshift.ecf index 371275e3..bc09db74 100644 --- a/library/server/wsf/connector/openshift.ecf +++ b/library/server/wsf/connector/openshift.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/wsf/connector/standalone-safe.ecf b/library/server/wsf/connector/standalone-safe.ecf index 6b884d46..b424043f 100644 --- a/library/server/wsf/connector/standalone-safe.ecf +++ b/library/server/wsf/connector/standalone-safe.ecf @@ -1,23 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - + + diff --git a/library/server/wsf/connector/standalone.ecf b/library/server/wsf/connector/standalone.ecf index c91e3b9a..758e3cab 100644 --- a/library/server/wsf/connector/standalone.ecf +++ b/library/server/wsf/connector/standalone.ecf @@ -1,5 +1,5 @@ - + @@ -7,17 +7,16 @@ /\.git$ /\.svn$ - - - + - + - + diff --git a/library/server/wsf/connector/standalone_websocket-safe.ecf b/library/server/wsf/connector/standalone_websocket-safe.ecf index e5d56d4d..e1181758 100644 --- a/library/server/wsf/connector/standalone_websocket-safe.ecf +++ b/library/server/wsf/connector/standalone_websocket-safe.ecf @@ -1,27 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - - - - - - - - - - + + diff --git a/library/server/wsf/connector/standalone_websocket.ecf b/library/server/wsf/connector/standalone_websocket.ecf index 1f8e054b..7fb893ce 100644 --- a/library/server/wsf/connector/standalone_websocket.ecf +++ b/library/server/wsf/connector/standalone_websocket.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/wsf/default/cgi-safe.ecf b/library/server/wsf/default/cgi-safe.ecf index bcc72eb5..1ec20576 100644 --- a/library/server/wsf/default/cgi-safe.ecf +++ b/library/server/wsf/default/cgi-safe.ecf @@ -1,18 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - + + diff --git a/library/server/wsf/default/cgi.ecf b/library/server/wsf/default/cgi.ecf index 7105b945..f897c5b5 100644 --- a/library/server/wsf/default/cgi.ecf +++ b/library/server/wsf/default/cgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/wsf/default/libfcgi-safe.ecf b/library/server/wsf/default/libfcgi-safe.ecf index 3cd633cc..39731935 100644 --- a/library/server/wsf/default/libfcgi-safe.ecf +++ b/library/server/wsf/default/libfcgi-safe.ecf @@ -1,18 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - + + diff --git a/library/server/wsf/default/libfcgi.ecf b/library/server/wsf/default/libfcgi.ecf index d17bdb43..9c98cc86 100644 --- a/library/server/wsf/default/libfcgi.ecf +++ b/library/server/wsf/default/libfcgi.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/wsf/default/nino-safe.ecf b/library/server/wsf/default/nino-safe.ecf index 08138562..0e845b96 100644 --- a/library/server/wsf/default/nino-safe.ecf +++ b/library/server/wsf/default/nino-safe.ecf @@ -1,18 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - + + diff --git a/library/server/wsf/default/nino.ecf b/library/server/wsf/default/nino.ecf index f5ced01e..0b4dd594 100644 --- a/library/server/wsf/default/nino.ecf +++ b/library/server/wsf/default/nino.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,11 @@ /\.git$ /\.svn$ - - + + + diff --git a/library/server/wsf/default/openshift-safe.ecf b/library/server/wsf/default/openshift-safe.ecf index 566a353f..a225f91f 100644 --- a/library/server/wsf/default/openshift-safe.ecf +++ b/library/server/wsf/default/openshift-safe.ecf @@ -1,18 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - + + diff --git a/library/server/wsf/default/openshift.ecf b/library/server/wsf/default/openshift.ecf index bb1624ed..c7c92eb2 100644 --- a/library/server/wsf/default/openshift.ecf +++ b/library/server/wsf/default/openshift.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /\.git$ /\.svn$ - - diff --git a/library/server/wsf/default/standalone-safe.ecf b/library/server/wsf/default/standalone-safe.ecf index 31c70da1..287bf7ec 100644 --- a/library/server/wsf/default/standalone-safe.ecf +++ b/library/server/wsf/default/standalone-safe.ecf @@ -1,18 +1,3 @@ - - - - - /EIFGENs$ - /\.git$ - /\.svn$ - - - - - - - - - + + diff --git a/library/server/wsf/default/standalone.ecf b/library/server/wsf/default/standalone.ecf index 84285953..9af956ab 100644 --- a/library/server/wsf/default/standalone.ecf +++ b/library/server/wsf/default/standalone.ecf @@ -1,5 +1,5 @@ - + @@ -7,11 +7,10 @@ /\.git$ /\.svn$ - - - + diff --git a/library/server/wsf/tests/echo/echo-safe.ecf b/library/server/wsf/tests/echo/echo-safe.ecf deleted file mode 100644 index 9146db93..00000000 --- a/library/server/wsf/tests/echo/echo-safe.ecf +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - diff --git a/library/server/wsf/tests/echo/echo.ecf b/library/server/wsf/tests/echo/echo.ecf new file mode 100644 index 00000000..84705ddf --- /dev/null +++ b/library/server/wsf/tests/echo/echo.ecf @@ -0,0 +1,20 @@ + + + + + + /.git$ + /.svn$ + /EIFGENs$ + + + + + + + + + + + diff --git a/library/server/wsf/tests/tests-safe.ecf b/library/server/wsf/tests/tests-safe.ecf deleted file mode 100644 index ee1252ee..00000000 --- a/library/server/wsf/tests/tests-safe.ecf +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/library/server/wsf/tests/tests.ecf b/library/server/wsf/tests/tests.ecf index dc13d593..426f2a6f 100644 --- a/library/server/wsf/tests/tests.ecf +++ b/library/server/wsf/tests/tests.ecf @@ -1,5 +1,5 @@ - + @@ -7,19 +7,26 @@ /.svn$ /EIFGENs$ - - - + + + - - - + + + + diff --git a/library/server/wsf/wsf-safe.ecf b/library/server/wsf/wsf-safe.ecf index 58e2b2ba..2d836cdc 100644 --- a/library/server/wsf/wsf-safe.ecf +++ b/library/server/wsf/wsf-safe.ecf @@ -1,32 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - - - - /policy_driven$ - - - - - + + diff --git a/library/server/wsf/wsf.ecf b/library/server/wsf/wsf.ecf index 58b50f1b..da3dd537 100644 --- a/library/server/wsf/wsf.ecf +++ b/library/server/wsf/wsf.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/wsf/wsf_extension-safe.ecf b/library/server/wsf/wsf_extension-safe.ecf index f7e5884e..2a3f7fe1 100644 --- a/library/server/wsf/wsf_extension-safe.ecf +++ b/library/server/wsf/wsf_extension-safe.ecf @@ -1,21 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - + + diff --git a/library/server/wsf/wsf_extension.ecf b/library/server/wsf/wsf_extension.ecf index 373a3633..fa470598 100644 --- a/library/server/wsf/wsf_extension.ecf +++ b/library/server/wsf/wsf_extension.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/wsf/wsf_policy_driven-safe.ecf b/library/server/wsf/wsf_policy_driven-safe.ecf index 94858f09..08dd9cec 100644 --- a/library/server/wsf/wsf_policy_driven-safe.ecf +++ b/library/server/wsf/wsf_policy_driven-safe.ecf @@ -1,23 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - + + diff --git a/library/server/wsf/wsf_policy_driven.ecf b/library/server/wsf/wsf_policy_driven.ecf index b7fc8486..5cb5f4ba 100644 --- a/library/server/wsf/wsf_policy_driven.ecf +++ b/library/server/wsf/wsf_policy_driven.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/wsf/wsf_router_context-safe.ecf b/library/server/wsf/wsf_router_context-safe.ecf index 729ad6d4..6a741ee6 100644 --- a/library/server/wsf/wsf_router_context-safe.ecf +++ b/library/server/wsf/wsf_router_context-safe.ecf @@ -1,17 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - + + diff --git a/library/server/wsf/wsf_router_context.ecf b/library/server/wsf/wsf_router_context.ecf index 7d03a0d2..e0fa510c 100644 --- a/library/server/wsf/wsf_router_context.ecf +++ b/library/server/wsf/wsf_router_context.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/wsf/wsf_session-safe.ecf b/library/server/wsf/wsf_session-safe.ecf index b2d5d9c9..dd13dd08 100644 --- a/library/server/wsf/wsf_session-safe.ecf +++ b/library/server/wsf/wsf_session-safe.ecf @@ -1,21 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - + + diff --git a/library/server/wsf/wsf_session.ecf b/library/server/wsf/wsf_session.ecf index 860caff5..1c070be2 100644 --- a/library/server/wsf/wsf_session.ecf +++ b/library/server/wsf/wsf_session.ecf @@ -1,5 +1,5 @@ - + @@ -7,15 +7,14 @@ /.svn$ /EIFGENs$ - - - + diff --git a/library/server/wsf_html/wsf_html-safe.ecf b/library/server/wsf_html/wsf_html-safe.ecf index 6e3f66f6..5c85add8 100644 --- a/library/server/wsf_html/wsf_html-safe.ecf +++ b/library/server/wsf_html/wsf_html-safe.ecf @@ -1,22 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - + + diff --git a/library/server/wsf_html/wsf_html.ecf b/library/server/wsf_html/wsf_html.ecf index aa888960..0ed61b2a 100644 --- a/library/server/wsf_html/wsf_html.ecf +++ b/library/server/wsf_html/wsf_html.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/server/wsf_proxy/wsf_proxy-safe.ecf b/library/server/wsf_proxy/wsf_proxy-safe.ecf index edcb930b..97890b59 100644 --- a/library/server/wsf_proxy/wsf_proxy-safe.ecf +++ b/library/server/wsf_proxy/wsf_proxy-safe.ecf @@ -1,35 +1,3 @@ - - - - - - - - - - - - - - - - - no_ssl - ssl - - - - - - - - - - - - - - - - + + diff --git a/library/server/wsf_proxy/wsf_proxy.ecf b/library/server/wsf_proxy/wsf_proxy.ecf index f9c2afb1..9b43cb66 100644 --- a/library/server/wsf_proxy/wsf_proxy.ecf +++ b/library/server/wsf_proxy/wsf_proxy.ecf @@ -1,10 +1,7 @@ - + - - diff --git a/library/text/encoder/encoder-safe.ecf b/library/text/encoder/encoder-safe.ecf index 07528c04..55ad1a45 100644 --- a/library/text/encoder/encoder-safe.ecf +++ b/library/text/encoder/encoder-safe.ecf @@ -1,20 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - /tests$ - - - - + + diff --git a/library/text/encoder/encoder.ecf b/library/text/encoder/encoder.ecf index fd3a3eef..51a1cc8d 100644 --- a/library/text/encoder/encoder.ecf +++ b/library/text/encoder/encoder.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/text/encoder/tests/tests-safe.ecf b/library/text/encoder/tests/tests-safe.ecf deleted file mode 100644 index d1aedf3a..00000000 --- a/library/text/encoder/tests/tests-safe.ecf +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - diff --git a/library/text/encoder/tests/tests.ecf b/library/text/encoder/tests/tests.ecf new file mode 100644 index 00000000..f19d3d16 --- /dev/null +++ b/library/text/encoder/tests/tests.ecf @@ -0,0 +1,21 @@ + + + + + + /.git$ + /.svn$ + /EIFGENs$ + + + + + + + + + + + diff --git a/library/text/parser/feed/feed-safe.ecf b/library/text/parser/feed/feed-safe.ecf index bc16024d..661f82e9 100644 --- a/library/text/parser/feed/feed-safe.ecf +++ b/library/text/parser/feed/feed-safe.ecf @@ -1,18 +1,3 @@ - - - - - - - - - - - - - - - - + + diff --git a/library/text/parser/feed/feed.ecf b/library/text/parser/feed/feed.ecf index dc301faa..159f2ac2 100644 --- a/library/text/parser/feed/feed.ecf +++ b/library/text/parser/feed/feed.ecf @@ -1,10 +1,7 @@ - + - - diff --git a/library/text/parser/feed/tests/tests-safe.ecf b/library/text/parser/feed/tests/tests-safe.ecf deleted file mode 100644 index 394f3f95..00000000 --- a/library/text/parser/feed/tests/tests-safe.ecf +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/library/text/parser/feed/tests/tests.ecf b/library/text/parser/feed/tests/tests.ecf new file mode 100644 index 00000000..0172dce6 --- /dev/null +++ b/library/text/parser/feed/tests/tests.ecf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/library/text/parser/uri_template/tests/tests-safe.ecf b/library/text/parser/uri_template/tests/tests-safe.ecf deleted file mode 100644 index 6e3d1c93..00000000 --- a/library/text/parser/uri_template/tests/tests-safe.ecf +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - diff --git a/library/text/parser/uri_template/tests/tests.ecf b/library/text/parser/uri_template/tests/tests.ecf new file mode 100644 index 00000000..8ab9400a --- /dev/null +++ b/library/text/parser/uri_template/tests/tests.ecf @@ -0,0 +1,21 @@ + + + + + + /.git$ + /.svn$ + /EIFGENs$ + + + + + + + + + + + diff --git a/library/text/parser/uri_template/uri_template-safe.ecf b/library/text/parser/uri_template/uri_template-safe.ecf index f64c7650..b3c98ddf 100644 --- a/library/text/parser/uri_template/uri_template-safe.ecf +++ b/library/text/parser/uri_template/uri_template-safe.ecf @@ -1,18 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - + + diff --git a/library/text/parser/uri_template/uri_template.ecf b/library/text/parser/uri_template/uri_template.ecf index 376cafca..53d61f5e 100644 --- a/library/text/parser/uri_template/uri_template.ecf +++ b/library/text/parser/uri_template/uri_template.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/utility/general/error/error-safe.ecf b/library/utility/general/error/error-safe.ecf index 2be22c45..36c8b0ec 100644 --- a/library/utility/general/error/error-safe.ecf +++ b/library/utility/general/error/error-safe.ecf @@ -1,16 +1,3 @@ - - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - + + diff --git a/library/utility/general/error/error.ecf b/library/utility/general/error/error.ecf index 6ed34c57..a38c8f0a 100644 --- a/library/utility/general/error/error.ecf +++ b/library/utility/general/error/error.ecf @@ -1,5 +1,5 @@ - + @@ -7,9 +7,8 @@ /.svn$ /EIFGENs$ - - diff --git a/library/utility/general/error/tests/tests-safe.ecf b/library/utility/general/error/tests/tests.ecf similarity index 58% rename from library/utility/general/error/tests/tests-safe.ecf rename to library/utility/general/error/tests/tests.ecf index 12ceac97..018e0f9c 100644 --- a/library/utility/general/error/tests/tests-safe.ecf +++ b/library/utility/general/error/tests/tests.ecf @@ -1,5 +1,5 @@ - + @@ -7,16 +7,19 @@ /.svn$ /EIFGENs$ - - - + + + + + - + diff --git a/precomp/wsf-mt-safe.ecf b/precomp/wsf-mt-safe.ecf index 24157c87..ab73de35 100644 --- a/precomp/wsf-mt-safe.ecf +++ b/precomp/wsf-mt-safe.ecf @@ -1,10 +1,11 @@ - + - - + + + + diff --git a/precomp/wsf-mt.ecf b/precomp/wsf-mt.ecf new file mode 100644 index 00000000..a0fe7610 --- /dev/null +++ b/precomp/wsf-mt.ecf @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/precomp/wsf-safe.ecf b/precomp/wsf-safe.ecf index c30b0d5f..d96c0065 100644 --- a/precomp/wsf-safe.ecf +++ b/precomp/wsf-safe.ecf @@ -1,9 +1,11 @@ - + - + + + + diff --git a/precomp/wsf-scoop-safe.ecf b/precomp/wsf-scoop-safe.ecf index 61a076a8..ae9105c5 100644 --- a/precomp/wsf-scoop-safe.ecf +++ b/precomp/wsf-scoop-safe.ecf @@ -1,10 +1,11 @@ - + - - + + + + diff --git a/precomp/wsf-scoop.ecf b/precomp/wsf-scoop.ecf new file mode 100644 index 00000000..2f5a10ab --- /dev/null +++ b/precomp/wsf-scoop.ecf @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/precomp/wsf.ecf b/precomp/wsf.ecf new file mode 100644 index 00000000..0d29142a --- /dev/null +++ b/precomp/wsf.ecf @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/tests/all-safe.ecf b/tests/all-safe.ecf deleted file mode 100644 index 47a97035..00000000 --- a/tests/all-safe.ecf +++ /dev/null @@ -1,75 +0,0 @@ - - - Integration project including many lib - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Compiling with None concurrency - - - - - Compiling with SCOOP concurrency - - - - - Compiling with Eiffel Thread concurrency - - - - - Compiling as Windows , on other platforms than Windows - - - - - Compiling as UNIX , on other platforms than Unix - - - - diff --git a/tests/all-stable-safe.ecf b/tests/all-stable-safe.ecf deleted file mode 100644 index ece911e1..00000000 --- a/tests/all-stable-safe.ecf +++ /dev/null @@ -1,60 +0,0 @@ - - - Integration project including many lib - - - - /.git$ - /.svn$ - /EIFGENs$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Compiling as Windows , on other platforms than Windows - - - - - Compiling as UNIX , on other platforms than Unix - - - - - Compiling with ssl enabled - - - - diff --git a/tests/all-stable.ecf b/tests/all-stable.ecf index 95b05908..b4c66d06 100644 --- a/tests/all-stable.ecf +++ b/tests/all-stable.ecf @@ -1,5 +1,5 @@ - + Integration project including many lib @@ -8,9 +8,8 @@ /.svn$ /EIFGENs$ - - diff --git a/tests/all.ecf b/tests/all.ecf index e398aecd..2e9d398e 100644 --- a/tests/all.ecf +++ b/tests/all.ecf @@ -1,5 +1,5 @@ - + Integration project including many lib @@ -8,9 +8,8 @@ /.svn$ /EIFGENs$ - - @@ -50,17 +49,23 @@ Compiling with None concurrency - + + + Compiling with SCOOP concurrency - + + + Compiling with Eiffel Thread concurrency - + + + Compiling as Windows , on other platforms than Windows diff --git a/tests/dev/hello-safe.ecf b/tests/dev/hello.ecf similarity index 64% rename from tests/dev/hello-safe.ecf rename to tests/dev/hello.ecf index ca09845f..010f1ae6 100644 --- a/tests/dev/hello-safe.ecf +++ b/tests/dev/hello.ecf @@ -1,5 +1,5 @@ - + @@ -7,31 +7,33 @@ /\.git$ /\.svn$ - - - - - + + + + + + - - + - + - + diff --git a/tests/server/wsf_html/test.ecf b/tests/server/wsf_html/test.ecf index 11f05c46..c4234d77 100644 --- a/tests/server/wsf_html/test.ecf +++ b/tests/server/wsf_html/test.ecf @@ -1,15 +1,18 @@ - + - + + + - - - + + + /.svn$ diff --git a/tools/estudio_wizard/console_wizard.ecf b/tools/estudio_wizard/console_wizard.ecf index 1902dc89..f2c6a981 100644 --- a/tools/estudio_wizard/console_wizard.ecf +++ b/tools/estudio_wizard/console_wizard.ecf @@ -1,5 +1,5 @@ - + @@ -7,13 +7,15 @@ /.svn$ /EIFGENs$ - - - - - + + + + + + /gui$ diff --git a/tools/estudio_wizard/lib/wizard/estudio_console_wizard-safe.ecf b/tools/estudio_wizard/lib/wizard/estudio_console_wizard-safe.ecf deleted file mode 100644 index 7d473455..00000000 --- a/tools/estudio_wizard/lib/wizard/estudio_console_wizard-safe.ecf +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/tools/estudio_wizard/lib/wizard/estudio_console_wizard.ecf b/tools/estudio_wizard/lib/wizard/estudio_console_wizard.ecf new file mode 100644 index 00000000..0fc327e1 --- /dev/null +++ b/tools/estudio_wizard/lib/wizard/estudio_console_wizard.ecf @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tools/estudio_wizard/lib/wizard/estudio_gui_wizard-safe.ecf b/tools/estudio_wizard/lib/wizard/estudio_gui_wizard.ecf similarity index 50% rename from tools/estudio_wizard/lib/wizard/estudio_gui_wizard-safe.ecf rename to tools/estudio_wizard/lib/wizard/estudio_gui_wizard.ecf index 83d7f26a..9c3e39b0 100644 --- a/tools/estudio_wizard/lib/wizard/estudio_gui_wizard-safe.ecf +++ b/tools/estudio_wizard/lib/wizard/estudio_gui_wizard.ecf @@ -1,11 +1,14 @@ - + - - - - + + + + + + + diff --git a/tools/estudio_wizard/rootdir/resources/${APP_NAME}.ecf b/tools/estudio_wizard/rootdir/resources/${APP_NAME}.ecf index 445d754c..94ea7989 100644 --- a/tools/estudio_wizard/rootdir/resources/${APP_NAME}.ecf +++ b/tools/estudio_wizard/rootdir/resources/${APP_NAME}.ecf @@ -1,22 +1,20 @@ - + /EIFGENs$ /CVS$ /.svn$ - - - {if condition="$WIZ.connectors.use_standalone ~ $WIZ_YES"}{/if} {if condition="$WIZ.connectors.use_cgi ~ $WIZ_YES"}{/if} {if condition="$WIZ.connectors.use_libfcgi ~ $WIZ_YES"}{/if} @@ -29,7 +27,6 @@ - @@ -39,7 +36,9 @@ {if condition="$WIZ.connectors.use_cgi ~ $WIZ_YES"} - + + + @@ -49,7 +48,9 @@ {if condition="$WIZ.connectors.use_libfcgi ~ $WIZ_YES"} - + + + diff --git a/tools/estudio_wizard/rootdir_custom/resources/template.ecf b/tools/estudio_wizard/rootdir_custom/resources/template.ecf index 45f5ceee..e3c09d62 100644 --- a/tools/estudio_wizard/rootdir_custom/resources/template.ecf +++ b/tools/estudio_wizard/rootdir_custom/resources/template.ecf @@ -1,5 +1,5 @@ - + @@ -7,10 +7,12 @@ /CVS$ /.svn$ - - + + + diff --git a/tools/estudio_wizard/wizard.ecf b/tools/estudio_wizard/wizard.ecf index 87ab69bb..963bfda5 100644 --- a/tools/estudio_wizard/wizard.ecf +++ b/tools/estudio_wizard/wizard.ecf @@ -1,5 +1,5 @@ - + @@ -7,14 +7,16 @@ /.svn$ /EIFGENs$ - - - - - - + + + + + + + From d4c79f189328f61323d8248c19499da34a814636 Mon Sep 17 00:00:00 2001 From: Jocelyn Fiat Date: Tue, 7 Mar 2017 14:31:36 +0100 Subject: [PATCH 02/30] Fixed xml info of ecf files. --- .../server/nino/example/SimpleWebServer/web_server-safe.ecf | 2 +- .../network/server/nino/example/SimpleWebServer/web_server.ecf | 2 +- contrib/library/network/server/nino/nino-safe.ecf | 2 +- contrib/library/network/server/nino/nino.ecf | 2 +- docs/workbook/basics/simple/simple.ecf | 2 +- docs/workbook/basics/simple_html/simple_html.ecf | 2 +- docs/workbook/generating_response/exel/exel.ecf | 2 +- docs/workbook/generating_response/headers/headers.ecf | 2 +- docs/workbook/generating_response/search/search.ecf | 2 +- docs/workbook/generating_response/status/status.ecf | 2 +- docs/workbook/handling_cookies/example/example.ecf | 2 +- docs/workbook/handling_request/form/get/form.ecf | 2 +- docs/workbook/handling_request/form/post/form.ecf | 2 +- .../workbook/handling_request/headers/browser_name/browsers.ecf | 2 +- .../handling_request/headers/cgi_variables/cgi_variables.ecf | 2 +- .../handling_request/headers/header_fields/header_fields.ecf | 2 +- docs/workbook/handling_request/upload_file/upload.ecf | 2 +- draft/library/protocol/syndication/atom/atom-safe.ecf | 2 +- draft/library/protocol/syndication/atom/atom.ecf | 2 +- draft/library/protocol/syndication/rss/rss-safe.ecf | 2 +- draft/library/protocol/syndication/rss/rss.ecf | 2 +- draft/library/security/oauth/oauth-safe.ecf | 2 +- draft/library/security/oauth/oauth.ecf | 2 +- .../examples/custom-template/js_widget_template.ecf | 2 +- .../server/wsf_js_widget/examples/custom/js_widget_custom.ecf | 2 +- draft/library/server/wsf_js_widget/examples/demo/demo.ecf | 2 +- draft/library/server/wsf_js_widget/wsf_js_widget-safe.ecf | 2 +- draft/library/server/wsf_js_widget/wsf_js_widget.ecf | 2 +- draft/src/gewf/gewf.ecf | 2 +- examples/_update_needed/filter/filter.ecf | 2 +- examples/debug/debug.ecf | 2 +- examples/desktop_app/desktop_app.ecf | 2 +- examples/form/form.ecf | 2 +- examples/obsolete/v0/filter/filter.ecf | 2 +- examples/obsolete/v0/restbucksCRUD/client/client.ecf | 2 +- examples/obsolete/v0/restbucksCRUD/restbucks.ecf | 2 +- examples/proxy/proxy.ecf | 2 +- examples/rest/restbucks_CRUD/client/client.ecf | 2 +- examples/rest/restbucks_CRUD/restbucks.ecf | 2 +- .../rest/restbucks_CRUD/support/simple_db/simple_db-safe.ecf | 2 +- examples/rest/restbucks_CRUD/support/simple_db/simple_db.ecf | 2 +- examples/simple/simple.ecf | 2 +- examples/simple_file/service_file.ecf | 2 +- examples/simple_ssl/simple_ssl.ecf | 2 +- .../step_2/hello/alternatives/launcher/hello_with_launcher.ecf | 2 +- .../step_2/hello/alternatives/message/hello_with_execute.ecf | 2 +- examples/tutorial/step_2/hello/hello.ecf | 2 +- examples/tutorial/step_3/hello/hello.ecf | 2 +- examples/tutorial/step_4/hello/hello.ecf | 2 +- examples/upload_image/upload_image.ecf | 2 +- examples/websocket/websocket_app.ecf | 2 +- library/network/http_client/http_client-safe.ecf | 2 +- library/network/http_client/http_client.ecf | 2 +- library/network/http_client/libcurl_http_client-safe.ecf | 2 +- library/network/http_client/libcurl_http_client.ecf | 2 +- library/network/http_client/net_http_client-safe.ecf | 2 +- library/network/http_client/net_http_client.ecf | 2 +- library/network/http_client/tests/test.ecf | 2 +- library/network/http_network/http_network-safe.ecf | 2 +- library/network/http_network/http_network.ecf | 2 +- library/network/protocol/content_negotiation/conneg-safe.ecf | 2 +- library/network/protocol/content_negotiation/conneg.ecf | 2 +- library/network/protocol/content_negotiation/test/test.ecf | 2 +- library/network/protocol/http/http-safe.ecf | 2 +- library/network/protocol/http/http.ecf | 2 +- library/network/protocol/http/tests/tests.ecf | 2 +- .../network/websocket/client/example/ws_client/ws_client.ecf | 2 +- library/network/websocket/client/web_socket_client-safe.ecf | 2 +- library/network/websocket/client/web_socket_client.ecf | 2 +- library/network/websocket/protocol/web_socket_protocol-safe.ecf | 2 +- library/network/websocket/protocol/web_socket_protocol.ecf | 2 +- .../example/echo_websocket_server/echo_websocket_server.ecf | 2 +- library/network/websocket/server/websocket_server-safe.ecf | 2 +- library/network/websocket/server/websocket_server.ecf | 2 +- .../process/notification_email/notification_email-safe.ecf | 2 +- .../runtime/process/notification_email/notification_email.ecf | 2 +- library/security/openid/consumer/demo/demo-safe.ecf | 2 +- library/security/openid/consumer/demo/demo.ecf | 2 +- library/security/openid/consumer/openid-safe.ecf | 2 +- library/security/openid/consumer/openid.ecf | 2 +- library/security/openid/consumer/tests/tests.ecf | 2 +- .../http_authorization/example/demo_basic_auth.ecf | 2 +- .../http_authorization/http_authorization-safe.ecf | 2 +- .../authentication/http_authorization/http_authorization.ecf | 2 +- .../authentication/http_authorization/testing/testing.ecf | 2 +- library/server/ewsgi/connectors/cgi/cgi-safe.ecf | 2 +- library/server/ewsgi/connectors/cgi/cgi.ecf | 2 +- library/server/ewsgi/connectors/libfcgi/libfcgi-safe.ecf | 2 +- library/server/ewsgi/connectors/libfcgi/libfcgi.ecf | 2 +- library/server/ewsgi/connectors/nino/nino-safe.ecf | 2 +- library/server/ewsgi/connectors/nino/nino.ecf | 2 +- library/server/ewsgi/connectors/null/null-safe.ecf | 2 +- library/server/ewsgi/connectors/null/null.ecf | 2 +- library/server/ewsgi/connectors/standalone/standalone-safe.ecf | 2 +- library/server/ewsgi/connectors/standalone/standalone.ecf | 2 +- library/server/ewsgi/connectors/standalone/test_standalone.ecf | 2 +- library/server/ewsgi/ewsgi-safe.ecf | 2 +- library/server/ewsgi/ewsgi.ecf | 2 +- library/server/ewsgi/ewsgi_spec-safe.ecf | 2 +- library/server/ewsgi/ewsgi_spec.ecf | 2 +- library/server/ewsgi/examples/hello_world/hello.ecf | 2 +- library/server/httpd/httpd-safe.ecf | 2 +- library/server/httpd/httpd.ecf | 2 +- library/server/libfcgi/libfcgi-safe.ecf | 2 +- library/server/libfcgi/libfcgi.ecf | 2 +- library/server/libfcgi/tests/eiffelweb.ecf | 2 +- .../obsolete/v0/ewsgi/connectors/libfcgi/libfcgi-safe.ecf | 2 +- library/server/obsolete/v0/ewsgi/connectors/libfcgi/libfcgi.ecf | 2 +- library/server/obsolete/v0/ewsgi/connectors/nino/nino-safe.ecf | 2 +- library/server/obsolete/v0/ewsgi/connectors/nino/nino.ecf | 2 +- library/server/obsolete/v0/ewsgi/ewsgi-safe.ecf | 2 +- library/server/obsolete/v0/ewsgi/ewsgi.ecf | 2 +- library/server/obsolete/v0/wsf/connector/libfcgi-safe.ecf | 2 +- library/server/obsolete/v0/wsf/connector/libfcgi.ecf | 2 +- library/server/obsolete/v0/wsf/connector/nino-safe.ecf | 2 +- library/server/obsolete/v0/wsf/connector/nino.ecf | 2 +- library/server/obsolete/v0/wsf/default/libfcgi-safe.ecf | 2 +- library/server/obsolete/v0/wsf/default/libfcgi.ecf | 2 +- library/server/obsolete/v0/wsf/default/nino-safe.ecf | 2 +- library/server/obsolete/v0/wsf/default/nino.ecf | 2 +- library/server/obsolete/v0/wsf/wsf-safe.ecf | 2 +- library/server/obsolete/v0/wsf/wsf.ecf | 2 +- library/server/obsolete/v0/wsf/wsf_extension-safe.ecf | 2 +- library/server/obsolete/v0/wsf/wsf_extension.ecf | 2 +- library/server/obsolete/v0/wsf/wsf_policy_driven-safe.ecf | 2 +- library/server/obsolete/v0/wsf/wsf_policy_driven.ecf | 2 +- library/server/obsolete/v0/wsf/wsf_router_context-safe.ecf | 2 +- library/server/obsolete/v0/wsf/wsf_router_context.ecf | 2 +- library/server/obsolete/v0/wsf/wsf_session-safe.ecf | 2 +- library/server/obsolete/v0/wsf/wsf_session.ecf | 2 +- library/server/obsolete/v0/wsf_html/wsf_html-safe.ecf | 2 +- library/server/obsolete/v0/wsf_html/wsf_html.ecf | 2 +- library/server/wsf/connector/all-safe.ecf | 2 +- library/server/wsf/connector/all.ecf | 2 +- library/server/wsf/connector/cgi-safe.ecf | 2 +- library/server/wsf/connector/cgi.ecf | 2 +- library/server/wsf/connector/libfcgi-safe.ecf | 2 +- library/server/wsf/connector/libfcgi.ecf | 2 +- library/server/wsf/connector/nino-safe.ecf | 2 +- library/server/wsf/connector/nino.ecf | 2 +- library/server/wsf/connector/openshift-safe.ecf | 2 +- library/server/wsf/connector/openshift.ecf | 2 +- library/server/wsf/connector/standalone-safe.ecf | 2 +- library/server/wsf/connector/standalone.ecf | 2 +- library/server/wsf/connector/standalone_websocket-safe.ecf | 2 +- library/server/wsf/connector/standalone_websocket.ecf | 2 +- library/server/wsf/default/cgi-safe.ecf | 2 +- library/server/wsf/default/cgi.ecf | 2 +- library/server/wsf/default/libfcgi-safe.ecf | 2 +- library/server/wsf/default/libfcgi.ecf | 2 +- library/server/wsf/default/nino-safe.ecf | 2 +- library/server/wsf/default/nino.ecf | 2 +- library/server/wsf/default/openshift-safe.ecf | 2 +- library/server/wsf/default/openshift.ecf | 2 +- library/server/wsf/default/standalone-safe.ecf | 2 +- library/server/wsf/default/standalone.ecf | 2 +- library/server/wsf/tests/echo/echo.ecf | 2 +- library/server/wsf/tests/tests.ecf | 2 +- library/server/wsf/wsf-safe.ecf | 2 +- library/server/wsf/wsf.ecf | 2 +- library/server/wsf/wsf_extension-safe.ecf | 2 +- library/server/wsf/wsf_extension.ecf | 2 +- library/server/wsf/wsf_policy_driven-safe.ecf | 2 +- library/server/wsf/wsf_policy_driven.ecf | 2 +- library/server/wsf/wsf_router_context-safe.ecf | 2 +- library/server/wsf/wsf_router_context.ecf | 2 +- library/server/wsf/wsf_session-safe.ecf | 2 +- library/server/wsf/wsf_session.ecf | 2 +- library/server/wsf_html/wsf_html-safe.ecf | 2 +- library/server/wsf_html/wsf_html.ecf | 2 +- library/server/wsf_proxy/wsf_proxy-safe.ecf | 2 +- library/server/wsf_proxy/wsf_proxy.ecf | 2 +- library/text/encoder/encoder-safe.ecf | 2 +- library/text/encoder/encoder.ecf | 2 +- library/text/encoder/tests/tests.ecf | 2 +- library/text/parser/feed/feed-safe.ecf | 2 +- library/text/parser/feed/feed.ecf | 2 +- library/text/parser/feed/tests/tests.ecf | 2 +- library/text/parser/uri_template/tests/tests.ecf | 2 +- library/text/parser/uri_template/uri_template-safe.ecf | 2 +- library/text/parser/uri_template/uri_template.ecf | 2 +- library/utility/general/error/error-safe.ecf | 2 +- library/utility/general/error/error.ecf | 2 +- library/utility/general/error/tests/tests.ecf | 2 +- precomp/wsf-mt.ecf | 2 +- precomp/wsf-scoop.ecf | 2 +- precomp/wsf.ecf | 2 +- tests/all-stable.ecf | 2 +- tests/all.ecf | 2 +- tests/dev/hello.ecf | 2 +- tests/server/wsf_html/test.ecf | 2 +- tools/estudio_wizard/console_wizard.ecf | 2 +- tools/estudio_wizard/lib/wizard/estudio_console_wizard.ecf | 2 +- tools/estudio_wizard/lib/wizard/estudio_gui_wizard.ecf | 2 +- tools/estudio_wizard/wizard.ecf | 2 +- 195 files changed, 195 insertions(+), 195 deletions(-) diff --git a/contrib/library/network/server/nino/example/SimpleWebServer/web_server-safe.ecf b/contrib/library/network/server/nino/example/SimpleWebServer/web_server-safe.ecf index 8dbe2853..8022eb5e 100644 --- a/contrib/library/network/server/nino/example/SimpleWebServer/web_server-safe.ecf +++ b/contrib/library/network/server/nino/example/SimpleWebServer/web_server-safe.ecf @@ -1,3 +1,3 @@ - + diff --git a/contrib/library/network/server/nino/example/SimpleWebServer/web_server.ecf b/contrib/library/network/server/nino/example/SimpleWebServer/web_server.ecf index 92def8ac..ecc2d674 100644 --- a/contrib/library/network/server/nino/example/SimpleWebServer/web_server.ecf +++ b/contrib/library/network/server/nino/example/SimpleWebServer/web_server.ecf @@ -1,5 +1,5 @@ - + diff --git a/contrib/library/network/server/nino/nino-safe.ecf b/contrib/library/network/server/nino/nino-safe.ecf index bf692a34..fd148e3f 100644 --- a/contrib/library/network/server/nino/nino-safe.ecf +++ b/contrib/library/network/server/nino/nino-safe.ecf @@ -1,3 +1,3 @@ - + diff --git a/contrib/library/network/server/nino/nino.ecf b/contrib/library/network/server/nino/nino.ecf index 105f5bd9..d73ad325 100644 --- a/contrib/library/network/server/nino/nino.ecf +++ b/contrib/library/network/server/nino/nino.ecf @@ -1,5 +1,5 @@ - + diff --git a/docs/workbook/basics/simple/simple.ecf b/docs/workbook/basics/simple/simple.ecf index 5b4bc4fa..866e34a2 100644 --- a/docs/workbook/basics/simple/simple.ecf +++ b/docs/workbook/basics/simple/simple.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/basics/simple_html/simple_html.ecf b/docs/workbook/basics/simple_html/simple_html.ecf index d07bcf49..c3bd2acb 100644 --- a/docs/workbook/basics/simple_html/simple_html.ecf +++ b/docs/workbook/basics/simple_html/simple_html.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/generating_response/exel/exel.ecf b/docs/workbook/generating_response/exel/exel.ecf index e45eb06b..5a7cdf05 100644 --- a/docs/workbook/generating_response/exel/exel.ecf +++ b/docs/workbook/generating_response/exel/exel.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/generating_response/headers/headers.ecf b/docs/workbook/generating_response/headers/headers.ecf index 6a00f9b3..8e75affb 100644 --- a/docs/workbook/generating_response/headers/headers.ecf +++ b/docs/workbook/generating_response/headers/headers.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/generating_response/search/search.ecf b/docs/workbook/generating_response/search/search.ecf index 77f3cf74..731f5bc6 100644 --- a/docs/workbook/generating_response/search/search.ecf +++ b/docs/workbook/generating_response/search/search.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/generating_response/status/status.ecf b/docs/workbook/generating_response/status/status.ecf index 31912fcf..d564cc35 100644 --- a/docs/workbook/generating_response/status/status.ecf +++ b/docs/workbook/generating_response/status/status.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/handling_cookies/example/example.ecf b/docs/workbook/handling_cookies/example/example.ecf index b1c27695..191d0296 100644 --- a/docs/workbook/handling_cookies/example/example.ecf +++ b/docs/workbook/handling_cookies/example/example.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/handling_request/form/get/form.ecf b/docs/workbook/handling_request/form/get/form.ecf index 43203dbb..d02d9332 100644 --- a/docs/workbook/handling_request/form/get/form.ecf +++ b/docs/workbook/handling_request/form/get/form.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/handling_request/form/post/form.ecf b/docs/workbook/handling_request/form/post/form.ecf index 8094d7f3..89e7be5f 100644 --- a/docs/workbook/handling_request/form/post/form.ecf +++ b/docs/workbook/handling_request/form/post/form.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/handling_request/headers/browser_name/browsers.ecf b/docs/workbook/handling_request/headers/browser_name/browsers.ecf index 5e7dbf77..2ed0d590 100644 --- a/docs/workbook/handling_request/headers/browser_name/browsers.ecf +++ b/docs/workbook/handling_request/headers/browser_name/browsers.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/handling_request/headers/cgi_variables/cgi_variables.ecf b/docs/workbook/handling_request/headers/cgi_variables/cgi_variables.ecf index bd0aa409..3e65e5bf 100644 --- a/docs/workbook/handling_request/headers/cgi_variables/cgi_variables.ecf +++ b/docs/workbook/handling_request/headers/cgi_variables/cgi_variables.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/handling_request/headers/header_fields/header_fields.ecf b/docs/workbook/handling_request/headers/header_fields/header_fields.ecf index d244682a..01a2657b 100644 --- a/docs/workbook/handling_request/headers/header_fields/header_fields.ecf +++ b/docs/workbook/handling_request/headers/header_fields/header_fields.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/docs/workbook/handling_request/upload_file/upload.ecf b/docs/workbook/handling_request/upload_file/upload.ecf index 4b449bd0..2009fa47 100644 --- a/docs/workbook/handling_request/upload_file/upload.ecf +++ b/docs/workbook/handling_request/upload_file/upload.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/draft/library/protocol/syndication/atom/atom-safe.ecf b/draft/library/protocol/syndication/atom/atom-safe.ecf index 3726ba1d..7df38e2e 100644 --- a/draft/library/protocol/syndication/atom/atom-safe.ecf +++ b/draft/library/protocol/syndication/atom/atom-safe.ecf @@ -1,3 +1,3 @@ - + diff --git a/draft/library/protocol/syndication/atom/atom.ecf b/draft/library/protocol/syndication/atom/atom.ecf index 7d743871..0ff4f7b0 100644 --- a/draft/library/protocol/syndication/atom/atom.ecf +++ b/draft/library/protocol/syndication/atom/atom.ecf @@ -1,5 +1,5 @@ - + diff --git a/draft/library/protocol/syndication/rss/rss-safe.ecf b/draft/library/protocol/syndication/rss/rss-safe.ecf index e4c7848b..9b7b63a9 100644 --- a/draft/library/protocol/syndication/rss/rss-safe.ecf +++ b/draft/library/protocol/syndication/rss/rss-safe.ecf @@ -1,3 +1,3 @@ - + diff --git a/draft/library/protocol/syndication/rss/rss.ecf b/draft/library/protocol/syndication/rss/rss.ecf index e6e69d9d..1af544b7 100644 --- a/draft/library/protocol/syndication/rss/rss.ecf +++ b/draft/library/protocol/syndication/rss/rss.ecf @@ -1,5 +1,5 @@ - + diff --git a/draft/library/security/oauth/oauth-safe.ecf b/draft/library/security/oauth/oauth-safe.ecf index a7962e2e..62eba3dd 100644 --- a/draft/library/security/oauth/oauth-safe.ecf +++ b/draft/library/security/oauth/oauth-safe.ecf @@ -1,3 +1,3 @@ - + diff --git a/draft/library/security/oauth/oauth.ecf b/draft/library/security/oauth/oauth.ecf index bf22e1d1..f0c07e64 100644 --- a/draft/library/security/oauth/oauth.ecf +++ b/draft/library/security/oauth/oauth.ecf @@ -1,5 +1,5 @@ - + diff --git a/draft/library/server/wsf_js_widget/examples/custom-template/js_widget_template.ecf b/draft/library/server/wsf_js_widget/examples/custom-template/js_widget_template.ecf index 66751cbc..b60ba32f 100644 --- a/draft/library/server/wsf_js_widget/examples/custom-template/js_widget_template.ecf +++ b/draft/library/server/wsf_js_widget/examples/custom-template/js_widget_template.ecf @@ -1,5 +1,5 @@ - + /.git$ diff --git a/draft/library/server/wsf_js_widget/examples/custom/js_widget_custom.ecf b/draft/library/server/wsf_js_widget/examples/custom/js_widget_custom.ecf index ff4c0b08..752a3a50 100644 --- a/draft/library/server/wsf_js_widget/examples/custom/js_widget_custom.ecf +++ b/draft/library/server/wsf_js_widget/examples/custom/js_widget_custom.ecf @@ -1,5 +1,5 @@ - + /.git$ diff --git a/draft/library/server/wsf_js_widget/examples/demo/demo.ecf b/draft/library/server/wsf_js_widget/examples/demo/demo.ecf index 91b6881a..986af383 100644 --- a/draft/library/server/wsf_js_widget/examples/demo/demo.ecf +++ b/draft/library/server/wsf_js_widget/examples/demo/demo.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/draft/library/server/wsf_js_widget/wsf_js_widget-safe.ecf b/draft/library/server/wsf_js_widget/wsf_js_widget-safe.ecf index be4a279a..efc5a4a2 100644 --- a/draft/library/server/wsf_js_widget/wsf_js_widget-safe.ecf +++ b/draft/library/server/wsf_js_widget/wsf_js_widget-safe.ecf @@ -1,3 +1,3 @@ - + diff --git a/draft/library/server/wsf_js_widget/wsf_js_widget.ecf b/draft/library/server/wsf_js_widget/wsf_js_widget.ecf index 0135c2a6..f2b206be 100644 --- a/draft/library/server/wsf_js_widget/wsf_js_widget.ecf +++ b/draft/library/server/wsf_js_widget/wsf_js_widget.ecf @@ -1,5 +1,5 @@ - + diff --git a/draft/src/gewf/gewf.ecf b/draft/src/gewf/gewf.ecf index e7c4c379..d432d72f 100644 --- a/draft/src/gewf/gewf.ecf +++ b/draft/src/gewf/gewf.ecf @@ -1,5 +1,5 @@ - + Generator for EWF project diff --git a/examples/_update_needed/filter/filter.ecf b/examples/_update_needed/filter/filter.ecf index 3252986c..a744002a 100644 --- a/examples/_update_needed/filter/filter.ecf +++ b/examples/_update_needed/filter/filter.ecf @@ -1,5 +1,5 @@ - + /EIFGENs$ diff --git a/examples/debug/debug.ecf b/examples/debug/debug.ecf index 05634457..3ae5670e 100644 --- a/examples/debug/debug.ecf +++ b/examples/debug/debug.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/examples/desktop_app/desktop_app.ecf b/examples/desktop_app/desktop_app.ecf index c26f5803..7ac9e546 100644 --- a/examples/desktop_app/desktop_app.ecf +++ b/examples/desktop_app/desktop_app.ecf @@ -1,5 +1,5 @@ - + Vision2+web browser widget+embedded web service This example demonstrates how to build a vision2 desktop application that embed a web browser accessing the service of an embedded web service. diff --git a/examples/form/form.ecf b/examples/form/form.ecf index fafd79bc..1c37da33 100644 --- a/examples/form/form.ecf +++ b/examples/form/form.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/examples/obsolete/v0/filter/filter.ecf b/examples/obsolete/v0/filter/filter.ecf index ad34cf65..5522c5e7 100644 --- a/examples/obsolete/v0/filter/filter.ecf +++ b/examples/obsolete/v0/filter/filter.ecf @@ -1,5 +1,5 @@ - + /EIFGENs$ diff --git a/examples/obsolete/v0/restbucksCRUD/client/client.ecf b/examples/obsolete/v0/restbucksCRUD/client/client.ecf index 586bfc0c..6f34e95e 100644 --- a/examples/obsolete/v0/restbucksCRUD/client/client.ecf +++ b/examples/obsolete/v0/restbucksCRUD/client/client.ecf @@ -1,5 +1,5 @@ - + diff --git a/examples/obsolete/v0/restbucksCRUD/restbucks.ecf b/examples/obsolete/v0/restbucksCRUD/restbucks.ecf index 0323cb41..486593f8 100644 --- a/examples/obsolete/v0/restbucksCRUD/restbucks.ecf +++ b/examples/obsolete/v0/restbucksCRUD/restbucks.ecf @@ -1,5 +1,5 @@ - + /EIFGENs$ diff --git a/examples/proxy/proxy.ecf b/examples/proxy/proxy.ecf index cb93b308..f19e6bb1 100644 --- a/examples/proxy/proxy.ecf +++ b/examples/proxy/proxy.ecf @@ -1,5 +1,5 @@ - + /.svn$ diff --git a/examples/rest/restbucks_CRUD/client/client.ecf b/examples/rest/restbucks_CRUD/client/client.ecf index e4b4caf8..add80d10 100644 --- a/examples/rest/restbucks_CRUD/client/client.ecf +++ b/examples/rest/restbucks_CRUD/client/client.ecf @@ -1,5 +1,5 @@ - + diff --git a/examples/rest/restbucks_CRUD/restbucks.ecf b/examples/rest/restbucks_CRUD/restbucks.ecf index ec1b5531..2e3dde34 100644 --- a/examples/rest/restbucks_CRUD/restbucks.ecf +++ b/examples/rest/restbucks_CRUD/restbucks.ecf @@ -1,5 +1,5 @@ - + /EIFGENs$ diff --git a/examples/rest/restbucks_CRUD/support/simple_db/simple_db-safe.ecf b/examples/rest/restbucks_CRUD/support/simple_db/simple_db-safe.ecf index 95bc741d..6f5f13b5 100644 --- a/examples/rest/restbucks_CRUD/support/simple_db/simple_db-safe.ecf +++ b/examples/rest/restbucks_CRUD/support/simple_db/simple_db-safe.ecf @@ -1,3 +1,3 @@ - + diff --git a/examples/rest/restbucks_CRUD/support/simple_db/simple_db.ecf b/examples/rest/restbucks_CRUD/support/simple_db/simple_db.ecf index c3035de5..dfab8053 100644 --- a/examples/rest/restbucks_CRUD/support/simple_db/simple_db.ecf +++ b/examples/rest/restbucks_CRUD/support/simple_db/simple_db.ecf @@ -1,5 +1,5 @@ - + + +- ++ + + + +- ++ + + + +diff --git a/library/server/libfcgi/libfcgi.ecf b/library/server/libfcgi/libfcgi.ecf +index 1b0dbdc..9216b61 100644 +--- a/library/server/libfcgi/libfcgi.ecf ++++ b/library/server/libfcgi/libfcgi.ecf +@@ -25,11 +25,11 @@ + + + +- ++ + + + +- ++ + + + +diff --git a/library/server/wsf/connector/standalone/wsf_standalone_service_launcher.e b/library/server/wsf/connector/standalone/wsf_standalone_service_launcher.e +index 006a23e..e416960 100644 +--- a/library/server/wsf/connector/standalone/wsf_standalone_service_launcher.e ++++ b/library/server/wsf/connector/standalone/wsf_standalone_service_launcher.e +@@ -2,14 +2,27 @@ note + description: "[ + Component to launch the service using the default connector + +- Eiffel Web httpd for this class ++ EiffelWeb httpd for this class + ++ The httpd default connector support options: ++ verbose: to display verbose output ++ port: numeric such as 8099 (or equivalent string as "8099") ++ base: base_url (very specific to standalone server) ++ ++ max_concurrent_connections: set one, for single threaded behavior ++ max_tcp_clients: max number of open tcp connection ++ ++ socket_timeout: connection timeout ++ socket_recv_timeout: read data timeout ++ ++ keep_alive_timeout: amount of time the server will wait for subsequent ++ requests on a persistent connection, ++ max_keep_alive_requests: number of requests allowed on a persistent connection, ++ ++ ssl_enabled: set to True for https support. ++ ssl_ca_crt: path to the certificat crt file (relevant when ssl_enabled is True) ++ ssl_ca_key: path to the certificat key file (relevant when ssl_enabled is True) + +- The httpd default connector support options: +- port: numeric such as 8099 (or equivalent string as "8099") +- base: base_url (very specific to standalone server) +- verbose: to display verbose output, useful for standalone connector +- force_single_threaded: use only one thread, useful for standalone connector + + check WSF_SERVICE_LAUNCHER for more documentation + ]" +@@ -25,6 +38,8 @@ inherit + launchable + end + ++ WGI_STANDALONE_HTTPD_LOGGER_CONSTANTS ++ + create + make, + make_and_launch +@@ -34,37 +49,77 @@ feature {NONE} -- Initialization + initialize + local + conn: like connector ++ s: READABLE_STRING_GENERAL + do + create on_launched_actions + create on_stopped_actions + +- port_number := 80 --| Default, but quite often, this port is already used ... ++ port_number := {WGI_STANDALONE_CONSTANTS}.default_http_server_port --| Default, but quite often, this port is already used ... ++ max_concurrent_connections := {WGI_STANDALONE_CONSTANTS}.default_max_concurrent_connections ++ max_tcp_clients := {WGI_STANDALONE_CONSTANTS}.default_max_tcp_clients ++ socket_timeout := {WGI_STANDALONE_CONSTANTS}.default_socket_timeout -- seconds ++ socket_recv_timeout := {WGI_STANDALONE_CONSTANTS}.default_socket_recv_timeout -- seconds ++ keep_alive_timeout := {WGI_STANDALONE_CONSTANTS}.default_keep_alive_timeout -- seconds. ++ max_keep_alive_requests := {WGI_STANDALONE_CONSTANTS}.default_max_keep_alive_requests ++ verbose := False ++ verbose_level := notice_level ++ + base_url := "" + + if attached options as opts then + if attached {READABLE_STRING_GENERAL} opts.option ("server_name") as l_server_name then + server_name := l_server_name.to_string_8 + end +- if attached {INTEGER} opts.option ("port") as l_port then +- port_number := l_port +- elseif +- attached {READABLE_STRING_GENERAL} opts.option ("port") as l_port_str and then +- l_port_str.is_integer +- then +- port_number := l_port_str.as_string_8.to_integer +- end + if attached {READABLE_STRING_GENERAL} opts.option ("base") as l_base_str then + base_url := l_base_str.as_string_8 + end +- if attached {BOOLEAN} opts.option ("force_single_threaded") as l_single_threaded then +- single_threaded := l_single_threaded +- elseif attached {READABLE_STRING_GENERAL} opts.option ("force_single_threaded") as l_single_threaded_str then +- single_threaded := l_single_threaded_str.as_lower.same_string ("true") ++ ++ verbose := opts.option_boolean_value ("verbose", verbose) ++ -- See `{HTTPD_REQUEST_HANDLER_I}.*_verbose_level` ++ ++ if opts.has_integer_option ("verbose_level") then ++ verbose_level := opts.option_integer_value ("verbose_level", verbose_level) ++ elseif attached {READABLE_STRING_GENERAL} opts.option ("verbose_level") as s_verbose_level then ++ verbose_level := 0 -- Reset ++ across ++ s_verbose_level.split ('+') as ic ++ loop ++ s := ic.item ++ if s.is_case_insensitive_equal ("alert") then ++ verbose_level := verbose_level | alert_level ++ elseif s.is_case_insensitive_equal ("critical") then ++ verbose_level := verbose_level | critical_level ++ elseif s.is_case_insensitive_equal ("error") then ++ verbose_level := verbose_level | error_level ++ elseif s.is_case_insensitive_equal ("warning") then ++ verbose_level := verbose_level | warning_level ++ elseif s.is_case_insensitive_equal ("notice") then ++ verbose_level := verbose_level | notice_level ++ elseif s.is_case_insensitive_equal ("information") then ++ verbose_level := verbose_level | information_level ++ elseif s.is_case_insensitive_equal ("debug") then ++ verbose_level := verbose_level | debug_level ++ else ++ end ++ end ++ end ++ port_number := opts.option_integer_value ("port", port_number) ++ ++ if opts.option_boolean_value ("force_single_threaded", False) then ++ force_single_threaded + end +- if attached {BOOLEAN} opts.option ("verbose") as l_verbose then +- verbose := l_verbose +- elseif attached {READABLE_STRING_GENERAL} opts.option ("verbose") as l_verbose_str then +- verbose := l_verbose_str.as_lower.same_string ("true") ++ max_concurrent_connections := opts.option_integer_value ("max_concurrent_connections", max_concurrent_connections) ++ max_tcp_clients := opts.option_integer_value ("max_tcp_clients", max_tcp_clients) ++ socket_timeout := opts.option_integer_value ("socket_timeout", socket_timeout) ++ socket_recv_timeout := opts.option_integer_value ("socket_recv_timeout", socket_recv_timeout) ++ keep_alive_timeout := opts.option_integer_value ("keep_alive_timeout", keep_alive_timeout) ++ max_keep_alive_requests := opts.option_integer_value ("max_keep_alive_requests", max_keep_alive_requests) ++ ++ if ++ opts.option_boolean_value ("ssl_enabled", ssl_enabled) and then ++ attached opts.option_string_32_value ("ssl_protocol", "tls_1_2") as ssl_prot ++ then ++ ssl_settings := [ssl_prot, opts.option_string_32_value ("ssl_ca_crt", Void), opts.option_string_32_value ("ssl_ca_key", Void)] + end + end + +@@ -76,18 +131,27 @@ feature {NONE} -- Initialization + update_configuration (conn.configuration) + end + ++ force_single_threaded ++ -- Set `single_threaded' to True. ++ do ++ max_concurrent_connections := 1 ++ end ++ + feature -- Execution + + update_configuration (cfg: like connector.configuration) + do +- if single_threaded then +- cfg.set_force_single_threaded (True) +- end + cfg.set_is_verbose (verbose) +- if attached server_name as l_server_name then +- cfg.set_http_server_name (l_server_name) +- end ++ cfg.set_verbose_level (verbose_level) ++ cfg.set_ssl_settings (ssl_settings) ++ cfg.set_http_server_name (server_name) + cfg.http_server_port := port_number ++ cfg.set_max_concurrent_connections (max_concurrent_connections) ++ cfg.set_max_tcp_clients (max_tcp_clients) ++ cfg.set_socket_timeout (socket_timeout) ++ cfg.set_socket_recv_timeout (socket_recv_timeout) ++ cfg.set_keep_alive_timeout (keep_alive_timeout) ++ cfg.set_max_keep_alive_requests (max_keep_alive_requests) + end + + launch +@@ -98,14 +162,20 @@ feature -- Execution + do + conn := connector + conn.set_base (base_url) +- debug ("nino") ++ debug ("ew_standalone") + if verbose then + io.error.put_string ("Launching standalone web server on port " + port_number.out) ++ if ssl_enabled then ++ io.error.put_string ("%N https://") ++ else ++ io.error.put_string ("%N http://") ++ end + if attached server_name as l_name then +- io.error.put_string ("%N http://" + l_name + ":" + port_number.out + "/" + base_url + "%N") ++ io.error.put_string (l_name) + else +- io.error.put_string ("%N http://localhost:" + port_number.out + "/" + base_url + "%N") ++ io.error.put_string ("localhost") + end ++ io.error.put_string (":" + port_number.out + "/" + base_url + "%N") + end + end + update_configuration (conn.configuration) +@@ -114,15 +184,15 @@ feature -- Execution + + feature -- Callback + +- on_launched_actions: ACTION_SEQUENCE [TUPLE [WGI_STANDALONE_CONNECTOR [G]]] ++ on_launched_actions: ACTION_SEQUENCE [TUPLE [like connector]] + -- Actions triggered when launched + +- on_stopped_actions: ACTION_SEQUENCE [TUPLE [WGI_STANDALONE_CONNECTOR [G]]] ++ on_stopped_actions: ACTION_SEQUENCE [TUPLE [like connector]] + -- Actions triggered when stopped + + feature {NONE} -- Implementation + +- on_launched (conn: WGI_STANDALONE_CONNECTOR [G]) ++ on_launched (conn: like connector) + do + on_launched_actions.call ([conn]) + end +@@ -134,8 +204,29 @@ feature {NONE} -- Implementation + base_url: READABLE_STRING_8 + + verbose: BOOLEAN ++ verbose_level: INTEGER ++ -- Help defining the verbosity. ++ -- The higher, the more output. ++ ++ ssl_settings: detachable TUPLE [protocol: READABLE_STRING_GENERAL; ca_crt, ca_key: detachable READABLE_STRING_GENERAL] ++ ++ ssl_enabled: BOOLEAN ++ -- Is secure server? i.e using SSL? ++ do ++ Result := attached ssl_settings as ssl and then attached ssl.protocol as prot and then not prot.is_whitespace ++ end ++ ++ max_concurrent_connections: INTEGER ++ max_tcp_clients: INTEGER ++ socket_timeout: INTEGER ++ socket_recv_timeout: INTEGER ++ keep_alive_timeout: INTEGER ++ max_keep_alive_requests: INTEGER + + single_threaded: BOOLEAN ++ do ++ Result := max_concurrent_connections = 0 ++ end + + feature -- Status report + +diff --git a/library/server/wsf/connector/standalone_websocket-safe.ecf b/library/server/wsf/connector/standalone_websocket-safe.ecf +new file mode 100644 +index 0000000..01484e5 +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket-safe.ecf +@@ -0,0 +1,25 @@ ++ ++ ++ ++ ++ ++ /EIFGENs$ ++ /\.git$ ++ /\.svn$ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/library/server/wsf/connector/standalone_websocket.ecf b/library/server/wsf/connector/standalone_websocket.ecf +new file mode 100644 +index 0000000..0783e77 +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket.ecf +@@ -0,0 +1,25 @@ ++ ++ ++ ++ ++ ++ /EIFGENs$ ++ /\.git$ ++ /\.svn$ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/library/server/wsf/connector/standalone_websocket/websocket/event/web_socket_event_i.e b/library/server/wsf/connector/standalone_websocket/websocket/event/web_socket_event_i.e +new file mode 100644 +index 0000000..9ad0fec +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket/websocket/event/web_socket_event_i.e +@@ -0,0 +1,137 @@ ++note ++ description: "[ ++ Websocket callback events for actions like opening and closing the connection, ++ sending and receiving messages, and listening. ++ ++ Define the websocket events: ++ - on_open ++ - on_binary ++ - on_text ++ - on_close ++ ++ note: the following features could also be redefined: ++ - on_pong ++ - on_ping ++ - on_unsupported ++ ]" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++deferred class ++ WEB_SOCKET_EVENT_I ++ ++inherit ++ WEB_SOCKET_CONSTANTS ++ ++ REFACTORING_HELPER ++ ++feature -- Web Socket Interface ++ ++ on_event (ws: WEB_SOCKET; a_message: detachable READABLE_STRING_8; a_opcode: INTEGER) ++ -- Called when a frame from the client has been receive ++ require ++ ws_attached: ws /= Void ++ ws_valid: ws.is_open_read and then ws.is_open_write ++ local ++ l_message: READABLE_STRING_8 ++ do ++ debug ("ws") ++ ws.log ("%Non_event (ws, a_message, " + opcode_name (a_opcode) + ")%N", {HTTPD_LOGGER_CONSTANTS}.debug_level) ++ end ++ if a_message = Void then ++ create {STRING} l_message.make_empty ++ else ++ l_message := a_message ++ end ++ ++ if a_opcode = Binary_frame then ++ on_binary (ws, l_message) ++ elseif a_opcode = Text_frame then ++ on_text (ws, l_message) ++ elseif a_opcode = Pong_frame then ++ on_pong (ws, l_message) ++ elseif a_opcode = Ping_frame then ++ on_ping (ws, l_message) ++ elseif a_opcode = Connection_close_frame then ++ on_connection_close (ws, "") ++ else ++ on_unsupported (ws, l_message, a_opcode) ++ end ++ end ++ ++feature -- Websocket events ++ ++ on_open (ws: WEB_SOCKET) ++ -- Called after handshake, indicates that a complete WebSocket connection has been established. ++ require ++ ws_attached: ws /= Void ++ ws_valid: ws.is_open_read and then ws.is_open_write ++ deferred ++ end ++ ++ on_binary (ws: WEB_SOCKET; a_message: READABLE_STRING_8) ++ require ++ ws_attached: ws /= Void ++ ws_valid: ws.is_open_read and then ws.is_open_write ++ deferred ++ end ++ ++ on_text (ws: WEB_SOCKET; a_message: READABLE_STRING_8) ++ require ++ ws_attached: ws /= Void ++ ws_valid: ws.is_open_read and then ws.is_open_write ++ deferred ++ end ++ ++ on_close (ws: detachable WEB_SOCKET) ++ -- Called after the WebSocket connection is closed. ++ deferred ++ end ++ ++feature -- Websocket events: implemented ++ ++ on_pong (ws: WEB_SOCKET; a_message: READABLE_STRING_8) ++ require ++ ws_attached: ws /= Void ++ ws_valid: ws.is_open_read and then ws.is_open_write ++ do ++ -- log ("Its a pong frame") ++ -- at first we ignore pong ++ -- FIXME: provide better explanation ++ end ++ ++ on_ping (ws: WEB_SOCKET; a_message: READABLE_STRING_8) ++ require ++ ws_attached: ws /= Void ++ ws_valid: ws.is_open_read and then ws.is_open_write ++ do ++ ws.send (Pong_frame, a_message) ++ end ++ ++ on_unsupported (ws: WEB_SOCKET; a_message: READABLE_STRING_8; a_opcode: INTEGER) ++ require ++ ws_attached: ws /= Void ++ ws_valid: ws.is_open_read and then ws.is_open_write ++ do ++ -- do nothing ++ end ++ ++ on_connection_close (ws: WEB_SOCKET; a_message: detachable READABLE_STRING_8) ++ require ++ ws_attached: ws /= Void ++ ws_valid: ws.is_open_read and then ws.is_open_write ++ do ++ ws.send (Connection_close_frame, "") ++ end ++ ++note ++ 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 ++ 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 +diff --git a/library/server/wsf/connector/standalone_websocket/websocket/event/web_socket_message_type.e b/library/server/wsf/connector/standalone_websocket/websocket/event/web_socket_message_type.e +new file mode 100644 +index 0000000..cd48af0 +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket/websocket/event/web_socket_message_type.e +@@ -0,0 +1,39 @@ ++note ++ description: "[ ++ A web socket message has an opcode specifying the type of the message payload. The ++ opcode consists of the last four bits in the first byte of the frame header. ++ ]" ++ date: "$Date$" ++ revision: "$Revision$" ++ EIS: "name=Data Frame", "src=http://tools.ietf.org/html/rfc6455#section-5.6", "protocol=uri" ++ EIS: "name=Control Frame", "src=http://tools.ietf.org/html/rfc6455#section-5.5", "protocol=uri" ++ ++class ++ WEB_SOCKET_MESSAGE_TYPE ++ ++feature -- Data Frames ++ ++ Text: INTEGER = 0x1 ++ -- The data type of the message is text. ++ ++ Binary: INTEGER = 0x2 ++ -- The data type of the message is binary. ++ ++feature -- Control Frames ++ ++ Close: INTEGER = 0x8 ++ -- The client or server is sending a closing ++ -- handshake to the server or client. ++ ++ Ping: INTEGER = 0x9 ++ -- The client or server sends a ping to the server or client. ++ ++ Pong: INTEGER = 0xA ++ -- The client or server sends a pong to the server or client. ++ ++feature -- Reserverd ++ ++ -- Opcodes 0x3-0x7 are reserved for further non-control frames yet to be ++ -- defined. ++ ++end +diff --git a/library/server/wsf/connector/standalone_websocket/websocket/protocol/web_socket_constants.e b/library/server/wsf/connector/standalone_websocket/websocket/protocol/web_socket_constants.e +new file mode 100644 +index 0000000..86e771d +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket/websocket/protocol/web_socket_constants.e +@@ -0,0 +1,203 @@ ++note ++ description: "Constants for WebSockets" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++class ++ WEB_SOCKET_CONSTANTS ++ ++feature -- Constants ++ ++ ++ HTTP_1_1: STRING = "HTTP/1.1 101 WebSocket Protocol Handshake" ++ ++ Upgrade_ws: STRING = "Upgrade: websocket" ++ ++ Connection_ws: STRING = "Connection: Upgrade" ++ ++ Sec_WebSocket_Origin: STRING = "Sec-WebSocket-Origin: " ++ ++ Sec_WebSocket_Protocol: STRING = "Sec-WebSocket-Protocol: " ++ ++ Sec_WebSocket_Location: STRING = "Sec-WebSocket-Location: " ++ ++ Sec_WebSocket_Version: STRING = "Sec-WebSocket-Version: " ++ ++ Sec_WebSocket_Extensions: STRING = "Sec-WebSocket-Extensions: " ++ ++ WebSocket_Origin: STRING = "WebSocket-Origin: " ++ ++ WebSocket_Protocol: STRING = "WebSocket-Protocol: " ++ ++ WebSocket_Location: STRING = "WebSocket-Location: " ++ ++ Origin: STRING = "Origin" ++ ++ Server: STRING = "EWSS" ++ ++ Sec_WebSocket_Key: STRING = "Sec-WebSocket-Key" ++ ++ Ws_scheme: STRING = "ws://" ++ ++ Wss_scheme: STRING = "wss://" ++ ++ Magic_guid: STRING = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" ++ ++ -- The handshake from the client looks as follows: ++ ++ -- GET /chat HTTP/1.1 ++ -- Host: server.example.com ++ -- Upgrade: websocket ++ -- Connection: Upgrade ++ -- Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== ++ -- Origin: http://example.com ++ -- Sec-WebSocket-Protocol: chat, superchat ++ -- Sec-WebSocket-Version: 13 ++ ++ -- The handshake from the server looks as follows: ++ ++ -- HTTP/1.1 101 Switching Protocols ++ -- Upgrade: websocket ++ -- Connection: Upgrade ++ -- Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= ++ -- Sec-WebSocket-Protocol: chat ++ ++feature -- Opcodes Standard actions ++ ++ --| Maybe we need an enum STANDARD_ACTIONS_OPCODES? ++ -- |Opcode | Meaning | Reference | ++ -- -+--------+-------------------------------------+-----------| ++ -- | 0 | Continuation Frame | RFC 6455 | ++ -- -+--------+-------------------------------------+-----------| ++ -- | 1 | Text Frame | RFC 6455 | ++ -- -+--------+-------------------------------------+-----------| ++ -- | 2 | Binary Frame | RFC 6455 | ++ -- -+--------+-------------------------------------+-----------| ++ -- | 8 | Connection Close Frame | RFC 6455 | ++ -- -+--------+-------------------------------------+-----------| ++ -- | 9 | Ping Frame | RFC 6455 | ++ -- -+--------+-------------------------------------+-----------| ++ -- | 10 | Pong Frame | RFC 6455 | ++ -- -+--------+-------------------------------------+-----------| ++ ++ Continuation_frame: INTEGER = 0 ++ ++ Text_frame: INTEGER = 1 ++ ++ Binary_frame: INTEGER = 2 ++ ++ Connection_close_frame: INTEGER = 8 ++ ++ Ping_frame: INTEGER = 9 ++ ++ Pong_frame: INTEGER = 10 ++ ++ is_control_frame (a_opcode: INTEGER): BOOLEAN ++ -- Is `a_opcode' a control frame? ++ do ++ inspect a_opcode ++ when Connection_close_frame, Ping_frame, Pong_frame then ++ Result := True ++ else ++ end ++ end ++ ++ opcode_name (a_opcode: INTEGER): STRING ++ do ++ inspect a_opcode ++ when Continuation_frame then Result := "Continuation" ++ when Text_frame then Result := "Text" ++ when Binary_frame then Result := "Binary" ++ when Connection_close_frame then Result := "Connection Close" ++ when Ping_frame then Result := "Ping" ++ when Pong_frame then Result := "Pong" ++ else ++ Result := "Unknown-Opcode" ++ end ++ Result := "0x" + a_opcode.to_hex_string + " " + Result ++ end ++ ++feature -- Close code numbers ++ ++ -- Maybe an ENUM CLOSE_CODES ++ ++ -- |Status Code | Meaning | Contact | Reference | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1000 | Normal Closure | hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1001 | Going Away | hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1002 | Protocol error | hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1003 | Unsupported Data| hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1004 | ---Reserved---- | hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1005 | No Status Rcvd | hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1006 | Abnormal Closure| hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1007 | Invalid frame | hybi@ietf.org | RFC 6455 | ++ -- | | payload data | | | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1008 | Policy Violation| hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1009 | Message Too Big | hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1010 | Mandatory Ext. | hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1011 | Internal Server | hybi@ietf.org | RFC 6455 | ++ -- | | Error | | | ++ -- -+------------+-----------------+---------------+-----------| ++ -- | 1015 | TLS handshake | hybi@ietf.org | RFC 6455 | ++ -- -+------------+-----------------+---------------+-----------| ++ ++ Normal_closure: INTEGER = 1000 ++ -- Indicates a normal closure, meaning that the purpose for ++ -- which the connection was established has been fulfilled. ++ ++ Going_away: INTEGER = 1001 ++ -- Indicates that an endpoint is "going away", such as a server ++ -- going down or a browser having navigated away from a page. ++ ++ Protocol_error: INTEGER = 1002 ++ -- Indicates that an endpoint is terminating the connection due ++ -- to a protocol error. ++ ++ Unsupported_data: INTEGER = 1003 ++ -- Indicates that an endpoint is terminating the connection ++ -- because it has received a type of data it cannot accept (e.g., an ++ -- endpoint that understands only text data MAY send this if it ++ -- receives a binary message). ++ ++ Invalid_data: INTEGER = 1007 ++ -- Indicates that an endpoint is terminating the connection ++ -- because it has received data within a message that was not ++ -- consistent with the type of the message (e.g., non-UTF-8 [RFC3629] ++ -- data within a text message). ++ ++ Policy_violation: INTEGER = 1008 ++ -- Indicates that an endpoint is terminating the connection ++ -- because it has received a message that violates its policy. This ++ -- is a generic status code that can be returned when there is no ++ -- other more suitable status code (e.g., 1003 or 1009) or if there ++ -- is a need to hide specific details about the policy. ++ ++ Message_too_large: INTEGER = 1009 ++ -- Indicates that an endpoint is terminating the connection ++ -- because it has received a message that is too big for it to ++ -- process. ++ ++ Extension_required: INTEGER = 1010 ++ -- Indicates that an endpoint (client) is terminating the ++ -- connection because it has expected the server to negotiate one or ++ -- more extension, but the server didn't return them in the response ++ -- message of the WebSocket handshake. ++ ++ Internal_error: INTEGER = 1011 ++ -- Indicates that a server is terminating the connection because ++ -- it encountered an unexpected condition that prevented it from ++ -- fulfilling the request. ++ ++ ++end +diff --git a/library/server/wsf/connector/standalone_websocket/websocket/protocol/web_socket_error_frame.e b/library/server/wsf/connector/standalone_websocket/websocket/protocol/web_socket_error_frame.e +new file mode 100644 +index 0000000..af9aa83 +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket/websocket/protocol/web_socket_error_frame.e +@@ -0,0 +1,35 @@ ++note ++ description: "Summary description for {WEB_SOCKET_ERROR_FRAME}." ++ author: "" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++class ++ WEB_SOCKET_ERROR_FRAME ++ ++create ++ make ++ ++feature {NONE} -- Initialization ++ ++ make (a_code: INTEGER; a_desc: like description) ++ do ++ code := a_code ++ description := a_desc ++ end ++ ++feature -- Access ++ ++ code: INTEGER ++ ++ description: READABLE_STRING_8 ++ ++feature -- Conversion ++ ++ string: STRING ++ do ++ create Result.make_from_string ("Error(" + code.out + "): " + description) ++ end ++ ++ ++end +diff --git a/library/server/wsf/connector/standalone_websocket/websocket/protocol/web_socket_frame.e b/library/server/wsf/connector/standalone_websocket/websocket/protocol/web_socket_frame.e +new file mode 100644 +index 0000000..3f3350a +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket/websocket/protocol/web_socket_frame.e +@@ -0,0 +1,437 @@ ++note ++ description: "[ ++ Summary description for {WEB_SOCKET_FRAME}. ++ See Base Framing Protocol: http://tools.ietf.org/html/rfc6455#section-5.2 ++ 0 1 2 3 ++ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++ +-+-+-+-+-------+-+-------------+-------------------------------+ ++ |F|R|R|R| opcode|M| Payload len | Extended payload length | ++ |I|S|S|S| (4) |A| (7) | (16/64) | ++ |N|V|V|V| |S| | (if payload len==126/127) | ++ | |1|2|3| |K| | | ++ +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + ++ | Extended payload length continued, if payload len == 127 | ++ + - - - - - - - - - - - - - - - +-------------------------------+ ++ | |Masking-key, if MASK set to 1 | ++ +-------------------------------+-------------------------------+ ++ | Masking-key (continued) | Payload Data | ++ +-------------------------------- - - - - - - - - - - - - - - - + ++ : Payload Data continued ... : ++ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ++ | Payload Data continued ... | ++ +---------------------------------------------------------------+ ++ ++ Check the `check_utf_8_validity_on_chop' if there is performance issue ++ with bigger data. ++ ]" ++ date: "$Date$" ++ revision: "$Revision$" ++ EIS: "name=Websocket RFC6455 section-5.2", "protocol=URI", "src=http://tools.ietf.org/html/rfc6455#section-5.2", "tag=rfc" ++ ++class ++ WEB_SOCKET_FRAME ++ ++inherit ++ ANY ++ ++ WEB_SOCKET_CONSTANTS ++ ++create ++ make, ++ make_as_injected_control ++ ++feature {NONE} -- Initialization ++ ++ make (a_opcode: INTEGER; flag_is_fin: BOOLEAN) ++ -- Create current frame with opcode `a_opcode' ++ -- and `a_fin' to indicate if this is the final fragment. ++ do ++ is_incomplete := False ++ opcode := a_opcode ++ is_fin := flag_is_fin ++ ++ inspect opcode ++ when ++ Continuation_frame, -- 0 ++ Text_frame, -- 1 ++ Binary_frame -- 2 ++ then ++ --| Supported opcode ++ when ++ Connection_close_frame, -- 8 ++ Ping_frame, -- 9 ++ Pong_frame -- 10 ++ then ++ --| Supported control opcode ++ -- All control frames MUST have a payload length of 125 bytes or less ++ -- and MUST NOT be fragmented. ++ if flag_is_fin then ++ -- So far it is valid. ++ else ++ report_error (Protocol_error, "Control frames MUST NOT be fragmented.") ++ end ++ else ++ report_error (Protocol_error, "Unknown opcode") ++ end ++ end ++ ++ make_as_injected_control (a_opcode: INTEGER; a_parent: WEB_SOCKET_FRAME) ++ require ++ parent_is_not_control_frame: not a_parent.is_control ++ a_opcode_is_control_frame: is_control_frame (a_opcode) ++ do ++ make (a_opcode, True) ++ parent := a_parent ++ a_parent.add_injected_control_frame (Current) ++ end ++ ++feature -- Access ++ ++ opcode: INTEGER ++ -- CONTINUOUS, TEXT, BINARY, PING, PONG, CLOSING ++ ++ is_fin: BOOLEAN ++ -- is the final fragment in a message? ++ ++ fragment_count: INTEGER ++ ++ payload_length: NATURAL_64 ++ payload_data: detachable STRING_8 ++ -- Maybe we need a buffer here. ++ ++ uncoded_payload_data: detachable STRING_32 ++ local ++ utf: UTF_CONVERTER ++ do ++ if attached payload_data as d then ++ Result := utf.utf_8_string_8_to_string_32 (d) ++ end ++ end ++ ++ error: detachable WEB_SOCKET_ERROR_FRAME ++ -- Describe the type of error ++ ++feature -- Access: injected control frames ++ ++ injected_control_frames: detachable LIST [WEB_SOCKET_FRAME] ++ ++ parent: detachable WEB_SOCKET_FRAME ++ -- If Current is injected, `parent' is the related fragmented frame ++ ++ is_injected_control: BOOLEAN ++ do ++ Result := parent /= Void ++ ensure ++ Result implies (is_control_frame (opcode)) ++ end ++ ++feature -- Operation ++ ++ update_fin (a_flag_is_fin: BOOLEAN) ++ do ++ is_fin := a_flag_is_fin ++ end ++ ++feature {WEB_SOCKET_FRAME} -- Change: injected control frames ++ ++ add_injected_control_frame (f: WEB_SOCKET_FRAME) ++ require ++ Current_is_not_control: not is_control ++ f_is_control_frame: f.is_control ++ parented_to_current: f.parent = Current ++ local ++ lst: like injected_control_frames ++ do ++ lst := injected_control_frames ++ if lst = Void then ++ create {ARRAYED_LIST [WEB_SOCKET_FRAME]} lst.make (1) ++ injected_control_frames := lst ++ end ++ lst.force (f) ++ ensure ++ parented_to_current: f.parent = Current ++ end ++ ++ remove_injected_control_frame (f: WEB_SOCKET_FRAME) ++ require ++ Current_is_not_control: not is_control ++ f_is_control_frame: f.is_control ++ parented_to_current: f.parent = Current ++ local ++ lst: like injected_control_frames ++ do ++ lst := injected_control_frames ++ if lst /= Void then ++ lst.prune (f) ++ if lst.is_empty then ++ injected_control_frames := Void ++ end ++ end ++ end ++ ++feature -- Query ++ ++ is_binary: BOOLEAN ++ do ++ Result := opcode = binary_frame ++ end ++ ++ is_text: BOOLEAN ++ do ++ Result := opcode = text_frame ++ end ++ ++ is_continuation: BOOLEAN ++ do ++ Result := opcode = continuation_frame ++ end ++ ++ is_connection_close: BOOLEAN ++ do ++ Result := opcode = connection_close_frame ++ end ++ ++ is_control: BOOLEAN ++ do ++ inspect opcode ++ when connection_close_frame, Ping_frame, Pong_frame then ++ Result := True ++ else ++ end ++ end ++ ++ is_ping: BOOLEAN ++ do ++ Result := opcode = ping_frame ++ end ++ ++ is_pong: BOOLEAN ++ do ++ Result := opcode = pong_frame ++ end ++ ++feature -- Status report ++ ++ is_valid: BOOLEAN ++ do ++ Result := not has_error ++ end ++ ++ is_incomplete: BOOLEAN ++ ++ has_error: BOOLEAN ++ do ++ Result := error /= Void ++ end ++ ++feature -- Change ++ ++ increment_fragment_count ++ do ++ fragment_count := fragment_count + 1 ++ end ++ ++ check_utf_8_validity_on_chop: BOOLEAN = False ++ -- True: check for each chop ++ -- False: check only for each fragment ++ --| see autobahntestsuite #6.4.3 and #6.4.4 ++ ++ append_payload_data_chop (a_data: STRING_8; a_len: INTEGER; a_flag_chop_complete: BOOLEAN) ++ do ++ if a_flag_chop_complete then ++ increment_fragment_count ++ end ++ if attached payload_data as l_payload_data then ++ l_payload_data.append (a_data) ++ else ++ payload_data := a_data ++ end ++ payload_length := payload_length + a_len.to_natural_64 ++ ++ if is_text then ++ if is_fin and a_flag_chop_complete then ++ -- Check the whole message is a valid UTF-8 string ++ if attached payload_data as d then ++ if not is_valid_utf_8_string (d) then ++ report_error (invalid_data, "The text message is not a valid UTF-8 text!") ++ end ++ else ++ -- empty payload?? ++ end ++ elseif check_utf_8_validity_on_chop or else a_flag_chop_complete then ++ -- Check the payload data as utf-8 stream (may be incomplete at this point) ++ if not is_valid_text_payload_stream then ++ report_error (invalid_data, "This is not a valid UTF-8 stream!") ++ -- is_valid implies the connection will be closed! ++ end ++ end ++ end ++ end ++ ++ report_error (a_code: INTEGER; a_description: READABLE_STRING_8) ++ require ++ not has_error ++ do ++ create error.make (a_code, a_description) ++ ensure ++ has_error: has_error ++ is_not_valid: not is_valid ++ end ++ ++feature {NONE} -- Helper ++ ++ last_utf_8_stream_validation_position: INTEGER ++ -- In relation with `is_valid_utf_8 (.., a_is_stream=True)' ++ ++ is_valid_text_payload_stream: BOOLEAN ++ require ++ is_text_frame: is_text ++ do ++ if attached payload_data as s then ++ Result := is_valid_utf_8 (s, not is_fin) ++ end ++ end ++ ++ is_valid_utf_8_string (s: READABLE_STRING_8): BOOLEAN ++ do ++ Result := is_valid_utf_8 (s, False) ++-- and (create {UTF_CONVERTER}).is_valid_utf_8_string_8 (s) ++ end ++ ++ is_valid_utf_8 (s: READABLE_STRING_8; a_is_stream: BOOLEAN): BOOLEAN ++ -- UTF-8 validity checker. ++ note ++ EIS: "name=UTF-8 RFC3629", "protocol=URI", "src=https://tools.ietf.org/html/rfc3629", "tag=rfc" ++ require ++ is_text_frame: is_text ++ local ++ i: like {STRING_8}.count ++ n: like {STRING_8}.count ++ c,c2,c3,c4,w: NATURAL_32 ++ l_is_incomplete_stream: BOOLEAN ++ do ++ Result := True ++ -- Following code also check that codepoint is between 0 and 0x10FFFF ++ -- (as expected by spec, and tested by autobahn ws testsuite) ++ from ++ if a_is_stream then ++ i := last_utf_8_stream_validation_position -- to avoid recomputing from the beginning each time. ++ else ++ i := 0 ++ end ++ n := s.count ++ until ++ i >= n or not Result ++ loop ++ i := i + 1 ++ c := s.code (i) ++ if c <= 0x7F then ++ -- 0xxxxxxx ++ w := c ++ elseif c <= 0xC1 then ++ -- The octet values C0, C1, F5 to FF never appear. ++ --| case 0xC0 and 0xC1 ++ Result := False ++ elseif (c & 0xE0) = 0xC0 then ++ -- 110xxxxx 10xxxxxx ++ i := i + 1 ++ if i <= n then ++ c2 := s.code (i) ++ if ++ (c2 & 0xC0) = 0x80 ++ then ++ w := ((c & 0x1F) |<< 6) ++ | (c2 & 0x3F) ++ Result := 0x80 <= w and w <= 0x7FF ++ else ++ Result := False ++ end ++ else ++ l_is_incomplete_stream := True ++ end ++ elseif (c & 0xF0) = 0xE0 then ++ -- 1110xxxx 10xxxxxx 10xxxxxx ++ i := i + 2 ++ if i <= n then ++ c2 := s.code (i - 1) ++ c3 := s.code (i) ++ if ++ (c2 & 0xC0) = 0x80 and ++ (c3 & 0xC0) = 0x80 ++ then ++ w := ((c & 0xF) |<< 12) ++ | ((c2 & 0x3F) |<< 6) ++ | (c3 & 0x3F) ++ if 0x800 <= w and w <= 0xFFFF then ++ if 0xD800 <= w and w <= 0xDFFF then ++ -- The definition of UTF-8 prohibits encoding character numbers between U+D800 and U+DFFF ++ Result := False ++ end ++ else ++ Result := False ++ end ++ else ++ Result := False ++ end ++ else ++ if i - 1 <= n then ++ Result := (s.code (i - 1) & 0xC0) = 0x80 ++ end ++ l_is_incomplete_stream := True ++ end ++ elseif (c & 0xF8) = 0xF0 then -- 0001 0000-0010 FFFF ++ -- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx ++ if 0xF5 <= c and c <= 0xFF then ++ -- The octet values C0, C1, F5 to FF never appear. ++ Result := False ++ else ++ i := i + 3 ++ if i <= n then ++ c2 := s.code (i - 2) ++ c3 := s.code (i - 1) ++ c4 := s.code (i) ++ if ++ (c2 & 0xC0) = 0x80 and ++ (c3 & 0xC0) = 0x80 and ++ (c4 & 0xC0) = 0x80 ++ then ++ w := ((c & 0x7) |<< 18) | ++ ((c2 & 0x3F) |<< 12) | ++ ((c3 & 0x3F) |<< 6) | ++ (c4 & 0x3F) ++ Result := 0x1_0000 <= w and w <= 0x10_FFFF ++ else ++ Result := False ++ end ++ else ++ if i - 2 <= n then ++ c2 := s.code (i - 2) ++ Result := (c2 & 0xC0) = 0x80 ++ if Result then ++ if c = 0xF4 and c2 >= 0x90 then ++ --| any byte 10xxxxxx (i.e >= 0x80) that would come after, ++ -- will result in out of range code point ++ -- indeed 0xF4 0x90 0x80 0x80 = 0x1100 0000 > 0x10_FFFF ++ Result := False ++ elseif i - 1 <= n then ++ Result := (s.code (i - 1) & 0xC0) = 0x80 ++ end ++ end ++ end ++ l_is_incomplete_stream := True ++ end ++ end ++ else ++ -- Invalid byte in UTF-8 ++ Result := False ++ end ++ if Result then ++ if l_is_incomplete_stream then ++ Result := a_is_stream ++ elseif a_is_stream then ++ last_utf_8_stream_validation_position := i ++ end ++ end ++ end ++ end ++end +diff --git a/library/server/wsf/connector/standalone_websocket/websocket/web_socket.e b/library/server/wsf/connector/standalone_websocket/websocket/web_socket.e +new file mode 100644 +index 0000000..e301f25 +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket/websocket/web_socket.e +@@ -0,0 +1,805 @@ ++note ++ description: "[ ++ Object representing the websocket connection. ++ It contains the `request` and `response`, and more important the `socket` itself. ++ ]" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++class ++ WEB_SOCKET ++ ++inherit ++ WGI_STANDALONE_CONNECTOR_EXPORTER ++ ++ WSF_RESPONSE_EXPORTER ++ ++ WGI_EXPORTER ++ ++ HTTPD_LOGGER_CONSTANTS ++ ++ WEB_SOCKET_CONSTANTS ++ ++ SHARED_BASE64 ++ ++create ++ make ++ ++feature {NONE} -- Initialization ++ ++ make (req: WSF_REQUEST; res: WSF_RESPONSE) ++ do ++ request := req ++ response := res ++ is_verbose := False ++ verbose_level := notice_level ++ ++ if ++ attached {WGI_STANDALONE_INPUT_STREAM} req.input as r_input ++ then ++ socket := r_input.source ++ else ++ create socket.make_empty ++ check has_socket: False end ++ end ++ end ++ ++feature -- Access ++ ++ socket: HTTPD_STREAM_SOCKET ++ -- Underlying connected socket. ++ ++feature {NONE} -- Access ++ ++ request: WSF_REQUEST ++ -- Associated request. ++ ++ response: WSF_RESPONSE ++ -- Associated response stream. ++ ++feature -- Access ++ ++ is_websocket: BOOLEAN ++ -- Does `open_ws_handshake' detect valid websocket upgrade handshake? ++ ++feature -- Settings ++ ++ is_verbose: BOOLEAN ++ -- Output verbose log messages? ++ ++ verbose_level: INTEGER ++ -- Level of verbosity. ++ ++feature -- Status ++ ++ has_error: BOOLEAN ++ -- Error occured during processing? ++ ++feature -- Socket status ++ ++ is_ready_for_reading: BOOLEAN ++ -- Is `socket' ready for reading? ++ --| at this point, socket should be set to blocking. ++ do ++ Result := socket.ready_for_reading ++ end ++ ++ is_open_read: BOOLEAN ++ -- Is `socket' open for reading? ++ do ++ Result := socket.is_open_read ++ end ++ ++ is_open_write: BOOLEAN ++ -- Is `socket' open for writing? ++ do ++ Result := socket.is_open_write ++ end ++ ++ socket_descriptor: INTEGER ++ -- Descriptor for current `socket'. ++ do ++ Result := socket.descriptor ++ end ++ ++feature -- Element change ++ ++ set_is_verbose (b: BOOLEAN) ++ do ++ is_verbose := b ++ end ++ ++ set_verbose_level (lev: INTEGER) ++ do ++ verbose_level := lev ++ end ++ ++feature -- Basic operation ++ ++ put_error (a_message: READABLE_STRING_8) ++ do ++ response.put_error (a_message) ++ end ++ ++ log (m: READABLE_STRING_8; lev: INTEGER) ++ -- Log `m' in the error channel, i.e stderr for standalone. ++ do ++ if is_verbose then ++ put_error (m) ++ end ++ end ++ ++feature -- Basic Operation ++ ++ open_ws_handshake ++ -- The opening handshake is intended to be compatible with HTTP-based ++ -- server-side software and intermediaries, so that a single port can be ++ -- used by both HTTP clients alking to that server and WebSocket ++ -- clients talking to that server. To this end, the WebSocket client's ++ -- handshake is an HTTP Upgrade request: ++ ++ -- GET /chat HTTP/1.1 ++ -- Host: server.example.com ++ -- Upgrade: websocket ++ -- Connection: Upgrade ++ -- Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== ++ -- Origin: http://example.com ++ -- Sec-WebSocket-Protocol: chat, superchat ++ -- Sec-WebSocket-Version: 13 ++ local ++ l_sha1: SHA1 ++ l_key : STRING ++ req: like request ++ res: like response ++ do ++ -- Reset values. ++ is_websocket := False ++ has_error := False ++ ++ -- Local cache. ++ req := request ++ res := response ++ ++ -- Reading client's opening GT ++ ++ -- TODO extract to a validator handshake or something like that. ++ if is_verbose then ++ log ("%NReceive <====================", debug_level) ++ if attached req.raw_header_data as rhd then ++ log (rhd, debug_level) ++ end ++ end ++ if ++ req.is_get_request_method and then -- MUST be GET request! ++ attached req.meta_string_variable ("HTTP_UPGRADE") as l_upgrade_key and then ++ l_upgrade_key.is_case_insensitive_equal_general ("websocket") -- Upgrade header must be present with value websocket ++ then ++ is_websocket := True ++ socket.set_blocking ++ if ++ attached req.meta_string_variable ("HTTP_SEC_WEBSOCKET_KEY") as l_ws_key and then -- Sec-websocket-key must be present ++ attached req.meta_string_variable ("HTTP_CONNECTION") as l_connection_key and then -- Connection header must be present with value Upgrade ++ l_connection_key.has_substring ("Upgrade") and then ++ attached req.meta_string_variable ("HTTP_SEC_WEBSOCKET_VERSION") as l_version_key and then -- Version header must be present with value 13 ++ l_version_key.is_case_insensitive_equal ("13") and then ++ attached req.http_host -- Host header must be present ++ then ++ if is_verbose then ++ log ("key " + l_ws_key, debug_level) ++ end ++ -- Sending the server's opening handshake ++ create l_sha1.make ++ l_sha1.update_from_string (l_ws_key + magic_guid) ++ l_key := Base64_encoder.encoded_string (digest (l_sha1)) ++ res.header.add_header_key_value ("Upgrade", "websocket") ++ res.header.add_header_key_value ("Connection", "Upgrade") ++ res.header.add_header_key_value ("Sec-WebSocket-Accept", l_key) ++ ++ if is_verbose then ++ log ("%N================> Send Handshake", debug_level) ++ if attached {HTTP_HEADER} res.header as h then ++ log (h.string, debug_level) ++ end ++ end ++ res.set_status_code_with_reason_phrase (101, "Switching Protocols") ++ res.wgi_response.push ++ else ++ has_error := True ++ if is_verbose then ++ log ("Error (opening_handshake)!!!", debug_level) ++ end ++ -- If we cannot complete the handshake, then the server MUST stop processing the client's handshake and return an HTTP response with an ++ -- appropriate error code (such as 400 Bad Request). ++ res.set_status_code_with_reason_phrase (400, "Bad Request") ++ end ++ else ++ is_websocket := False ++ end ++ end ++ ++feature -- Response! ++ ++ send (a_opcode:INTEGER; a_message: READABLE_STRING_8) ++ local ++ i: INTEGER ++ l_chunk_size: INTEGER ++ l_chunk: READABLE_STRING_8 ++ l_header_message: STRING ++ l_message_count: INTEGER ++ n: NATURAL_64 ++ retried: BOOLEAN ++ do ++ debug ("ws") ++ print (">>do_send (..., "+ opcode_name (a_opcode) +", ..)%N") ++ end ++ if not retried then ++ create l_header_message.make_empty ++ l_header_message.append_code ((0x80 | a_opcode).to_natural_32) ++ l_message_count := a_message.count ++ n := l_message_count.to_natural_64 ++ if l_message_count > 0xffff then ++ --! Improve. this code needs to be checked. ++ l_header_message.append_code ((0 | 127).to_natural_32) ++ l_header_message.append_character ((n |>> 56).to_character_8) ++ l_header_message.append_character ((n |>> 48).to_character_8) ++ l_header_message.append_character ((n |>> 40).to_character_8) ++ l_header_message.append_character ((n |>> 32).to_character_8) ++ l_header_message.append_character ((n |>> 24).to_character_8) ++ l_header_message.append_character ((n |>> 16).to_character_8) ++ l_header_message.append_character ((n |>> 8).to_character_8) ++ l_header_message.append_character ( n.to_character_8) ++ elseif l_message_count > 125 then ++ l_header_message.append_code ((0 | 126).to_natural_32) ++ l_header_message.append_code ((n |>> 8).as_natural_32) ++ l_header_message.append_character (n.to_character_8) ++ else ++ l_header_message.append_code (n.as_natural_32) ++ end ++ socket.put_string (l_header_message) ++ ++ l_chunk_size := 16_384 -- 16K TODO: see if we should make it customizable. ++ if l_message_count < l_chunk_size then ++ socket.put_string (a_message) ++ else ++ from ++ i := 0 ++ until ++ l_chunk_size = 0 ++ loop ++ debug ("ws") ++ print ("Sending chunk " + (i + 1).out + " -> " + (i + l_chunk_size).out +" / " + l_message_count.out + "%N") ++ end ++ l_chunk := a_message.substring (i + 1, l_message_count.min (i + l_chunk_size)) ++ socket.put_string (l_chunk) ++ if l_chunk.count < l_chunk_size then ++ l_chunk_size := 0 ++ end ++ i := i + l_chunk_size ++ end ++ debug ("ws") ++ print ("Sending chunk done%N") ++ end ++ end ++ else ++ -- FIXME: what should be done on rescue? ++ end ++ rescue ++ retried := True ++ io.put_string ("Internal error in " + generator + ".do_send (conn, a_opcode=" + a_opcode.out + ", a_message) !%N") ++ retry ++ end ++ ++ next_frame: detachable WEB_SOCKET_FRAME ++ -- TODO Binary messages ++ -- Handle error responses in a better way. ++ -- IDEA: ++ -- class FRAME ++ -- is_fin: BOOLEAN ++ -- opcode: WEB_SOCKET_STATUS_CODE (TEXT, BINARY, CLOSE, CONTINUE,PING, PONG) ++ -- data/payload ++ -- status_code: #see Status Codes http://tools.ietf.org/html/rfc6455#section-7.3 ++ -- has_error ++ -- ++ -- See Base Framing Protocol: http://tools.ietf.org/html/rfc6455#section-5.2 ++ -- 0 1 2 3 ++ -- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++ -- +-+-+-+-+-------+-+-------------+-------------------------------+ ++ -- |F|R|R|R| opcode|M| Payload len | Extended payload length | ++ -- |I|S|S|S| (4) |A| (7) | (16/64) | ++ -- |N|V|V|V| |S| | (if payload len==126/127) | ++ -- | |1|2|3| |K| | | ++ -- +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + ++ -- | Extended payload length continued, if payload len == 127 | ++ -- + - - - - - - - - - - - - - - - +-------------------------------+ ++ -- | |Masking-key, if MASK set to 1 | ++ -- +-------------------------------+-------------------------------+ ++ -- | Masking-key (continued) | Payload Data | ++ -- +-------------------------------- - - - - - - - - - - - - - - - + ++ -- : Payload Data continued ... : ++ -- + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ++ -- | Payload Data continued ... | ++ -- +---------------------------------------------------------------+ ++ note ++ EIS: "name=WebSocket RFC", "protocol=URI", "src=http://tools.ietf.org/html/rfc6455#section-5.2" ++ require ++ socket_in_blocking_mode: socket.is_blocking ++ local ++ l_socket: like socket ++ l_opcode: INTEGER ++ l_len: INTEGER ++ l_remaining_len: INTEGER ++ l_payload_len: NATURAL_64 ++ l_masking_key: detachable READABLE_STRING_8 ++ l_chunk: STRING ++ l_rsv: BOOLEAN ++ l_fin: BOOLEAN ++ l_has_mask: BOOLEAN ++ l_chunk_size: INTEGER ++ l_byte: INTEGER ++ l_fetch_count: INTEGER ++ l_bytes_read: INTEGER ++ s: STRING ++ is_data_frame_ok: BOOLEAN -- Is the last process data framing ok? ++ retried: BOOLEAN ++ do ++ if not retried then ++ l_socket := socket ++ debug ("ws") ++ print ("next_frame:%N") ++ end ++ from ++ is_data_frame_ok := True ++ until ++ l_fin or not is_data_frame_ok ++ loop ++ -- multi-frames or continue is only valid for Binary or Text ++ s := next_bytes (l_socket, 1) ++ if s.is_empty then ++ is_data_frame_ok := False ++ debug ("ws") ++ print ("[ERROR] incomplete_data!%N") ++ end ++ else ++ l_byte := s [1].code ++ debug ("ws") ++ print (" fin,rsv(3),opcode(4)=") ++ print (to_byte_representation (l_byte)) ++ print ("%N") ++ end ++ l_fin := l_byte & (0b10000000) /= 0 ++ l_rsv := l_byte & (0b01110000) = 0 ++ l_opcode := l_byte & 0b00001111 ++ if Result /= Void then ++ if l_opcode = Result.opcode then ++ -- should not occur in multi-fragment frame! ++ create Result.make (l_opcode, l_fin) ++ Result.report_error (protocol_error, "Unexpected injected frame") ++ elseif l_opcode = continuation_frame then ++ -- Expected ++ Result.update_fin (l_fin) ++ elseif is_control_frame (l_opcode) then ++ -- Control frames (see Section 5.5) MAY be injected in the middle of ++ -- a fragmented message. Control frames themselves MUST NOT be fragmented. ++ -- if the l_opcode is a control frame then there is an error!!! ++ -- CLOSE, PING, PONG ++ create Result.make_as_injected_control (l_opcode, Result) ++ else ++ -- should not occur in multi-fragment frame! ++ create Result.make (l_opcode, l_fin) ++ Result.report_error (protocol_error, "Unexpected frame") ++ end ++ else ++ create Result.make (l_opcode, l_fin) ++ if Result.is_continuation then ++ -- Continuation frame is not expected without parent frame! ++ Result.report_error (protocol_error, "There is no message to continue!") ++ end ++ end ++ if Result.is_valid then ++ --| valid frame/fragment ++ if is_verbose then ++ log ("+ frame " + opcode_name (l_opcode) + " (fin=" + l_fin.out + ")", debug_level) ++ end ++ ++ -- rsv validation ++ if not l_rsv then ++ -- RSV1, RSV2, RSV3: 1 bit each ++ ++ -- MUST be 0 unless an extension is negotiated that defines meanings ++ -- for non-zero values. If a nonzero value is received and none of ++ -- the negotiated extensions defines the meaning of such a nonzero ++ -- value, the receiving endpoint MUST _Fail the WebSocket ++ -- Connection_ ++ ++ -- FIXME: add support for extension ? ++ Result.report_error (protocol_error, "RSV values MUST be 0 unless an extension is negotiated that defines meanings for non-zero values") ++ end ++ else ++ if is_verbose then ++ log ("+ INVALID frame " + opcode_name (l_opcode) + " (fin=" + l_fin.out + ")", debug_level) ++ end ++ end ++ ++ -- At the moment only TEXT, (pending Binary) ++ if Result.is_valid then ++ if Result.is_text or Result.is_binary or Result.is_control then ++ -- Reading next byte (mask+payload_len) ++ s := next_bytes (l_socket, 1) ++ if s.is_empty then ++ Result.report_error (invalid_data, "Incomplete data for mask and payload len") ++ else ++ l_byte := s [1].code ++ debug ("ws") ++ print (" mask,payload_len(7)=") ++ print (to_byte_representation (l_byte)) ++ io.put_new_line ++ end ++ l_has_mask := l_byte & (0b10000000) /= 0 -- MASK ++ l_len := l_byte & 0b01111111 -- 7bits ++ ++ debug ("ws") ++ print (" payload_len=" + l_len.out) ++ io.put_new_line ++ end ++ if Result.is_control and then l_len > 125 then ++ -- All control frames MUST have a payload length of 125 bytes or less ++ -- and MUST NOT be fragmented. ++ Result.report_error (protocol_error, "Control frame MUST have a payload length of 125 bytes or less") ++ elseif l_len = 127 then -- TODO proof of concept read 8 bytes. ++ -- the following 8 bytes interpreted as a 64-bit unsigned integer ++ -- (the most significant bit MUST be 0) are the payload length. ++ -- Multibyte length quantities are expressed in network byte order. ++ s := next_bytes (l_socket, 8) -- 64 bits ++ debug ("ws") ++ print (" extended payload length=" + string_to_byte_representation (s)) ++ io.put_new_line ++ end ++ if s.count < 8 then ++ Result.report_error (Invalid_data, "Incomplete data for 64 bit Extended payload length") ++ else ++ l_payload_len := s [8].natural_32_code.to_natural_64 ++ l_payload_len := l_payload_len | (s [7].natural_32_code.to_natural_64 |<< 8) ++ l_payload_len := l_payload_len | (s [6].natural_32_code.to_natural_64 |<< 16) ++ l_payload_len := l_payload_len | (s [5].natural_32_code.to_natural_64 |<< 24) ++ l_payload_len := l_payload_len | (s [4].natural_32_code.to_natural_64 |<< 32) ++ l_payload_len := l_payload_len | (s [3].natural_32_code.to_natural_64 |<< 40) ++ l_payload_len := l_payload_len | (s [2].natural_32_code.to_natural_64 |<< 48) ++ l_payload_len := l_payload_len | (s [1].natural_32_code.to_natural_64 |<< 56) ++ end ++ elseif l_len = 126 then ++ s := next_bytes (l_socket, 2) -- 16 bits ++ debug ("ws") ++ print (" extended payload length bits=" + string_to_byte_representation (s)) ++ io.put_new_line ++ end ++ if s.count < 2 then ++ Result.report_error (Invalid_data, "Incomplete data for 16 bit Extended payload length") ++ else ++ l_payload_len := s [2].natural_32_code.to_natural_64 ++ l_payload_len := l_payload_len | (s [1].natural_32_code.to_natural_64 |<< 8) ++ end ++ else ++ l_payload_len := l_len.to_natural_64 ++ end ++ debug ("ws") ++ print (" Full payload length=" + l_payload_len.out) ++ io.put_new_line ++ end ++ if Result.is_valid then ++ if l_has_mask then ++ l_masking_key := next_bytes (l_socket, 4) -- 32 bits ++ debug ("ws") ++ print (" Masking key bits=" + string_to_byte_representation (l_masking_key)) ++ io.put_new_line ++ end ++ if l_masking_key.count < 4 then ++ debug ("ws") ++ print ("masking-key read stream -> " + l_socket.bytes_read.out + " bits%N") ++ end ++ Result.report_error (Invalid_data, "Incomplete data for Masking-key") ++ l_masking_key := Void ++ end ++ else ++ Result.report_error (protocol_error, "All frames sent from client to server are masked!") ++ end ++ if Result.is_valid then ++ l_chunk_size := 0x4000 -- 16 K ++ if l_payload_len > {INTEGER_32}.max_value.to_natural_64 then ++ -- Issue .. to big to store in STRING ++ -- FIXME !!! ++ Result.report_error (Message_too_large, "Can not handle payload data (len=" + l_payload_len.out + ")") ++ else ++ l_len := l_payload_len.to_integer_32 ++ end ++ from ++ l_fetch_count := 0 ++ l_remaining_len := l_len ++ until ++ l_fetch_count >= l_len or l_len = 0 or not Result.is_valid ++ loop ++ if l_remaining_len < l_chunk_size then ++ l_chunk_size := l_remaining_len ++ end ++ l_socket.read_stream (l_chunk_size) ++ l_bytes_read := l_socket.bytes_read ++ debug ("ws") ++ print ("read chunk size=" + l_chunk_size.out + " fetch_count=" + l_fetch_count.out + " l_len=" + l_len.out + " -> " + l_bytes_read.out + "bytes%N") ++ end ++ if l_bytes_read > 0 then ++ l_remaining_len := l_remaining_len - l_bytes_read ++ l_chunk := l_socket.last_string ++ if l_masking_key /= Void then ++ -- Masking ++ -- http://tools.ietf.org/html/rfc6455#section-5.3 ++ unmask (l_chunk, l_fetch_count + 1, l_masking_key) ++ else ++ check ++ client_frame_should_always_be_encoded: False ++ end ++ end ++ l_fetch_count := l_fetch_count + l_bytes_read ++ Result.append_payload_data_chop (l_chunk, l_bytes_read, l_remaining_len = 0) ++ else ++ Result.report_error (internal_error, "Issue reading payload data...") ++ end ++ end ++ if is_verbose then ++ log (" Received " + l_fetch_count.out + " out of " + l_len.out + " bytes <===============", debug_level) ++ end ++ debug ("ws") ++ print (" -> ") ++ if attached Result.payload_data as l_payload_data then ++ s := l_payload_data.tail (l_fetch_count) ++ if s.count > 50 then ++ print (string_to_byte_hexa_representation (s.head (50) + "..")) ++ else ++ print (string_to_byte_hexa_representation (s)) ++ end ++ print ("%N") ++ if Result.is_text and Result.is_fin and Result.fragment_count = 0 then ++ print (" -> ") ++ if s.count > 50 then ++ print (s.head (50) + "..") ++ else ++ print (s) ++ end ++ print ("%N") ++ end ++ end ++ end ++ end ++ end ++ end ++ end ++ end ++ end ++ if Result /= Void then ++ if attached Result.error as err then ++ if is_verbose then ++ log (" !Invalid frame: " + err.string, debug_level) ++ end ++ end ++ if Result.is_injected_control then ++ if attached Result.parent as l_parent then ++ if not Result.is_valid then ++ l_parent.report_error (protocol_error, "Invalid injected frame") ++ end ++ if Result.is_connection_close then ++ -- Return this and process the connection close right away! ++ l_parent.update_fin (True) ++ l_fin := Result.is_fin ++ else ++ Result := l_parent ++ l_fin := l_parent.is_fin ++ check ++ -- This is a control frame but occurs in fragmented frame. ++ inside_fragmented_frame: not l_fin ++ end ++ end ++ else ++ check ++ has_parent: False ++ end ++ l_fin := False -- This is a control frame but occurs in fragmented frame. ++ end ++ end ++ if not Result.is_valid then ++ is_data_frame_ok := False ++ end ++ else ++ is_data_frame_ok := False ++ end ++ end ++ end ++ has_error := Result = Void or else Result.has_error ++ rescue ++ retried := True ++ if Result /= Void then ++ Result.report_error (internal_error, "Internal error") ++ end ++ retry ++ end ++ ++ ++feature -- Encoding ++ ++ digest (a_sha1: SHA1): STRING ++ -- Digest of `a_sha1'. ++ -- Should by in SHA1 class ++ local ++ l_digest: SPECIAL [NATURAL_8] ++ index, l_upper: INTEGER ++ do ++ l_digest := a_sha1.digest ++ create Result.make (l_digest.count // 2) ++ from ++ index := l_digest.Lower ++ l_upper := l_digest.upper ++ until ++ index > l_upper ++ loop ++ Result.append_character (l_digest [index].to_character_8) ++ index := index + 1 ++ end ++ end ++ ++feature {NONE} -- Socket helpers ++ ++ next_bytes (a_socket: HTTPD_STREAM_SOCKET; nb: INTEGER): STRING ++ require ++ nb > 0 ++ local ++ n, l_bytes_read: INTEGER ++ do ++ create Result.make (nb) ++ from ++ n := nb ++ until ++ n = 0 ++ loop ++ a_socket.read_stream (nb) ++ l_bytes_read := a_socket.bytes_read ++ if l_bytes_read > 0 then ++ Result.append (a_socket.last_string) ++ n := n - l_bytes_read ++ else ++ n := 0 ++ end ++ end ++ end ++ ++feature -- Masking Data Client - Server ++ ++ unmask (a_chunk: STRING_8; a_pos: INTEGER; a_key: READABLE_STRING_8) ++ local ++ i, n: INTEGER ++ do ++ from ++ i := 1 ++ n := a_chunk.count ++ until ++ i > n ++ loop ++ a_chunk.put_code (a_chunk.code (i).bit_xor (a_key [((i + (a_pos - 1) - 1) \\ 4) + 1].natural_32_code), i) ++ i := i + 1 ++ end ++ end ++ ++ append_chunk_unmasked (a_chunk: READABLE_STRING_8; a_pos: INTEGER; a_key: READABLE_STRING_8; a_target: STRING) ++ -- To convert masked data into unmasked data, or vice versa, the following ++ -- algorithm is applied. The same algorithm applies regardless of the ++ -- direction of the translation, e.g., the same steps are applied to ++ -- mask the data as to unmask the data. ++ ++ -- Octet i of the transformed data ("transformed-octet-i") is the XOR of ++ -- octet i of the original data ("original-octet-i") with octet at index ++ -- i modulo 4 of the masking key ("masking-key-octet-j"): ++ ++ -- j = i MOD 4 ++ -- transformed-octet-i = original-octet-i XOR masking-key-octet-j ++ ++ -- The payload length, indicated in the framing as frame-payload-length, ++ -- does NOT include the length of the masking key. It is the length of ++ -- the "Payload data", e.g., the number of bytes following the masking ++ -- key. ++ note ++ EIS: "name=Masking", "src=http://tools.ietf.org/html/rfc6455#section-5.3", "protocol=uri" ++ local ++ i, n: INTEGER ++ do ++ -- debug ("ws") ++ -- print ("append_chunk_unmasked (%"" + string_to_byte_representation (a_chunk) + "%",%N%Ta_pos=" + a_pos.out+ ", a_key, a_target #.count=" + a_target.count.out + ")%N") ++ -- end ++ from ++ i := 1 ++ n := a_chunk.count ++ until ++ i > n ++ loop ++ a_target.append_code (a_chunk.code (i).bit_xor (a_key [((i + (a_pos - 1) - 1) \\ 4) + 1].natural_32_code)) ++ i := i + 1 ++ end ++ end ++ ++feature {NONE} -- Debug ++ ++ to_byte_representation (a_integer: INTEGER): STRING ++ require ++ valid: a_integer >= 0 and then a_integer <= 255 ++ local ++ l_val: INTEGER ++ do ++ create Result.make (8) ++ from ++ l_val := a_integer ++ until ++ l_val < 2 ++ loop ++ Result.prepend_integer (l_val \\ 2) ++ l_val := l_val // 2 ++ end ++ Result.prepend_integer (l_val) ++ end ++ ++ string_to_byte_representation (s: STRING): STRING ++ require ++ valid: s.count > 0 ++ local ++ i, n: INTEGER ++ do ++ n := s.count ++ create Result.make (8 * n) ++ if n > 0 then ++ from ++ i := 1 ++ until ++ i > n ++ loop ++ if not Result.is_empty then ++ Result.append_character (':') ++ end ++ Result.append (to_byte_representation (s [i].code)) ++ i := i + 1 ++ end ++ end ++ end ++ ++ string_to_byte_hexa_representation (s: STRING): STRING ++ local ++ i, n: INTEGER ++ c: INTEGER ++ do ++ n := s.count ++ create Result.make (8 * n) ++ if n > 0 then ++ from ++ i := 1 ++ until ++ i > n ++ loop ++ if not Result.is_empty then ++ Result.append_character (':') ++ end ++ c := s [i].code ++ check ++ c <= 0xFF ++ end ++ Result.append_character (((c |>> 4) & 0xF).to_hex_character) ++ Result.append_character (((c) & 0xF).to_hex_character) ++ i := i + 1 ++ end ++ end ++ end ++ ++ ++note ++ 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 ++ 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 +diff --git a/library/server/wsf/connector/standalone_websocket/websocket/web_socket_handler.e b/library/server/wsf/connector/standalone_websocket/websocket/web_socket_handler.e +new file mode 100644 +index 0000000..5268c60 +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket/websocket/web_socket_handler.e +@@ -0,0 +1,152 @@ ++note ++ description: "[ ++ To implement websocket handling, provide a `callbacks` object implementing the {WEB_SOCKET_EVENT_I} interface. ++ ]" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++class ++ WEB_SOCKET_HANDLER ++ ++inherit ++ WEB_SOCKET_CONSTANTS ++ ++ REFACTORING_HELPER ++ ++ HTTPD_LOGGER_CONSTANTS ++ ++create ++ make ++ ++feature {NONE} -- Initialization ++ ++ make (ws: WEB_SOCKET; a_callbacks: WEB_SOCKET_EVENT_I) ++ do ++ web_socket := ws ++ callbacks := a_callbacks ++ end ++ ++feature -- Access ++ ++ web_socket: WEB_SOCKET ++ -- Associated websocket. ++ ++ callbacks: WEB_SOCKET_EVENT_I ++ ++feature -- Execution ++ ++ frozen execute ++ do ++ callbacks.on_open (web_socket) ++ execute_websocket ++ end ++ ++ execute_websocket ++ local ++ exit: BOOLEAN ++ l_frame: detachable WEB_SOCKET_FRAME ++ l_client_message: detachable READABLE_STRING_8 ++ l_utf: UTF_CONVERTER ++ ws: like web_socket ++ s: STRING ++ do ++ from ++ -- loop until ws is closed or has error. ++ ws := web_socket ++ until ++ exit ++ loop ++ debug ("dbglog") ++ dbglog (generator + ".execute_websocket (loop) WS_REQUEST_HANDLER.process_request {" + ws.socket_descriptor.out + "}") ++ end ++ if ws.is_ready_for_reading then ++ l_frame := ws.next_frame ++ if l_frame /= Void and then l_frame.is_valid then ++ if attached l_frame.injected_control_frames as l_injections then ++ -- Process injected control frames now. ++ -- FIXME ++ across ++ l_injections as ic ++ loop ++ if ic.item.is_connection_close then ++ -- FIXME: we should probably send this event .. after the `l_frame.parent' frame event. ++ callbacks.on_event (ws, ic.item.payload_data, ic.item.opcode) ++ exit := True ++ elseif ic.item.is_ping then ++ -- FIXME reply only to the most recent ping ... ++ callbacks.on_event (ws, ic.item.payload_data, ic.item.opcode) ++ else ++ callbacks.on_event (ws, ic.item.payload_data, ic.item.opcode) ++ end ++ end ++ end ++ ++ l_client_message := l_frame.payload_data ++ if l_client_message = Void then ++ l_client_message := "" ++ end ++ ++ debug ("ws") ++ create s.make_from_string ("%NExecute: %N") ++ s.append (" [opcode: "+ opcode_name (l_frame.opcode) +"]%N") ++ if l_frame.is_text then ++ s.append (" [client message: %""+ l_client_message +"%"]%N") ++ elseif l_frame.is_binary then ++ s.append (" [client binary message length: %""+ l_client_message.count.out +"%"]%N") ++ end ++ s.append (" [is_control: " + l_frame.is_control.out + "]%N") ++ s.append (" [is_binary: " + l_frame.is_binary.out + "]%N") ++ s.append (" [is_text: " + l_frame.is_text.out + "]%N") ++ dbglog (s) ++ end ++ ++ if l_frame.is_connection_close then ++ callbacks.on_event (ws, l_client_message, l_frame.opcode) ++ exit := True ++ elseif l_frame.is_binary then ++ callbacks.on_event (ws, l_client_message, l_frame.opcode) ++ elseif l_frame.is_text then ++ check is_valid_utf_8: l_utf.is_valid_utf_8_string_8 (l_client_message) end ++ callbacks.on_event (ws, l_client_message, l_frame.opcode) ++ else ++ callbacks.on_event (ws, l_client_message, l_frame.opcode) ++ end ++ else ++ debug ("ws") ++ create s.make_from_string ("%NExecute: %N") ++ s.append (" [ERROR: invalid frame]%N") ++ if l_frame /= Void and then attached l_frame.error as err then ++ s.append (" [Code: "+ err.code.out +"]%N") ++ s.append (" [Description: "+ err.description +"]%N") ++ end ++ dbglog (s) ++ end ++ callbacks.on_event (ws, "", connection_close_frame) ++ exit := True -- FIXME: check proper close protocol ++ end ++ else ++ debug ("ws") ++ dbglog (generator + ".WAITING WS_REQUEST_HANDLER.process_request {" + ws.socket_descriptor.out + "}") ++ end ++ end ++ end ++ end ++ ++feature {NONE} -- Logging ++ ++ dbglog (m: READABLE_STRING_8) ++ do ++ web_socket.log (m, debug_level) ++ end ++ ++note ++ 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 ++ 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 +diff --git a/library/server/wsf/connector/standalone_websocket/wgi_standalone_websocket_connector.e b/library/server/wsf/connector/standalone_websocket/wgi_standalone_websocket_connector.e +new file mode 100644 +index 0000000..1567520 +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket/wgi_standalone_websocket_connector.e +@@ -0,0 +1,44 @@ ++note ++ description: "Summary description for {WGI_STANDALONE_WEBSOCKET_CONNECTOR}." ++ author: "" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++class ++ WGI_STANDALONE_WEBSOCKET_CONNECTOR [G -> WGI_EXECUTION create make end] ++ ++inherit ++ WGI_STANDALONE_CONNECTOR [G] ++ redefine ++ name, version ++ end ++ ++create ++ make, ++ make_with_base ++ ++feature -- Access ++ ++ name: STRING_8 ++ -- Name of Current connector ++ once ++ Result := "ws_httpd" ++ end ++ ++ version: STRING_8 ++ -- Version of Current connector ++ once ++ Result := "1.0" ++ end ++ ++note ++ 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 ++ 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 +diff --git a/library/server/wsf/connector/standalone_websocket/wsf_standalone_websocket_service_launcher.e b/library/server/wsf/connector/standalone_websocket/wsf_standalone_websocket_service_launcher.e +new file mode 100644 +index 0000000..0a334fb +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket/wsf_standalone_websocket_service_launcher.e +@@ -0,0 +1,49 @@ ++note ++ description: "[ ++ Component to launch the service using the default connector ++ ++ Eiffel Web httpd for this class ++ ++ ++ The httpd default connector support options: ++ port: numeric such as 8099 (or equivalent string as "8099") ++ base: base_url (very specific to standalone server) ++ verbose: to display verbose output, useful for standalone connector ++ force_single_threaded: use only one thread, useful for standalone connector ++ ++ check WSF_SERVICE_LAUNCHER for more documentation ++ ]" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++class ++ WSF_STANDALONE_WEBSOCKET_SERVICE_LAUNCHER [G -> WSF_WEBSOCKET_EXECUTION create make end] ++ ++inherit ++ WSF_STANDALONE_SERVICE_LAUNCHER [G] ++ redefine ++ connector ++ end ++ ++create ++ make, ++ make_and_launch ++ ++feature -- Status report ++ ++ connector: WGI_STANDALONE_WEBSOCKET_CONNECTOR [G] ++ -- Default connector ++ ++;note ++ 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 ++ 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 ++ +diff --git a/library/server/wsf/connector/standalone_websocket/wsf_websocket_execution.e b/library/server/wsf/connector/standalone_websocket/wsf_websocket_execution.e +new file mode 100644 +index 0000000..78be024 +--- /dev/null ++++ b/library/server/wsf/connector/standalone_websocket/wsf_websocket_execution.e +@@ -0,0 +1,79 @@ ++note ++ description: "[ ++ Request execution based on attributes `request' and `response'. ++ Also support Upgrade to Websocket protocol. ++ ++ ++ ]" ++ author: "$Author$" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++deferred class ++ WSF_WEBSOCKET_EXECUTION ++ ++inherit ++ WSF_EXECUTION ++ rename ++ execute as http_execute ++ end ++ ++--create ++-- make ++ ++feature -- Execution ++ ++ frozen http_execute ++ local ++ ws: WEB_SOCKET ++ ws_h: like new_websocket_handler ++ do ++ create ws.make (request, response) ++ ws.open_ws_handshake ++ if ws.is_websocket then ++ if ws.has_error then ++ -- Upgrade to websocket raised an error ++ -- stay on standard HTTP/1.1 protocol ++ execute ++ else ++ ws_h := new_websocket_handler (ws) ++ ws_h.execute ++ end ++ else ++ execute ++ end ++ end ++ ++ execute ++ -- Execute Current request, ++ -- getting data from `request' ++ -- and response to client via `response'. ++ deferred ++ end ++ ++feature -- Factory ++ ++ new_websocket_handler (ws: WEB_SOCKET): WEB_SOCKET_HANDLER ++ -- Websocket request specific handler on socket `ws'. ++ --| For the creation, it requires an instance of `{WEB_SOCKET_EVENT_I}' ++ --| to receive the websocket events. ++ --| One can inherit from {WEB_SOCKET_EVENT_I} and implement the related ++ --| deferred features. ++ --| Or even provide a new class implementing {WEB_SOCKET_EVENT_I}. ++ require ++ is_websocket: ws.is_websocket ++ no_error: not ws.has_error ++ deferred ++ end ++ ++note ++ 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 ++ 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 +diff --git a/library/server/wsf/package.iron b/library/server/wsf/package.iron +index 99d760f..f766b25 100644 +--- a/library/server/wsf/package.iron ++++ b/library/server/wsf/package.iron +@@ -1,13 +1,3 @@ +-note +- title: Web Server Foundation +- description: Core of the Eiffel Web Framework, used to build web server application. +- tags: ewf,server,httpd,request,connector +- license: Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt) +- link[license]: https://github.com/EiffelWebFramework/EWF/blob/master/LICENSE +- link[source]: "Github" https://github.com/EiffelWebFramework/EWF +- link[doc]: "Documentation" http://eiffelwebframework.github.io/EWF/ +- +-end + + package wsf + +@@ -37,6 +27,7 @@ project + default_standalone = "default/standalone-safe.ecf" + default_standalone = "default/standalone.ecf" + ++ + note + title: Web Server Foundation + description: "[ +diff --git a/library/server/wsf/src/service/wsf_service_launcher.e b/library/server/wsf/src/service/wsf_service_launcher.e +index 2568a5e..86c41a7 100644 +--- a/library/server/wsf/src/service/wsf_service_launcher.e ++++ b/library/server/wsf/src/service/wsf_service_launcher.e +@@ -22,11 +22,11 @@ note + For instance, you can use + create s.make_and_launch_and_options (agent execute, <<["port", 8099]>>) + +- And if Nino is the default connector it will support: ++ And if the connector is the Standalone connector, ++ check {WSF_STANDALONE_SERVICE_LAUNCHER} for options description, such as: + port: numeric such as 8099 (or equivalent string as "8099") + base: base_url (very specific to standalone server) +- force_single_threaded: use only one thread, useful for Nino +- verbose: to display verbose output, useful for Nino ++ verbose: to display verbose output. + ]" + date: "$Date$" + revision: "$Revision$" +diff --git a/library/server/wsf/src/service/wsf_service_launcher_options.e b/library/server/wsf/src/service/wsf_service_launcher_options.e +index fd690f8..1394c17 100644 +--- a/library/server/wsf/src/service/wsf_service_launcher_options.e ++++ b/library/server/wsf/src/service/wsf_service_launcher_options.e +@@ -8,8 +8,8 @@ note + force_single_threaded: use only one thread, useful for Nino + verbose: to display verbose output, useful for Nino + ]" +- date: "$Date$" +- revision: "$Revision$" ++ date: "$Date: 2016-08-06 13:34:52 +0200 (sam., 06 août 2016) $" ++ revision: "$Revision: 99106 $" + + class + WSF_SERVICE_LAUNCHER_OPTIONS +@@ -83,6 +83,86 @@ feature -- Access + Result := options.item (a_name) + end + ++feature -- Helpers ++ ++ has_option (a_opt_name: READABLE_STRING_GENERAL): BOOLEAN ++ -- Is there any value associated to option name `a_opt_name'? ++ do ++ Result := attached option (a_opt_name) ++ end ++ ++ has_integer_option (a_opt_name: READABLE_STRING_GENERAL): BOOLEAN ++ -- Is there any INTEGER value associated to option name `a_opt_name'? ++ local ++ s: READABLE_STRING_GENERAL ++ do ++ if attached option (a_opt_name) as opt then ++ if attached {INTEGER} opt as i then ++ Result := True ++ else ++ s := opt.out ++ Result := s.is_integer ++ end ++ end ++ end ++ ++ has_string_32_option (a_opt_name: READABLE_STRING_GENERAL): BOOLEAN ++ -- Is there any string 32 value associated to option name `a_opt_name'? ++ do ++ if attached option (a_opt_name) as opt then ++ Result := attached {READABLE_STRING_GENERAL} opt ++ end ++ end ++ ++ option_string_32_value (a_opt_name: READABLE_STRING_GENERAL; a_default: detachable READABLE_STRING_GENERAL): detachable IMMUTABLE_STRING_32 ++ -- Unicode String value associated to option name `a_opt_name', other return `a_default'. ++ do ++ if attached option (a_opt_name) as opt then ++ if attached {READABLE_STRING_32} opt as s32 then ++ create Result.make_from_string (s32) ++ elseif attached {READABLE_STRING_GENERAL} opt as s then ++ create Result.make_from_string_general (s) ++ end ++ end ++ if Result = Void and a_default /= Void then ++ create Result.make_from_string_general (a_default) ++ end ++ end ++ ++ option_integer_value (a_opt_name: READABLE_STRING_GENERAL; a_default: INTEGER): INTEGER ++ -- INTEGER value associated to option name `a_opt_name', other return `a_default'. ++ local ++ s: READABLE_STRING_GENERAL ++ do ++ Result := a_default ++ if attached option (a_opt_name) as opt then ++ if attached {INTEGER} opt as i then ++ Result := i ++ else ++ s := opt.out ++ if s.is_integer then ++ Result := s.to_integer ++ end ++ end ++ end ++ end ++ ++ option_boolean_value (a_opt_name: READABLE_STRING_GENERAL; a_default: BOOLEAN): BOOLEAN ++ -- BOOLEAN value associated to option name `a_opt_name', other return `a_default'. ++ local ++ s: READABLE_STRING_GENERAL ++ do ++ Result := a_default ++ if attached option (a_opt_name) as opt then ++ if attached {BOOLEAN} opt as b then ++ Result := b ++ else ++ s := opt.out ++ Result := s.is_case_insensitive_equal ("true") ++ end ++ end ++ end ++ + feature -- Access + + new_cursor: TABLE_ITERATION_CURSOR [detachable ANY, READABLE_STRING_GENERAL] +diff --git a/library/server/wsf/src/wsf_execution.e b/library/server/wsf/src/wsf_execution.e +index 8bc0a97..352207f 100644 +--- a/library/server/wsf/src/wsf_execution.e ++++ b/library/server/wsf/src/wsf_execution.e +@@ -14,7 +14,6 @@ inherit + make_from_execution as make_from_wgi_execution + redefine + make, +- execute, + clean, + is_valid_end_of_execution + end +diff --git a/library/server/wsf/src/wsf_request.e b/library/server/wsf/src/wsf_request.e +index 055e35b..00708aa 100644 +--- a/library/server/wsf/src/wsf_request.e ++++ b/library/server/wsf/src/wsf_request.e +@@ -261,10 +261,12 @@ feature -- Access: Input + local + l_input: WGI_INPUT_STREAM + n: INTEGER ++ buf_initial_size: INTEGER + do + if raw_input_data_recorded and then attached raw_input_data as d then + buf.append (d) + else ++ buf_initial_size := buf.count + l_input := input + if is_chunked_input then + from +@@ -286,73 +288,53 @@ feature -- Access: Input + end + end + if raw_input_data_recorded then +- set_raw_input_data (buf) ++ set_raw_input_data (buf.substring (buf_initial_size + 1, buf.count)) ++ -- Only the input data! And differente reference. + end + end + end + +- read_input_data_into_file (a_file: FILE) ++ read_input_data_into_file (a_medium: IO_MEDIUM) + -- retrieve the content from the `input' stream into `s' + -- warning: if the input data has already been retrieved + -- you might not get anything + require +- a_file_is_open_write: a_file.is_open_write ++ a_medium_is_open_write: a_medium.is_open_write + local + s: STRING + l_input: WGI_INPUT_STREAM + l_raw_data: detachable STRING_8 +- len: NATURAL_64 + nb, l_step: INTEGER +- l_size: NATURAL_64 + do + if raw_input_data_recorded and then attached raw_input_data as d then +- a_file.put_string (d) ++ a_medium.put_string (d) + else + if raw_input_data_recorded then + create l_raw_data.make_empty + end + l_input := input +- len := content_length_value +- +- debug ("wsf") +- io.error.put_string (generator + ".read_input_data_into_file (a_file) content_length=" + len.out + "%N") +- end + + from +- l_size := 0 + l_step := 8_192 + create s.make (l_step) + until + l_step = 0 or l_input.end_of_input + loop +- if len < l_step.to_natural_64 then +- l_step := len.to_integer_32 +- end +- if l_step > 0 then +- l_input.append_to_string (s, l_step) +- nb := l_input.last_appended_count +- l_size := l_size + nb.to_natural_64 +- len := len - nb.to_natural_64 +- +- debug ("wsf") +- io.error.put_string (" append (s, " + l_step.out + ") -> " + nb.out + " (" + l_size.out + " / "+ content_length_value.out + ")%N") +- end ++ l_input.append_to_string (s, l_step) ++ nb := l_input.last_appended_count + +- a_file.put_string (s) +- if l_raw_data /= Void then +- l_raw_data.append (s) +- end +- s.wipe_out +- if nb < l_step then +- l_step := 0 +- end ++ a_medium.put_string (s) ++ if l_raw_data /= Void then ++ l_raw_data.append (s) ++ end ++ s.wipe_out ++ if nb < l_step then ++ l_step := 0 + end + end +- a_file.flush +- debug ("wsf") +- io.error.put_string ("offset =" + len.out + "%N") ++ if attached {FILE} a_medium as f then ++ f.flush + end +- check got_all_data: len = 0 end + if l_raw_data /= Void then + set_raw_input_data (l_raw_data) + end +diff --git a/library/server/wsf/tests/src/wsf_request_null.e b/library/server/wsf/tests/src/wsf_request_null.e +index 3d6bbea..960cbed 100644 +--- a/library/server/wsf/tests/src/wsf_request_null.e ++++ b/library/server/wsf/tests/src/wsf_request_null.e +@@ -10,7 +10,7 @@ class + inherit + WSF_REQUEST + +-create {WSF_TO_WGI_SERVICE, WSF_SERVICE} ++create {WSF_SERVICE} + make_from_wgi + + end +diff --git a/library/server/wsf_proxy/network/no_ssl/wsf_proxy_socket_factory.e b/library/server/wsf_proxy/network/no_ssl/wsf_proxy_socket_factory.e +new file mode 100644 +index 0000000..21c2e7e +--- /dev/null ++++ b/library/server/wsf_proxy/network/no_ssl/wsf_proxy_socket_factory.e +@@ -0,0 +1,20 @@ ++note ++ description: "Summary description for {WSF_PROXY_SOCKET_FACTORY}." ++ author: "" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++class ++ WSF_PROXY_SOCKET_FACTORY ++ ++inherit ++ WSF_PROXY_SOCKET_FACTORY_I ++ ++feature {NONE} -- Implementation ++ ++ ssl_socket (a_host: READABLE_STRING_8; a_port: INTEGER): detachable NETWORK_STREAM_SOCKET ++ do ++ check supported: False end ++ end ++ ++end +diff --git a/library/server/wsf_proxy/network/ssl/wsf_proxy_socket_factory.e b/library/server/wsf_proxy/network/ssl/wsf_proxy_socket_factory.e +new file mode 100644 +index 0000000..ad26490 +--- /dev/null ++++ b/library/server/wsf_proxy/network/ssl/wsf_proxy_socket_factory.e +@@ -0,0 +1,30 @@ ++note ++ description: "Summary description for {WSF_PROXY_SOCKET_FACTORY}." ++ author: "" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++class ++ WSF_PROXY_SOCKET_FACTORY ++ ++inherit ++ WSF_PROXY_SOCKET_FACTORY_I ++ redefine ++ is_ssl_supported ++ end ++ ++feature {NONE} -- Implementation ++ ++ ssl_socket (a_host: READABLE_STRING_8; a_port: INTEGER): detachable SSL_NETWORK_STREAM_SOCKET ++ do ++ if attached create_from_name (a_host) as l_peer_address then ++ create Result.make_client_by_address_and_port (l_peer_address, a_port) ++ end ++ end ++ ++feature -- Status ++ ++ is_ssl_supported: BOOLEAN = True ++ -- Is https:// supported? ++ ++end +diff --git a/library/server/wsf_proxy/network/wsf_proxy_socket_factory_i.e b/library/server/wsf_proxy/network/wsf_proxy_socket_factory_i.e +new file mode 100644 +index 0000000..900db00 +--- /dev/null ++++ b/library/server/wsf_proxy/network/wsf_proxy_socket_factory_i.e +@@ -0,0 +1,67 @@ ++note ++ description: "Summary description for {WSF_PROXY_SOCKET_FACTORY_I}." ++ date: "$Date$" ++ revision: "$Revision$" ++ ++deferred class ++ WSF_PROXY_SOCKET_FACTORY_I ++ ++inherit ++ INET_ADDRESS_FACTORY ++ ++feature -- Access ++ ++ socket_from_uri (a_uri: URI): like socket ++ local ++ l_port: INTEGER ++ do ++ if a_uri.is_valid and then attached a_uri.host as l_host then ++ l_port := a_uri.port ++ if a_uri.scheme.is_case_insensitive_equal_general ("https") then ++ if is_ssl_supported then ++ if l_port <= 0 then ++ l_port := 443 ++ end ++ Result := ssl_socket (l_host, l_port) ++ end ++ elseif a_uri.scheme.is_case_insensitive_equal_general ("http") then ++ if l_port <= 0 then ++ l_port := 80 ++ end ++ Result := socket (l_host, l_port) ++ end ++ end ++ end ++ ++feature -- Status ++ ++ is_uri_supported (a_uri: URI): BOOLEAN ++ do ++ Result := a_uri.scheme.is_case_insensitive_equal_general ("http") ++ or else ( ++ a_uri.scheme.is_case_insensitive_equal_general ("https") ++ and is_ssl_supported ++ ) ++ end ++ ++ is_ssl_supported: BOOLEAN ++ -- Is https:// supported? ++ do ++ end ++ ++feature {NONE} -- Implementation ++ ++ socket (a_host: READABLE_STRING_8; a_port: INTEGER): detachable NETWORK_STREAM_SOCKET ++ do ++ if attached create_from_name (a_host) as l_peer_address then ++ create Result.make_client_by_address_and_port (l_peer_address, a_port) ++ end ++ end ++ ++ ssl_socket (a_host: READABLE_STRING_8; a_port: INTEGER): detachable NETWORK_STREAM_SOCKET ++ require ++ is_ssl_supported: is_ssl_supported ++ deferred ++ end ++ ++end +diff --git a/library/server/wsf_proxy/reverse_proxy/wsf_simple_reverse_proxy_handler.e b/library/server/wsf_proxy/reverse_proxy/wsf_simple_reverse_proxy_handler.e +new file mode 100644 +index 0000000..a0ab3c6 +--- /dev/null ++++ b/library/server/wsf_proxy/reverse_proxy/wsf_simple_reverse_proxy_handler.e +@@ -0,0 +1,303 @@ ++note ++ description: "Summary description for {WSF_SIMPLE_REVERSE_PROXY_HANDLER}." ++ date: "$Date$" ++ revision: "$Revision$" ++ ++class ++ WSF_SIMPLE_REVERSE_PROXY_HANDLER ++ ++create ++ make ++ ++feature {NONE} -- Initialization ++ ++ make (a_remote_uri: READABLE_STRING_8) ++ do ++ create remote_uri.make_from_string (a_remote_uri) ++ timeout := 30 -- seconds. See {NETWORK_SOCKET}.default_timeout ++ connect_timeout := 5_000 -- 5 seconds. ++ is_via_header_supported := True ++ end ++ ++feature -- Access ++ ++ remote_uri: URI ++ -- Url for the targetted service. ++ ++ uri_rewriter: detachable WSF_URI_REWRITER assign set_uri_rewriter ++ -- URI rewriter component, to compute the URI on targetted service ++ -- based on current request. ++ ++feature -- Settings ++ ++ connect_timeout: INTEGER assign set_connect_timeout ++ -- In milliseconds. ++ ++ timeout: INTEGER assign set_timeout ++ -- In seconds. ++ ++ is_via_header_supported: BOOLEAN ++ -- Via: header supported. ++ -- Default: True. ++ ++feature -- Change ++ ++ set_uri_rewriter (a_rewriter: like uri_rewriter) ++ do ++ uri_rewriter := a_rewriter ++ end ++ ++ set_timeout (a_timeout_in_seconds: INTEGER) ++ -- in seconds. ++ do ++ timeout := a_timeout_in_seconds ++ end ++ ++ set_connect_timeout (a_timeout_in_milliseconds: INTEGER) ++ -- in milliseconds. ++ do ++ connect_timeout := a_timeout_in_milliseconds ++ end ++ ++ set_is_via_header_supported (b: BOOLEAN) ++ -- Set `is_via_header_supported' to `b'. ++ do ++ is_via_header_supported := b ++ end ++ ++feature -- Execution ++ ++ proxy_uri (request: WSF_REQUEST): STRING ++ -- URI to query on proxyfied host. ++ do ++ if attached uri_rewriter as r then ++ Result := r.uri (request) ++ else ++ Result := request.request_uri ++ end ++ end ++ ++ execute (request: WSF_REQUEST; response: WSF_RESPONSE) ++ -- Execute reverse proxy request. ++ local ++ h: HTTP_HEADER ++ l_http_query: STRING ++ l_status_line: STRING ++ l_max_forward: INTEGER ++ l_via: detachable STRING ++ l_protocol: STRING ++ i: INTEGER ++ l_completed: BOOLEAN ++ l_remote_uri: like remote_uri ++ l_socket_factory: WSF_PROXY_SOCKET_FACTORY ++ do ++ l_remote_uri := remote_uri ++ create l_socket_factory ++ if not l_socket_factory.is_uri_supported (l_remote_uri) then ++ send_error (request, response, {HTTP_STATUS_CODE}.bad_gateway, l_remote_uri.scheme + " is not supported! [for remote " + l_remote_uri.string + "]") ++ elseif attached l_socket_factory.socket_from_uri (l_remote_uri) as l_socket then ++ l_socket.set_connect_timeout (connect_timeout) -- milliseconds ++ l_socket.set_timeout (timeout) -- seconds ++ ++ l_socket.connect ++ if l_socket.is_connected then ++ create l_http_query.make_from_string (request.request_method) ++ l_http_query.append_character (' ') ++ l_http_query.append (l_remote_uri.path) ++ l_http_query.append (proxy_uri (request)) ++ l_http_query.append_character (' ') ++ l_http_query.append (request.server_protocol) ++ if attached request.raw_header_data as l_raw_header then ++ i := l_raw_header.substring_index ("%R%N", 1) ++ if i > 0 then ++ -- Skip the first status line. ++ create h.make_from_raw_header_data (l_raw_header.substring (i + 2, l_raw_header.count)) ++ else ++ create h.make_from_raw_header_data (l_raw_header) ++ end ++ if attached l_remote_uri.host as l_remote_host then ++ if l_remote_uri.port > 0 then ++ h.put_header_key_value ("Host", l_remote_host + ":" + l_remote_uri.port.out) ++ else ++ h.put_header_key_value ("Host", l_remote_host) ++ end ++ end ++ ++ -- Via header ++ if is_via_header_supported then ++ if attached h.item ("Via") as v then ++ l_via := v ++ l_via.append (", ") ++ else ++ create l_via.make_empty ++ end ++ l_via.append (request.server_protocol + " " + request.server_name + " (PROXY-" + request.server_software + ")") ++ h.put_header_key_value ("Via", l_via) ++ end ++ ++ -- Max-Forwards header handling ++ if attached h.item ("Max-Forwards") as h_max_forward then ++ -- Max-Forwards: 0 stop, otherwise decrement by one. ++ -- see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.31 ++ if h_max_forward.is_integer then ++ l_max_forward := h_max_forward.to_integer - 1 ++ if l_max_forward >= 0 then ++ h.put_header_key_value ("Max-Forwards", l_max_forward.out) ++ end ++ end ++ end ++ if l_max_forward < 0 then ++ -- i.e previous Max-Forwards was '0' ++ send_error (request, response, {HTTP_STATUS_CODE}.bad_gateway, "Reached maximum number of Forwards, not forwarded to " + l_remote_uri.string) ++ else ++ l_socket.put_string (l_http_query) ++ l_socket.put_string ("%R%N") ++ l_socket.put_string (h.string) ++ l_socket.put_string ("%R%N") ++ if request.content_length_value > 0 then ++ request.read_input_data_into_file (l_socket) ++ end ++ ++ -- Get HTTP status ++ l_socket.read_line_thread_aware ++ create l_status_line.make_from_string (l_socket.last_string) ++ -- Get HTTP header block ++ if attached next_http_header_block (l_socket) as l_resp_header then ++ create h.make_from_raw_header_data (l_resp_header) ++ if attached status_line_info (l_status_line) as l_status_info then ++ l_protocol := l_status_info.protocol ++ if attached l_status_info.reason_phrase as l_phrase then ++ response.set_status_code_with_reason_phrase (l_status_info.status_code, l_phrase) ++ else ++ response.set_status_code (l_status_info.status_code) ++ end ++ else ++ check has_status_line: False end ++ l_protocol := "1.0" -- Default? ++ response.set_status_code (80) ++ end ++ ++ if is_via_header_supported then ++ if attached h.item ("Via") as v then ++ l_via := v ++ l_via.append (", ") ++ else ++ create l_via.make_empty ++ end ++ l_via.append (l_protocol + " " + request.server_name + " (PROXY-" + request.server_software + ")") ++ h.put_header_key_value ("Via", l_via) ++ end ++ ++ response.add_header_lines (h) ++ from ++ l_socket.read_stream (2_048) ++ until ++ l_socket.was_error ++ or not l_socket.is_connected ++ or l_socket.bytes_read <= 0 ++ or l_completed ++ loop ++ response.put_string (l_socket.last_string) ++ if l_socket.bytes_read = 2_048 then ++ l_socket.read_stream (2_048) ++ else ++ l_completed := True ++ end ++ end ++ else ++ send_error (request, response, {HTTP_STATUS_CODE}.internal_server_error, "Invalid response header!") ++ end ++ end ++ else ++ send_error (request, response, {HTTP_STATUS_CODE}.internal_server_error, "Can not access request header!") ++ end ++ else ++ send_error (request, response, {HTTP_STATUS_CODE}.gateway_timeout, "Unable to connect " + l_remote_uri.string) ++ end ++ else ++ send_error (request, response, {HTTP_STATUS_CODE}.bad_gateway, "Unable to connect " + l_remote_uri.string) ++ end ++ end ++ ++feature {NONE} -- Implementation ++ ++ status_line_info (a_line: READABLE_STRING_8): detachable TUPLE [protocol: READABLE_STRING_8; status_code: INTEGER; reason_phrase: detachable READABLE_STRING_8] ++ -- Info from status line ++ --| Such as "HTTP/1.1 200 OK" -> ["1.1", 200, "OK"] ++ local ++ i,j: INTEGER ++ p,s: detachable READABLE_STRING_8 ++ c: INTEGER ++ do ++ i := a_line.index_of (' ', 1) ++ if i > 0 then ++ p := a_line.substring (1, i - 1) ++ if p.starts_with_general ("HTTP/") then ++ p := p.substring (6, p.count) -- We could also keep HTTP/ ++ end ++ j := i + 1 ++ i := a_line.index_of (' ', j) ++ if i > 0 then ++ s := a_line.substring (j, i - 1) ++ if s.is_integer then ++ c := s.to_integer ++ s := a_line.substring (i + 1, a_line.count) ++ if s.is_whitespace then ++ s := Void ++ elseif s[s.count].is_space then ++ s := s.substring (1, s.count - 1) ++ end ++ Result := [p, c, s] ++ end ++ end ++ end ++ end ++ ++ next_http_header_block (a_socket: NETWORK_STREAM_SOCKET): detachable STRING ++ local ++ h: STRING ++ do ++ create h.make_empty ++ from ++ a_socket.read_line_thread_aware ++ until ++ Result /= Void ++ or a_socket.was_error ++ or (a_socket.bytes_read = 0 or a_socket.bytes_read = -1) ++ or not a_socket.is_connected ++ loop ++ if a_socket.last_string.same_string ("%R") then ++ -- End of header ++ Result := h ++ else ++ h.append (a_socket.last_string) ++ h.append ("%N") ++ a_socket.read_line_thread_aware ++ end ++ end ++ end ++ ++ send_error (request: WSF_REQUEST; response: WSF_RESPONSE; a_status_code: INTEGER; a_message: READABLE_STRING_8) ++ local ++ s: STRING ++ do ++ -- To send a response we need to setup, the status code and ++ -- the response headers. ++ create s.make_from_string (a_message) ++ debug ++ s.append ("%N(UTC time is " + (create {HTTP_DATE}.make_now_utc).rfc850_string + ").%N") ++ end ++ response.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "plain/text"], ["Content-Length", s.count.out]>>) ++ 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") ++ end ++ response.put_string (s) ++ end ++ ++end +diff --git a/library/server/wsf_proxy/rewriter/wsf_agent_uri_rewriter.e b/library/server/wsf_proxy/rewriter/wsf_agent_uri_rewriter.e +new file mode 100644 +index 0000000..fc054b3 +--- /dev/null ++++ b/library/server/wsf_proxy/rewriter/wsf_agent_uri_rewriter.e +@@ -0,0 +1,38 @@ ++note ++ description: "Summary description for {WSF_AGENT_URI_REWRITER}." ++ author: "" ++ date: "$Date$" ++ revision: "$Revision$" ++ ++class ++ WSF_AGENT_URI_REWRITER ++ ++inherit ++ WSF_URI_REWRITER ++ ++create ++ make ++ ++--convert ++-- make ({FUNCTION [TUPLE [WSF_REQUEST], STRING]}) ++ ++feature {NONE} -- Initialization ++ ++ make (a_rewriter_function: like rewriter_function) ++ do ++ rewriter_function := a_rewriter_function ++ end ++ ++feature -- Access ++ ++ rewriter_function: FUNCTION [TUPLE [WSF_REQUEST], STRING] ++ ++feature -- Conversion ++ ++ uri (a_request: WSF_REQUEST): STRING ++ -- . ++ do ++ Result := rewriter_function (a_request) ++ end ++ ++end +diff --git a/library/server/wsf_proxy/rewriter/wsf_uri_rewriter.e b/library/server/wsf_proxy/rewriter/wsf_uri_rewriter.e +new file mode 100644 +index 0000000..6cbc1ca +--- /dev/null ++++ b/library/server/wsf_proxy/rewriter/wsf_uri_rewriter.e +@@ -0,0 +1,16 @@ ++note ++ description: "Summary description for {WSF_URI_REWRITER}." ++ date: "$Date$" ++ revision: "$Revision$" ++ ++deferred class ++ WSF_URI_REWRITER ++ ++feature -- Conversion ++ ++ uri (a_request: WSF_REQUEST): STRING ++ -- Rewritten request uri based on `a_request'. ++ deferred ++ end ++ ++end +diff --git a/library/server/wsf_proxy/wsf_proxy-safe.ecf b/library/server/wsf_proxy/wsf_proxy-safe.ecf +new file mode 100644 +index 0000000..9dd777c +--- /dev/null ++++ b/library/server/wsf_proxy/wsf_proxy-safe.ecf +@@ -0,0 +1,34 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ no_ssl ++ ssl ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/library/server/wsf_proxy/wsf_proxy.ecf b/library/server/wsf_proxy/wsf_proxy.ecf +new file mode 100644 +index 0000000..17ffa57 +--- /dev/null ++++ b/library/server/wsf_proxy/wsf_proxy.ecf +@@ -0,0 +1,36 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ no_ssl ++ ssl ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/library/text/parser/feed/feed-safe.ecf b/library/text/parser/feed/feed-safe.ecf +index 3c5a7dd..48591ec 100644 +--- a/library/text/parser/feed/feed-safe.ecf ++++ b/library/text/parser/feed/feed-safe.ecf +@@ -5,7 +5,7 @@ + + + +- ++ + + + +diff --git a/library/text/parser/feed/feed.ecf b/library/text/parser/feed/feed.ecf +index a69dd4e..9d4031e 100644 +--- a/library/text/parser/feed/feed.ecf ++++ b/library/text/parser/feed/feed.ecf +@@ -7,7 +7,7 @@ + + + +- ++ + + + +diff --git a/library/text/parser/feed/src/atom/atom_feed_generator.e b/library/text/parser/feed/src/atom/atom_feed_generator.e +index 4f15a22..f4d8791 100644 +--- a/library/text/parser/feed/src/atom/atom_feed_generator.e ++++ b/library/text/parser/feed/src/atom/atom_feed_generator.e +@@ -72,6 +72,13 @@ feature -- Visitor + if attached a_entry.date as dt then + append_content_tag_to ("updated", Void, date_to_string (dt), buffer) + end ++ if attached a_entry.categories as cats then ++ across ++ cats as ic ++ loop ++ append_content_tag_to ("category", <<["term", ic.item]>>, Void, buffer) ++ end ++ end + + append_content_tag_to ("summary", Void, a_entry.description, buffer) + if attached a_entry.content as l_content then +diff --git a/library/text/parser/feed/src/atom/atom_feed_parser.e b/library/text/parser/feed/src/atom/atom_feed_parser.e +index d486598..0c16b2c 100644 +--- a/library/text/parser/feed/src/atom/atom_feed_parser.e ++++ b/library/text/parser/feed/src/atom/atom_feed_parser.e +@@ -81,6 +81,7 @@ feature -- Access + if attached x_entry.element_by_name ("content") as x_content then + e.set_content (xml_element_code (x_content), xml_attribute_text (x_content, "type")) + end ++ + if attached x_entry.element_by_name ("author") as x_author then + if attached x_author.element_by_name ("name") as x_name and then + attached x_name.text as l_author_name +@@ -92,6 +93,17 @@ feature -- Access + e.set_author (l_author) + end + end ++ ++ -- Optional "category" ++ if attached x_entry.elements_by_name ("category") as x_categories then ++ across ++ x_categories as cats_ic ++ loop ++ if attached xml_attribute_text (cats_ic.item, "term") as l_term then ++ e.set_category (l_term) ++ end ++ end ++ end + Result.extend (e) + end + end +diff --git a/library/text/parser/feed/src/support/feed_generator.e b/library/text/parser/feed/src/support/feed_generator.e +index efbb8b8..cad90cc 100644 +--- a/library/text/parser/feed/src/support/feed_generator.e ++++ b/library/text/parser/feed/src/support/feed_generator.e +@@ -66,7 +66,7 @@ feature {NONE} -- Helpers + end + end + if a_content = Void then +- a_output.append ("/>") ++ a_output.append ("/>%N") + else + a_output.append (">") + a_output.append (escaped_unicode_xml (a_content.as_string_32)) +diff --git a/library/text/parser/feed/tests/atom_test_set.e b/library/text/parser/feed/tests/atom_test_set.e +index 68eab06..1ffaa2f 100644 +--- a/library/text/parser/feed/tests/atom_test_set.e ++++ b/library/text/parser/feed/tests/atom_test_set.e +@@ -65,6 +65,7 @@ feature {NONE} -- Data + John Doe + johndoe@example.com + ++ + + + +diff --git a/library/text/parser/feed/tests/msys-iconv-2.dll b/library/text/parser/feed/tests/msys-iconv-2.dll +new file mode 100644 +index 0000000..111ded9 +Binary files /dev/null and b/library/text/parser/feed/tests/msys-iconv-2.dll differ +diff --git a/library/text/parser/feed/tests/tests-safe.ecf b/library/text/parser/feed/tests/tests-safe.ecf +index 6620d47..abc3309 100644 +--- a/library/text/parser/feed/tests/tests-safe.ecf ++++ b/library/text/parser/feed/tests/tests-safe.ecf +@@ -6,7 +6,7 @@ + + + +- ++ + + + +diff --git a/tests/all-safe.ecf b/tests/all-safe.ecf +index 0516825..727ff92 100644 +--- a/tests/all-safe.ecf ++++ b/tests/all-safe.ecf +@@ -17,6 +17,7 @@ + + + ++ + + + +@@ -30,6 +31,7 @@ + + + ++ + + + +diff --git a/tests/dev/hello-safe.ecf b/tests/dev/hello-safe.ecf +index 94095cc..e61bc49 100644 +--- a/tests/dev/hello-safe.ecf ++++ b/tests/dev/hello-safe.ecf +@@ -1,14 +1,15 @@ + + + +- ++ + + /EIFGENs$ + /\.git$ + /\.svn$ + + + +@@ -16,20 +17,20 @@ + + + +- ++ + +- ++ + + + +- ++ + + + +- ++ + + + +diff --git a/tests/dev/src/hello_routed_world.e b/tests/dev/src/hello_routed_world.e +index fa588fe..f0d3a62 100644 +--- a/tests/dev/src/hello_routed_world.e ++++ b/tests/dev/src/hello_routed_world.e +@@ -8,243 +8,24 @@ class + HELLO_ROUTED_WORLD + + inherit +- WSF_URI_TEMPLATE_ROUTED_SERVICE +- +- WSF_HANDLER_HELPER +- +- WSF_DEFAULT_SERVICE ++ WSF_DEFAULT_SERVICE [HELLO_ROUTED_WORLD_EXECUTION] ++ redefine ++ initialize ++ end + + create +- make ++ make_and_launch + + feature {NONE} -- Initialization + +- make ++ initialize + do +- initialize_router ++ Precursor + set_service_option ("port", 8099) +- make_and_launch +- end +- +- create_router +- do +- create router.make (5) +- end +- +- setup_router +- local +- ra: WSF_AGENT_HANDLER [WSF_URI_TEMPLATE_HANDLER_CONTEXT] +- hello: WSF_URI_TEMPLATE_ROUTING_HANDLER +- www: WSF_FILE_SYSTEM_HANDLER [WSF_URI_TEMPLATE_HANDLER_CONTEXT] +- do +- router.map_agent ("/refresh", agent execute_refresh) +- router.map_agent ("/home", agent execute_home) +- create www.make (document_root) +- www.set_directory_index (<<"index.html">>) +- +- router.map ("/www{/path}{?query}", www) +- +- --| Map all "/hello*" using a ROUTING_HANDLER +- create hello.make (3) +- router.map ("/hello", hello) +- +- create ra.make (agent handle_hello) +- hello.map ("/hello/{name}.{format}", ra) +- hello.map ("/hello.{format}/{name}", ra) +- hello.map ("/hello/{name}", ra) +- +- create ra.make (agent handle_anonymous_hello) +- hello.map ("/hello", ra) +- hello.map ("/hello.{format}", ra) +- +- --| Various various route, directly on the "router" +- router.map_agent_with_request_methods ("/method/any", agent handle_method_any, Void) +- router.map_agent_with_request_methods ("/method/guess", agent handle_method_get_or_post, <<"GET", "POST">>) +- router.map_agent_with_request_methods ("/method/custom", agent handle_method_get, <<"GET">>) +- router.map_agent_with_request_methods ("/method/custom", agent handle_method_post, <<"POST">>) +- end +- +- +- document_root: READABLE_STRING_8 +- local +- e: EXECUTION_ENVIRONMENT +- dn: DIRECTORY_NAME +- once +- create e +- create dn.make_from_string (e.current_working_directory) +- dn.extend ("htdocs") +- Result := dn.string +- if Result[Result.count] = Operating_environment.directory_separator then +- Result := Result.substring (1, Result.count - 1) +- end +- end +- +-feature -- Execution +- +- +- execute_default (req: WSF_REQUEST; res: WSF_RESPONSE) +- local +- l_url: STRING +- do +- l_url := req.absolute_script_url ("/home") +- res.redirect_now_with_content (l_url, "You are now being redirected to " + l_url, {HTTP_MIME_TYPES}.text_html) +- end +- +- execute_refresh (ctx: WSF_URI_TEMPLATE_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE) +- local +- h: HTTP_HEADER +- l_url: STRING +- e: EXECUTION_ENVIRONMENT +- n: INTEGER +- i: INTEGER +- s: STRING_8 +- do +- l_url := req.absolute_script_url ("/home") +- +- +- +- n := 3 +- create h.make +- h.put_refresh (l_url, 5) +- h.put_location (l_url) +- h.put_content_type_text_plain +- h.put_transfer_encoding_chunked +--- h.put_content_length (0) +--- res.set_status_code ({HTTP_STATUS_CODE}.moved_permanently) +- res.set_status_code ({HTTP_STATUS_CODE}.ok) +- res.put_header_text (h.string) +- +- from +- create e +- create s.make (255) +- until +- n = 0 +- loop +- if n > 1 then +- s.append ("%NRedirected to " + l_url + " in " + n.out + " seconds :%N") +- else +- s.append ("%NRedirected to " + l_url + " in 1 second :%N") +- end +- res.put_chunk (s, Void); s.wipe_out +- from +- i := 1 +- until +- i = 1001 +- loop +- s.append_character ('.') +- if i \\ 100 = 0 then +- s.append_character ('%N') +- end +- res.put_chunk (s, Void); s.wipe_out +- e.sleep (1_000_000) +- i := i + 1 +- end +- n := n - 1 +- end +- s.append ("%NYou are now being redirected...%N") +- res.put_chunk (s, Void); s.wipe_out +- res.put_chunk_end + end + +- execute_home (ctx: WSF_URI_TEMPLATE_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE) +- local +- l_body: STRING_8 +- do +- create l_body.make (255) +- l_body.append ("Hello World ?!%N") +- l_body.append ("

Please try the following links

%N") +- if attached req.item ("REQUEST_COUNT") as rqc then +- l_body.append ("request #"+ rqc.as_string.string + "%N") +- end +- l_body.append ("%N") +- +- res.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/html"], ["Content-Length", l_body.count.out]>>) +- res.put_string (l_body) +- end +- +- execute_hello (req: WSF_REQUEST; res: WSF_RESPONSE; a_name: detachable READABLE_STRING_32; ctx: WSF_HANDLER_CONTEXT) +- local +- l_response_content_type: detachable STRING +- h: HTTP_HEADER +- content_type_supported: ARRAY [STRING] +- l_body: STRING_8 +- do +- if a_name /= Void then +- l_body := "Hello %"" + a_name + "%" !%N" +- else +- l_body := "Hello anonymous visitor !%N" +- end +- content_type_supported := <<{HTTP_MIME_TYPES}.application_json, {HTTP_MIME_TYPES}.text_html, {HTTP_MIME_TYPES}.text_xml, {HTTP_MIME_TYPES}.text_plain>> +- inspect ctx.request_format_id ("format", content_type_supported) +- when {HTTP_FORMAT_CONSTANTS}.json then +- l_response_content_type := {HTTP_MIME_TYPES}.application_json +- l_body := "{%N%"application%": %"/hello%",%N %"message%": %"" + l_body + "%" %N}" +- when {HTTP_FORMAT_CONSTANTS}.html then +- l_response_content_type := {HTTP_MIME_TYPES}.text_html +- when {HTTP_FORMAT_CONSTANTS}.xml then +- l_response_content_type := {HTTP_MIME_TYPES}.text_xml +- l_body := "/hello" + l_body + "%N" +- when {HTTP_FORMAT_CONSTANTS}.text then +- l_response_content_type := {HTTP_MIME_TYPES}.text_plain +- else +- execute_content_type_not_allowed (req, res, content_type_supported, +- <<{HTTP_FORMAT_CONSTANTS}.json_name, {HTTP_FORMAT_CONSTANTS}.html_name, {HTTP_FORMAT_CONSTANTS}.xml_name, {HTTP_FORMAT_CONSTANTS}.text_name>> +- ) +- end +- if l_response_content_type /= Void then +- create h.make +- h.put_content_type (l_response_content_type) +- h.put_content_length (l_body.count) +- res.set_status_code ({HTTP_STATUS_CODE}.ok) +- res.put_header_text (h.string) +- res.put_string (l_body) +- end +- end +- +- handle_hello (ctx: WSF_URI_TEMPLATE_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE) +- do +- execute_hello (req, res, ctx.string_parameter ("name"), ctx) +- end +- +- handle_anonymous_hello (ctx: WSF_URI_TEMPLATE_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE) +- do +- execute_hello (req, res, ctx.string_parameter ("name"), ctx) +- end +- +- handle_method_any (ctx: WSF_URI_TEMPLATE_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE) +- do +- execute_hello (req, res, req.request_method, ctx) +- end +- +- handle_method_get (ctx: WSF_URI_TEMPLATE_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE) +- do +- execute_hello (req, res, "GET", ctx) +- end +- +- +- handle_method_post (ctx: WSF_URI_TEMPLATE_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE) +- do +- execute_hello (req, res, "POST", ctx) +- end +- +- handle_method_get_or_post (ctx: WSF_URI_TEMPLATE_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE) +- do +- execute_hello (req, res, "GET or POST", ctx) +- end +- +- +- + note +- copyright: "2011-2011, Eiffel Software and others" ++ copyright: "2011-2016, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" + source: "[ + Eiffel Software +diff --git a/tests/dev/src/hello_routed_world_execution.e b/tests/dev/src/hello_routed_world_execution.e +new file mode 100644 +index 0000000..6dd3e6d +--- /dev/null ++++ b/tests/dev/src/hello_routed_world_execution.e +@@ -0,0 +1,272 @@ ++note ++ description : "Objects that ..." ++ author : "$Author$" ++ date : "$Date$" ++ revision : "$Revision$" ++ ++class ++ HELLO_ROUTED_WORLD_EXECUTION ++ ++inherit ++ WSF_ROUTED_EXECUTION ++ redefine ++ execute_default ++ end ++ ++ WSF_URI_TEMPLATE_HELPER_FOR_ROUTED_EXECUTION ++ ++create ++ make ++ ++feature {NONE} -- Initialization ++ ++ setup_router ++ local ++ ra: WSF_URI_TEMPLATE_AGENT_HANDLER ++ hello: WSF_URI_TEMPLATE_ROUTING_HANDLER ++ www: WSF_FILE_SYSTEM_HANDLER ++ do ++ map_uri_template_agent ("/refresh", agent execute_refresh, Void) ++ map_uri_template_agent ("/home", agent execute_home, Void) ++ create www.make (document_root) ++ www.set_directory_index (<<"index.html">>) ++ router.handle ("/www{/path}{?query}", www, Void) ++ ++ --| Map all "/hello*" using a ROUTING_HANDLER ++ create hello.make (3) ++ router.handle ("/hello", hello, Void) ++ ++ create ra.make (agent handle_hello) ++ hello.router.handle ("/hello/{name}.{format}", ra, Void) ++ hello.router.handle ("/hello.{format}/{name}", ra, Void) ++ hello.router.handle ("/hello/{name}", ra, Void) ++ ++ create ra.make (agent handle_anonymous_hello) ++ hello.router.handle ("/hello", ra, Void) ++ hello.router.handle ("/hello.{format}", ra, Void) ++ ++ --| Various various route, directly on the "router" ++ map_uri_template_agent ("/method/any", agent handle_method_any, Void) ++ map_uri_template_agent ("/method/guess", agent handle_method_get_or_post, <<"GET", "POST">>) ++ map_uri_template_agent ("/method/custom", agent handle_method_get, <<"GET">>) ++ map_uri_template_agent ("/method/custom", agent handle_method_post, <<"POST">>) ++ end ++ ++ ++ document_root: READABLE_STRING_8 ++ local ++ e: EXECUTION_ENVIRONMENT ++ dn: DIRECTORY_NAME ++ once ++ create e ++ create dn.make_from_string (e.current_working_directory) ++ dn.extend ("htdocs") ++ Result := dn.string ++ if Result[Result.count] = Operating_environment.directory_separator then ++ Result := Result.substring (1, Result.count - 1) ++ end ++ end ++ ++feature -- Execution ++ ++ ++ execute_default (req: WSF_REQUEST; res: WSF_RESPONSE) ++ local ++ l_url: STRING ++ do ++ l_url := req.absolute_script_url ("/home") ++ res.redirect_now_with_content (l_url, "You are now being redirected to " + l_url, {HTTP_MIME_TYPES}.text_html) ++ end ++ ++ execute_refresh (req: WSF_REQUEST; res: WSF_RESPONSE) --ctx: WSF_URI_TEMPLATE_HANDLER_CONTEXT; ++ local ++ h: HTTP_HEADER ++ l_url: STRING ++ e: EXECUTION_ENVIRONMENT ++ n: INTEGER ++ i: INTEGER ++ s: STRING_8 ++ do ++ l_url := req.absolute_script_url ("/home") ++ ++ ++ ++ n := 3 ++ create h.make ++ h.put_refresh (l_url, 5) ++ h.put_location (l_url) ++ h.put_content_type_text_plain ++ h.put_transfer_encoding_chunked ++-- h.put_content_length (0) ++-- res.set_status_code ({HTTP_STATUS_CODE}.moved_permanently) ++ res.set_status_code ({HTTP_STATUS_CODE}.ok) ++ res.put_header_text (h.string) ++ ++ from ++ create e ++ create s.make (255) ++ until ++ n = 0 ++ loop ++ if n > 1 then ++ s.append ("%NRedirected to " + l_url + " in " + n.out + " seconds :%N") ++ else ++ s.append ("%NRedirected to " + l_url + " in 1 second :%N") ++ end ++ res.put_chunk (s, Void); s.wipe_out ++ from ++ i := 1 ++ until ++ i = 1001 ++ loop ++ s.append_character ('.') ++ if i \\ 100 = 0 then ++ s.append_character ('%N') ++ end ++ res.put_chunk (s, Void); s.wipe_out ++ e.sleep (1_000_000) ++ i := i + 1 ++ end ++ n := n - 1 ++ end ++ s.append ("%NYou are now being redirected...%N") ++ res.put_chunk (s, Void); s.wipe_out ++ res.put_chunk_end ++ end ++ ++ execute_home (req: WSF_REQUEST; res: WSF_RESPONSE) -- ctx: WSF_URI_TEMPLATE_HANDLER_CONTEXT; ++ local ++ l_body: STRING_8 ++ do ++ create l_body.make (255) ++ l_body.append ("Hello World ?!%N") ++ l_body.append ("

Please try the following links

%N") ++ if attached req.item ("REQUEST_COUNT") as rqc then ++ l_body.append ("request #"+ rqc.as_string.url_encoded_value + "%N") ++ end ++ l_body.append ("%N") ++ ++ res.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/html"], ["Content-Length", l_body.count.out]>>) ++ res.put_string (l_body) ++ end ++ ++ execute_hello (req: WSF_REQUEST; res: WSF_RESPONSE; a_name: detachable READABLE_STRING_32) ++ local ++ l_response_content_type: detachable STRING ++ h: HTTP_HEADER ++ content_type_supported: ARRAY [STRING] ++ l_body: STRING_8 ++ l_format: detachable READABLE_STRING_GENERAL ++ l_http_format_constants: HTTP_FORMAT_CONSTANTS ++ do ++ if a_name /= Void then ++ l_body := "Hello %"" + a_name + "%" !%N" ++ else ++ l_body := "Hello anonymous visitor !%N" ++ end ++ content_type_supported := <<{HTTP_MIME_TYPES}.application_json, {HTTP_MIME_TYPES}.text_html, {HTTP_MIME_TYPES}.text_xml, {HTTP_MIME_TYPES}.text_plain>> ++ if attached {WSF_STRING} req.path_parameter ("format") as s_format then ++ l_format := s_format.value ++ end ++ if l_format = Void then ++ across ++ content_type_supported as ic ++ until ++ l_format /= Void ++ loop ++ if req.is_content_type_accepted (ic.item) then ++ l_format := ic.item ++ end ++ end ++ end ++ if l_format /= Void then ++ create l_http_format_constants ++ inspect ++ l_http_format_constants.format_id (l_format) ++ when {HTTP_FORMAT_CONSTANTS}.json then ++ l_response_content_type := {HTTP_MIME_TYPES}.application_json ++ l_body := "{%N%"application%": %"/hello%",%N %"message%": %"" + l_body + "%" %N}" ++ when {HTTP_FORMAT_CONSTANTS}.html then ++ l_response_content_type := {HTTP_MIME_TYPES}.text_html ++ when {HTTP_FORMAT_CONSTANTS}.xml then ++ l_response_content_type := {HTTP_MIME_TYPES}.text_xml ++ l_body := "/hello" + l_body + "%N" ++ when {HTTP_FORMAT_CONSTANTS}.text then ++ l_response_content_type := {HTTP_MIME_TYPES}.text_plain ++ else ++ l_response_content_type := Void ++ end ++ end ++ ++ if l_response_content_type /= Void then ++ create h.make ++ h.put_content_type (l_response_content_type) ++ h.put_content_length (l_body.count) ++ res.set_status_code ({HTTP_STATUS_CODE}.ok) ++ res.put_header_text (h.string) ++ res.put_string (l_body) ++ else ++ res.send (create {WSF_PRECONDITION_FAILED_MESSAGE}.make (req)) -- FIXME: better error message! ++ end ++ end ++ ++ string_path_parameter (req: WSF_REQUEST; a_name: READABLE_STRING_GENERAL): detachable STRING_32 ++ do ++ if attached {WSF_STRING} req.path_parameter (a_name) as s then ++ Result := s.value ++ end ++ end ++ ++ handle_hello (req: WSF_REQUEST; res: WSF_RESPONSE) ++ do ++ execute_hello (req, res, string_path_parameter (req, "name")) ++ end ++ ++ handle_anonymous_hello (req: WSF_REQUEST; res: WSF_RESPONSE) ++ do ++ execute_hello (req, res, string_path_parameter (req, "name")) ++ end ++ ++ handle_method_any (req: WSF_REQUEST; res: WSF_RESPONSE) ++ do ++ execute_hello (req, res, req.request_method) ++ end ++ ++ handle_method_get (req: WSF_REQUEST; res: WSF_RESPONSE) ++ do ++ execute_hello (req, res, "GET") ++ end ++ ++ ++ handle_method_post (req: WSF_REQUEST; res: WSF_RESPONSE) ++ do ++ execute_hello (req, res, "POST") ++ end ++ ++ handle_method_get_or_post (req: WSF_REQUEST; res: WSF_RESPONSE) ++ do ++ execute_hello (req, res, "GET or POST") ++ end ++ ++ ++ ++note ++ copyright: "2011-2016, 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 +diff --git a/tools/install_ewf.bat b/tools/install_ewf.bat +index ae26e20..dd1fa88 100644 +--- a/tools/install_ewf.bat ++++ b/tools/install_ewf.bat +@@ -59,6 +59,8 @@ echo Install library: ewf/wsf + %COPYCMD% %TMP_DIR%\library\server\wsf %TMP_CONTRIB_DIR%\library\web\framework\ewf\wsf + echo Install library: ewf/wsf_extension + %COPYCMD% %TMP_DIR%\library\server\wsf_extension %TMP_CONTRIB_DIR%\library\web\framework\ewf\wsf_extension ++echo Install library: ewf/wsf_proxy ++%COPYCMD% %TMP_DIR%\library\server\wsf_proxy %TMP_CONTRIB_DIR%\library\web\framework\ewf\wsf_proxy + echo Install library: ewf/wsf_html + %COPYCMD% %TMP_DIR%\library\server\wsf_html %TMP_CONTRIB_DIR%\library\web\framework\ewf\wsf_html + echo Install library: ewf/encoder diff --git a/examples/_update_needed/filter/filter.ecf b/examples/_update_needed/filter/filter.ecf index a744002a..30112b5c 100644 --- a/examples/_update_needed/filter/filter.ecf +++ b/examples/_update_needed/filter/filter.ecf @@ -1,6 +1,6 @@ - + /EIFGENs$ /\.git$ diff --git a/examples/_update_needed/filter/filter.rc b/examples/_update_needed/filter/filter.rc new file mode 100644 index 00000000..b0ec159c --- /dev/null +++ b/examples/_update_needed/filter/filter.rc @@ -0,0 +1,6 @@ +#include + +STRINGTABLE +BEGIN + 1 "This Program was made using EiffelStudio using Visual Studio C++" +END diff --git a/examples/debug/debug.ecf b/examples/debug/debug.ecf index 3ae5670e..3365d92b 100644 --- a/examples/debug/debug.ecf +++ b/examples/debug/debug.ecf @@ -2,7 +2,7 @@ - /.svn$ + /\.svn$ /CVS$ /EIFGENs$ diff --git a/examples/desktop_app/desktop_app.ecf b/examples/desktop_app/desktop_app.ecf index 7ac9e546..32bd16df 100644 --- a/examples/desktop_app/desktop_app.ecf +++ b/examples/desktop_app/desktop_app.ecf @@ -16,7 +16,7 @@ - /.svn$ + /\.svn$ /CVS$ /EIFGENs$ diff --git a/examples/form/form.ecf b/examples/form/form.ecf index 1c37da33..1c912357 100644 --- a/examples/form/form.ecf +++ b/examples/form/form.ecf @@ -2,7 +2,7 @@ - /.svn$ + /\.svn$ /CVS$ /EIFGENs$ diff --git a/examples/form/form.rc b/examples/form/form.rc new file mode 100644 index 00000000..b0ec159c --- /dev/null +++ b/examples/form/form.rc @@ -0,0 +1,6 @@ +#include + +STRINGTABLE +BEGIN + 1 "This Program was made using EiffelStudio using Visual Studio C++" +END diff --git a/examples/obsolete/v0/filter/filter.ecf b/examples/obsolete/v0/filter/filter.ecf index 5522c5e7..5b26d48d 100644 --- a/examples/obsolete/v0/filter/filter.ecf +++ b/examples/obsolete/v0/filter/filter.ecf @@ -1,6 +1,6 @@ - + /EIFGENs$ /\.git$ @@ -24,14 +24,18 @@ + + + + + + - - diff --git a/examples/obsolete/v0/filter/src/filter_server.e b/examples/obsolete/v0/filter/src/filter_server.e index dfc9f8fe..3c7de0a3 100644 --- a/examples/obsolete/v0/filter/src/filter_server.e +++ b/examples/obsolete/v0/filter/src/filter_server.e @@ -84,7 +84,7 @@ feature {NONE} -- Initialization create l_methods l_methods.enable_options l_methods.enable_get - router.handle_with_request_methods ("/user/{userid}", create {WSF_URI_TEMPLATE_AGENT_HANDLER}.make (agent l_options_filter.execute), l_methods) + router.handle ("/user/{userid}", create {WSF_URI_TEMPLATE_AGENT_HANDLER}.make (agent l_options_filter.execute), l_methods) end initialize_json @@ -99,7 +99,7 @@ feature {NONE} -- Implementation -- Port number note - copyright: "2011-2014, Olivier Ligot, Jocelyn Fiat and others" + copyright: "2011-2017, Olivier Ligot, Jocelyn Fiat and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software diff --git a/examples/obsolete/v0/filter/src/resource/user_handler.e b/examples/obsolete/v0/filter/src/resource/user_handler.e index 722ccd03..bf20bec3 100644 --- a/examples/obsolete/v0/filter/src/resource/user_handler.e +++ b/examples/obsolete/v0/filter/src/resource/user_handler.e @@ -42,7 +42,7 @@ feature -- Basic operations id : STRING do if attached req.orig_path_info as orig_path then - id := get_user_id_from_path (orig_path) + id := get_user_id_from_path (orig_path.as_string_32) if attached retrieve_user (id) as l_user then if l_user ~ req.execution_variable ("user") then compute_response_get (req, res, l_user) @@ -92,6 +92,6 @@ feature {NONE} -- Implementation end note - copyright: "2011-2013, Olivier Ligot, Jocelyn Fiat and others" + copyright: "2011-2017, Olivier Ligot, Jocelyn Fiat and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" end diff --git a/examples/obsolete/v0/restbucksCRUD/client/client.ecf b/examples/obsolete/v0/restbucksCRUD/client/client.ecf index 6f34e95e..f60278f9 100644 --- a/examples/obsolete/v0/restbucksCRUD/client/client.ecf +++ b/examples/obsolete/v0/restbucksCRUD/client/client.ecf @@ -3,8 +3,8 @@ - /.git$ - /.svn$ + /\.git$ + /\.svn$ /EIFGENs$