Compare commits

..

1 Commits

Author SHA1 Message Date
91fbb3866f Experimentation of WSF_EXECUTOR.execute (req, res) 2015-06-18 14:49:29 +02:00
72 changed files with 783 additions and 982 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -1,4 +1,4 @@
Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query Parameter](/doc/workbook/handling_request/form.md)
Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query Parameter](/workbook/handling_request/form.md)
## EWF basic service
@@ -14,66 +14,104 @@ Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query Parameter](/doc
<a name="structure"/>
## EWF service structure
The following code describes the basic structure of an EWF basic service that handles HTTP requests. We will need to define a Service Launcher and a Request Execution implementation.
The following code describes the basic structure of an EWF basic service that handles HTTP requests.
```eiffel
class
APPLICACTION
SERVICE_TEMPLATE
inherit
WSF_DEFAULT_SERVICE [APPLICATION_EXECUTION]
WSF_DEFAULT_SERVICE -- Todo explain this, and the concept of launchers and connectors ()
create
make_and_launch
end
```
The class ```APPLICATION``` inherit from
```WSF_DEFAULT_SERVICE [G ->WSF_EXECUTION create make end]``` it will be responsible to launch the service and set optional options.
The class ```APPLICATION_EXECUTION``` is an implementation of ```WSF_EXECUTION``` interface, which is instantiated for each incoming request.
```eiffel
class
APPLICATION_EXECUTION
inherit
WSF_EXECUTION
create
make
make_and_launch
feature -- Basic operations
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
do
-- To read incoming HTTP request, we need to use `req'
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
do
-- To read incoming HTTP request, we need to use `req'
-- May require talking to databases or other services.
-- To send a response we need to setup, the status code and
-- the response headers and the content we want to send out our client
end
-- May require talking to databases or other services.
-- To send a response we need to setup, the status code and
-- the response headers and the content we want to send out our client
end
end
```
When using the "nino" connector or the new "standalone" connector, by default the service listens on port 80, but often this port is already used by other applications, so it is recommended to use another port.
When using the "nino" connector, by default the service listens on port 80, but often this port is already used by other applications, so it is recommended to use another port.
To define another port, redefine the feature `initialize' and set up a new port number using the service options (see below).
```eiffel
class
APPLICATION
SERVICE_TEMPLATE
inherit
WSF_DEFAULT_SERVICE [APPLICATION_EXECUTION]
redefine
WSF_DEFAULT_SERVICE
redefine
initialize
end
create
make_and_launch
make_and_launch
feature {NONE} -- Initialization
initialize
-- Initialize current service.
-- on port 9090
do
set_service_option ("port", 9090)
end
feature -- Basic operations
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the incoming request.
do
-- To read incoming HTTP requires, we need to use `req'
-- May require talking to databases or other services.
-- To send a response we need to setup, the status code and
-- the response headers and the content we want to send out client
end
end
```
The **WSF_REQUEST** gives access to the incoming data; the class provides features to get information such as request method, form data, query parameters, uploaded files, HTTP request headers, and hostname of the client among others.
The **WSF_RESPONSE** provides features to define the response with information such as HTTP status codes (10x,20x, 30x, 40x, and 50x), response headers (Content-Type, Content-Length, etc.) and obviously the body of the message itself.
**SERVICE_TEMPLATE** is the root class of our example, it launches the application, using the corresponding connector, Which connector? this depends how you want to run it cgi, fcgi or nino. For development is recommended to use Nino, a standalone web server written in Eiffel, and run the execution within the EiffelStudio debugger. For production fcgi (or cgi) using Apache or another popular web server.
The **SERVICE_TEMPLATE** class inherits from _WSF_DEFAULT_SERVICE_ class, and this one also inherits from other interfaces. Lets describe them in a few words.
![Service Template Hierarchy](/workbook/SERVICE_TEMPLATE.png "Service Template")
**WS_LAUNCHABLE_SERVICE** inherit from **WS_SERVICE** class, which is the low level entry point in EWF, handling each incoming request with a single procedure ```execute (req: WSF_REQUEST; res: WSF_RESPONSE) ...```. And also provides a way to launch our application using different kind of connectors. Below a [BON diagram] (http://www.bon-method.com/index_normal.htm) showing the different kind of connectors.
![Launcher Hierarchy](/app/doc/WSF_SERVICE_LAUNCHER.png "Launcher")
A basic EWF service inherits from **WSF_DEFAULT_SERVICE** (for other options see [?]).
And then you only need to implement the **execute** feature, get data from the request *req* and write the response in *res*.
<a name="text"/>
## A simple Service to Generate Plain Text.
Before to continue, it is recommended to review the getting started guided.
```eiffel
class
APPLICATION
inherit
WSF_DEFAULT_SERVICE
redefine
initialize
end
create
make_and_launch
feature {NONE} -- Initialization
@@ -82,72 +120,27 @@ feature {NONE} -- Initialization
do
set_service_option ("port", 9090)
end
end
```
The **WSF_REQUEST** gives access to the incoming data; the class provides features to get information such as request method, form data, query parameters, uploaded files, HTTP request headers, and hostname of the client among others.
The **WSF_RESPONSE** provides features to define the response with information such as HTTP status codes (10x,20x, 30x, 40x, and 50x), response headers (Content-Type, Content-Length, etc.) and obviously the body of the message itself.
**APPLICATION** is the root class of our example, it launches the application, using the corresponding connector, Which connector? this depends how you want to run it cgi, fcgi,nino or standalone. For development is recommended to use a standalone web server written in Eiffel, and run the execution within the EiffelStudio debugger. For production fcgi (or cgi) using Apache or another popular web server.
![Launcher Hierarchy](/doc/workbook/basics/Launcher Hierarchy.png "Launcher Hierarchy")
**WS_LAUNCHABLE_SERVICE** inherit from **WS_SERVICE** class, which is a marker interface in EWF. And also provides a way to launch our application using different kind of connectors. The class **WSF_DEFAULT_SERVICE_I**, inherit from **WS_LAUNCHABLE_SERVICE** and has a formal generic that should conform to **WSF_SERVICE_LAUNCHER [WSF_EXECUTION]**. Below a [BON diagram] (http://www.bon-method.com/index_normal.htm) showing one of the possible options.
![Standalone Launcher](/doc/workbook/basics/WSF_SERVICE_LAUNCHER_STANDALONE.png "Standalone Hierarchy")
Other connectors:
**WSF_STANDALONE_SERVICE_LAUNCHER**
**WSF_CGI_SERVICE_LAUNCHER**
**WSF_NINO_SERVICE_LAUNCHER**
**WSF_LIBFCGI_SERVICE_LAUNCHER**
A basic EWF service inherits from **WSF_DEFAULT_SERVICE**, which has a formal generic that should conform to **WSF_EXECUTION** class with a `make' creation procedure, in our case the class **APPLICATION_EXECUTION**.
The **APPLICATION_EXECUTION** class inherits from **WSF_EXECUTION** interface, which is instantiated for each incoming request. **WSF_EXECUTION** inherit from **WGI_EXECUTION** which is the low level entry point in EWF, handling each incoming request with a single procedure ```execute (req: WSF_REQUEST; res: WSF_RESPONSE) ...```.
In the **APPLICATION_EXECUTION** class class you will need to implement implement the **execute** feature, get data from the request *req* and write the response in *res*.
![Execution Hierarchy](/doc/workbook/basics/APPLICATION_EXECUTION.png "Application Execution ")
The WSF_EXECUTION instance, in this case ```APPLICATION_EXECUTION``` is created per request, with two main attributes request: ```WSF_REQUEST``` and response: ```WSF_RESPONSE```.
<a name="text"/>
## A simple Service to Generate Plain Text.
Before to continue, it is recommended to review the getting started guided. In the example we will only shows the implementation of the WSF_EXECUTION interface.
```eiffel
class
APPLICATION_EXECUTION
inherit
WSF_EXECUTION
create
make
feature -- Basic operations
execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the incomming request
do
-- To send a response we need to setup, the status code and
-- the response headers.
response.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/plain"], ["Content-Length", "11"]>>)
response.put_string ("Hello World")
res.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/plain"], ["Content-Length", "11"]>>)
res.put_string ("Hello World")
end
end
end
```
<a name="source_1"></a>
##### Source code
The source code is available on Github. You can get it by running the command:
```git clone https://github.com/EiffelWebFramework/ewf.git```
```git clone https://github.com/EiffelWebFramework/ewf_examples.git```
The example of simple service that generate plain text response is located in the directory $PATH/ewd/doc/workbook/basics/simple, where $PATH is where you run ```git clone``` . Just double click on the simple.ecf file and select the simple_nino target or if you prefer the command line, run the command:
The example of simple service that generate plain text response is located in the directory $PATH/ewf_examples/workbook/basics/simple, where $PATH is where you run ```git clone``` . Just double click on the simple.ecf file and select the simple_nino target or if you prefer the command line, run the command:
```estudio -config simple.ecf -target simple_nino```
@@ -160,25 +153,37 @@ To generate HTML, it's needed
```eiffel
class
APPLICATION_EXECUTION
APPLICATION
inherit
WSF_EXECUTION
WSF_DEFAULT_SERVICE
redefine
initialize
end
create
make
make_and_launch
feature {NONE} -- Initialization
initialize
-- Initialize current service.
do
set_service_option ("port", 9090)
end
feature -- Basic operations
execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute the incomming request
do
-- To send a response we need to setup, the status code and
-- the response headers.
response.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/html"], ["Content-Length", web_page.count.out]>>)
response.put_string (web_page)
res.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/html"], ["Content-Length", web_page.count.out]>>)
res.put_string (web_page)
end
web_page: STRING = "[
<!DOCTYPE html>
<html>
@@ -196,11 +201,11 @@ end
##### Source code
The source code is available on Github. You can get it by running the command:
```git clone https://github.com/EiffelWebFramework/ewf.git```
```git clone https://github.com/EiffelWebFramework/ewf_examples.git```
The example of the service that generates HTML is located in the directory $PATH/ewf/doc/workbook/basics/simple_html, where $PATH is where you run ```git clone``` . Just double click on the simple_html.ecf file and select the simple_html_nino target or if you prefer the command line, run the command:
The example of the service that generates HTML is located in the directory $PATH/ewf_examples/workbook/basics/simple_html, where $PATH is where you run ```git clone``` . Just double click on the simple_html.ecf file and select the simple_html_nino target or if you prefer the command line, run the command:
```estudio -config simple_html.ecf -target simple_html_nino```
Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query Parameter](/doc/workbook/handling_request/form.md)
Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query Parameter](/workbook/handling_request/form.md)

View File

@@ -22,4 +22,5 @@ feature -- Basic operations
response.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/plain"], ["Content-Length", "11"]>>)
response.put_string ("Hello World")
end
end

View File

@@ -37,14 +37,6 @@
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
<cluster name="simple" location=".\" recursive="true"/>
</target>
<target name="simple_standalone" extends="common">
<root class="APPLICATION" feature="make_and_launch"/>
<option warning="true" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
</option>
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
<cluster name="simple" location=".\" recursive="true"/>
</target>
<target name="simple" extends="simple_nino">
</target>
</system>

View File

@@ -1,5 +1,5 @@
Nav: [Workbook](../workbook.md) | [Handling Requests: Header Fields](/doc/workbook/handling_request/headers.md) | [Handling Cookies](/doc/workbook/handling_cookies/handling_cookies.md)
Nav: [Workbook](../workbook.md) | [Handling Requests: Header Fields](/workbook/handling_request/headers.md) | [Handling Cookies](/workbook/handling_cookies/handling_cookies.md)
## EWF Generating Response
@@ -164,13 +164,24 @@ Note: use ```res.set_status_code({HTTP_STATUS_CODE}.bad_request)``` rather than
Basic Service that builds a simple web page to show the most common status codes
```eiffel
class
APPLICATION_EXECUTION
APPLICATION
inherit
WSF_EXECUTION
WSF_DEFAULT_SERVICE
redefine
initialize
end
create
make
make_and_launch
feature {NONE} -- Initialization
initialize
-- Initialize current service.
do
set_service_option ("port", 9090)
end
feature -- Basic operations
@@ -310,13 +321,24 @@ note
revision : "$Revision$"
class
APPLICATION_EXECUTION
APPLICATION
inherit
WSF_EXECUTION
WSF_DEFAULT_SERVICE
redefine
initialize
end
create
make
make_and_launch
feature {NONE} -- Initialization
initialize
-- Initialize current service.
do
set_service_option ("port", 9090)
end
feature -- Basic operations
@@ -996,4 +1018,4 @@ There are four categories for response header fields:
Nav: [Workbook](../workbook.md) | [Handling Requests: Header Fields](/doc/workbook/handling_request/headers.md) | [Handling Cookies](/doc/workbook/handling_cookies/handling_cookies.md)
| [Handling Requests: Header Fields](/workbook/handling_request/headers.md) | [Handling Cookies](/workbook/handling_cookies/handling_cookies.md)

View File

@@ -1,4 +1,4 @@
Nav: [Workbook](../workbook.md) | [Generating Responses](/doc/workbook/generating_response/generating_response.md)
Nav: [Workbook](../workbook.md) | [Generating Responses](/workbook/generating_response/generating_response.md)
# Handling Cookies
@@ -146,13 +146,25 @@ note
revision : "$Revision$"
class
APPLICATION_EXECUTION
APPLICATION
inherit
WSF_EXECUTION
WSF_DEFAULT_SERVICE
redefine
initialize
end
create
make
make_and_launch
feature {NONE} -- Initialization
initialize
-- Initialize current service.
do
set_service_option ("port", 9090)
set_service_option ("verbose",True)
end
feature -- Basic operations
@@ -285,4 +297,4 @@ end
```
Nav: [Workbook](../workbook.md) | [Generating Responses](/doc/workbook/generating_response/generating_response.md)
Nav: [Workbook](../workbook.md) | [Generating Responses](/workbook/generating_response/generating_response.md)

View File

@@ -1,4 +1,4 @@
Nav: [Workbook](../workbook.md) | [Basic Concepts] (/doc/workbook/basics/basics.md) | [Handling Requests: Header Fields](/doc/workbook/handling_request/headers.md)
Nav: [Workbook](../workbook.md) | [Basic Concepts] (/workbook/basics/basics.md) | [Handling Requests: Header Fields](/workbook/handling_request/headers.md)
#Handling Requests: Form/Query Data
@@ -285,23 +285,25 @@ and a simple message.
```
The source code is available on Github. You can get it by running the command:
```git clone https://github.com/EiffelWebFramework/ewf.git```
```git clone https://github.com/EiffelWebFramework/ewf_examples.git```
The example is located in the directory $PATH/ewf/doc/workbook/upload_file where $PATH is where you run git clone.
The example is located in the directory $PATH/ewf_examples/workbook/upload_file where $PATH is where you run git clone.
<a name=examples>
## Examples
The source code is available on Github. You can get it by running the command:
```git clone https://github.com/EiffelWebFramework/ewf.git```
```git clone https://github.com/EiffelWebFramework/ewf_examples.git```
The GET example is located in the directory $PATH/ewf/doc/workbook/form/get, and the post example is located in the directory $PATH/ewf_examples/workbook/form/post where $PATH is where you run git clone . To run open it using Eiffel Studio or just run theg following command
The GET example is located in the directory $PATH/ewf_examples/workbook/form/get, and the post example is located in the directory $PATH/ewf_examples/workbook/form/post where $PATH is where you run git clone . To run open it using Eiffel Studio or just run theg following command
```estudio -config <ecf_name>.ecf -target <target_name>```
>Note: replace <ecf_name> and<target_name> with the corresponding values.
Nav: [Workbook](../workbook.md) | [Basic Concepts] (/doc/workbook/basics/basics.md) | [Handling Requests: Header Fields](/doc/workbook/handling_request/headers.md)
Nav: [Workbook](../workbook.md) | [Basic Concepts] (/workbook/basics/basics.md) | [Handling Requests: Header Fields](/workbook/handling_request/headers.md)

View File

@@ -1,4 +1,4 @@
Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query parameters] (/doc/workbook/handling_request/form.md) | [Generating Responses](/doc/workbook/generating_response/generating_response.md)
Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query parameters] (/workbook/handling_request/form.md) | [Generating Responses](/workbook/generating_response/generating_response.md)
#Handling Requests: Headers
@@ -165,26 +165,35 @@ included in the Referer header when the browser requests Web page B.
* [User-Agent](https://httpwg.github.io/specs/rfc7231.html#header.user-agent)
- The "User-Agent" header field contains information about the user agent of the request, which is often used by servers to help identify the scope of reported interoperability problems, to work around or tailor responses to avoid particular user agent limitations, and for analytics regarding browser or operating system use or device.
**Note**: the example shows the **WSF_EXECUTION** implementation, that will be used by the service launcher.
<a name="example"></a>
#### Building a Table of All Request Headers
The following [EWF service](/doc/workbook/handling_request/headers/header_fields/application.e) code simply uses an ```html_template``` to fill a table (names and values) with all the headers fields it receives.
The following [EWF service](./headers/header_fields/application.e) code simply uses an ```html_template``` to fill a table (names and values) with all the headers fields it receives.
The service accomplishes this task by calling ```req.meta_variables``` feature to get an ```ITERABLE [WSF_STRING]```, an structure that can be iterated over using ```across...loop...end```, then it checks if the name has the prefix ```HTTP_``` and if it is true, put the header name and value in a row. (the name in the left cell, the value in the right cell).
The service also writes three components of the main request line (method, URI, and protocol), and also the raw header.
```eiffel
class
APPLICATION_EXECUTION
APPLICATION
inherit
WSF_EXECUTION
WSF_DEFAULT_SERVICE
redefine
initialize
end
create
make
make_and_launch
feature {NONE} -- Initialization
initialize
-- Initialize current service.
do
set_service_option ("port", 9090)
set_service_option ("verbose", true)
end
feature -- Basic operations
@@ -284,21 +293,32 @@ To be completed.
#### Detecting Browser Types
The User-Agent header identifies the specific browser/client that is sending the request. The following code shows a [EWF service](/doc/workbook/handling_request/headers/browser_name/application.e) that sends browser-specific responses.
The User-Agent header identifies the specific browser/client that is sending the request. The following code shows a [EWF service](./headers/browser_name/application.e) that sends browser-specific responses.
The examples uses the ideas based on the [Browser detection using the user agent](https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent) article.
Basically the code check if the header user_agent exist and then call the ```browser_name (a_user_agent: READABLE_STRING_8): READABLE_STRING_32```
feature to retrieve the current browser name or Unknown in other case.
```eiffel
class
APPLICATION_EXECUTION
APPLICATION
inherit
WSF_EXECUTION
WSF_DEFAULT_SERVICE
redefine
initialize
end
create
make
make_and_launch
feature {NONE} -- Initialization
initialize
-- Initialize current service.
do
set_service_option ("port", 9090)
set_service_option ("verbose", true)
end
feature -- Basic operations
@@ -309,8 +329,8 @@ feature -- Basic operations
l_page_response: STRING
l_rows: STRING
do
create l_page_response.make_from_string (html_template)
if req.path_info.same_string ("/") then
create l_page_response.make_from_string (html_template)
if req.path_info.same_string ("/") then
-- retrieve the user-agent
if attached req.http_user_agent as l_user_agent then
@@ -384,7 +404,7 @@ end
```
Let see some results, we will show the html returned
**Internet Explorer**
Internet Explorer
---
```
<h1>EWF service example: Showing Browser Dectection Using User-Agent</h1></br>
@@ -394,7 +414,7 @@ Let see some results, we will show the html returned
<h2> Enjoy using Internet Explorer </h2>
```
**Chrome**
Chrome
---
```
<h1>EWF service example: Showing Browser Dectection Using User-Agent</h1></br>
@@ -428,11 +448,10 @@ As an exercise, try to write a similar service to retrieve the OS family using t
* [SERVER_PROTOCOL](https://tools.ietf.org/html/rfc3875#section-4.1.15)
* [SERVER_SOFTWARE](https://tools.ietf.org/html/rfc3875#section-4.1.16)
**Example**
An [EWF service](/doc/workbook/handling_request/headers/cgi_variables/application.e) that shows the CGI variables, creates a table showing the values of all the CGI variables.
An [EWF service](./headers/cgi_variables/application.e) that shows the CGI variables, creates a table showing the values of all the CGI variables.
Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query parameters] (/doc/workbook/handling_request/form.md) | [Generating Responses](/doc/workbook/generating_response/generating_response.md)
Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query parameters] (/workbook/handling_request/form.md) | [Generating Responses](/workbook/generating_response/generating_response.md)

View File

@@ -19,20 +19,20 @@ Before reading (or walking throught) the workbook, to get a quick overview of EW
<a name="introduction"></a>
## Introduction
[Basic Concepts] (/doc/workbook/basics/basics.md).
[Basic Concepts] (/workbook/basics/basics.md).
<a name="form_query_parameters"></a>
## Handling Requests: Form/Query Parameter
[Handling Requests: Form/Query Parameter] (/doc/workbook/handling_request/form.md).
[Handling Requests: Form/Query Parameter] (/workbook/handling_request/form.md).
<a name="header_fields"></a>
## Handling Requests: Header Fields
[Handling Requests: Header Fields](/doc/workbook/handling_request/headers.md).
[Handling Requests: Header Fields](/workbook/handling_request/headers.md).
<a name="header_fields"></a>
## Generating Response
[Generating Responses](/doc/workbook/generating_response/generating_response.md)
[Generating Responses](/workbook/generating_response/generating_response.md)
## Handling Cookies
[Handling Cookies](/doc/workbook/handling_cookies/handling_cookies.md)
[Handling Cookies](/workbook/handling_cookies/handling_cookies.md)

View File

@@ -24,7 +24,7 @@ feature {NONE} -- Initialization
setup_router
do
-- router.map (create {WSF_URI_MAPPING}.make ("/hello", create {WSF_AGENT_URI_HANDLER}.make (agent execute_hello)))
map_uri_agent ("/hello", agent execute_hello, Void)
map_uri_agent ("/hello", agent execute_hello)
-- router.map (create {WSF_URI_TEMPLATE_MAPPING}.make ("/users/{user}/message/{mesgid}", create {USER_MESSAGE_HANDLER}), router.methods_HEAD_GET_POST)
map_uri_template ("/users/{user}/message/{mesgid}", create {USER_MESSAGE_HANDLER}, router.methods_HEAD_GET_POST)

View File

@@ -361,7 +361,7 @@ feature {NONE} -- Implementation
when 5 then s.append ("May")
when 6 then s.append ("Jun")
when 7 then s.append ("Jul")
when 8 then s.append ("Aug")
when 8 then s.append ("Aou")
when 9 then s.append ("Sep")
when 10 then s.append ("Oct")
when 11 then s.append ("Nov")
@@ -487,7 +487,7 @@ feature {NONE} -- Implementation
elseif l_mmm.same_string ("MAY") then l_mo := 05
elseif l_mmm.same_string ("JUN") then l_mo := 06
elseif l_mmm.same_string ("JUL") then l_mo := 07
elseif l_mmm.same_string ("AUG") then l_mo := 08
elseif l_mmm.same_string ("AOU") then l_mo := 08
elseif l_mmm.same_string ("SEP") then l_mo := 09
elseif l_mmm.same_string ("OCT") then l_mo := 10
elseif l_mmm.same_string ("NOV") then l_mo := 11
@@ -718,7 +718,7 @@ feature {NONE} -- Implementation
elseif l_mmm.same_string ("MAY") then l_mo := 05
elseif l_mmm.same_string ("JUN") then l_mo := 06
elseif l_mmm.same_string ("JUL") then l_mo := 07
elseif l_mmm.same_string ("AUG") then l_mo := 08
elseif l_mmm.same_string ("AOU") then l_mo := 08
elseif l_mmm.same_string ("SEP") then l_mo := 09
elseif l_mmm.same_string ("OCT") then l_mo := 10
elseif l_mmm.same_string ("NOV") then l_mo := 11
@@ -905,7 +905,7 @@ feature {NONE} -- Implementation
invariant
note
copyright: "2011-2015, Jocelyn Fiat, Eiffel Software and others"
copyright: "2011-2013, Jocelyn Fiat, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-14-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-14-0 http://www.eiffel.com/developers/xml/configuration-1-14-0.xsd" name="notification_email" uuid="99D9A065-CD45-4E20-9C86-579C8AD42E5E" library_target="notification_email">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="notification_email" uuid="99D9A065-CD45-4E20-9C86-579C8AD42E5E" library_target="notification_email">
<target name="notification_email">
<root all_classes="true"/>
<file_rule>
@@ -11,20 +11,8 @@
</option>
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
<library name="http" location="..\..\..\network\protocol\http\http-safe.ecf"/>
<library name="net" location="$ISE_LIBRARY\library\net\net-safe.ecf">
<condition>
<custom name="smtp_notification_email_disabled" excluded_value="true"/>
</condition>
</library>
<library name="process" location="$ISE_LIBRARY\library\process\process-safe.ecf"/>
<library name="time" location="$ISE_LIBRARY\library\time\time-safe.ecf"/>
<cluster name="src" location=".\" >
<cluster name="storage" location="$|storage"/>
<cluster name="smtp" location="$|smtp">
<condition>
<custom name="smtp_notification_email_disabled" excluded_value="true"/>
</condition>
</cluster>
</cluster>
<cluster name="src" location=".\" recursive="true"/>
</target>
</system>

View File

@@ -2,9 +2,9 @@ note
description : "[
Component representing an email
]"
author : "$Author: jfiat $"
date : "$Date: 2015-06-30 11:07:17 +0200 (mar., 30 juin 2015) $"
revision : "$Revision: 97586 $"
author : "$Author$"
date : "$Date$"
revision : "$Revision$"
class
NOTIFICATION_EMAIL
@@ -14,17 +14,15 @@ create
feature {NONE} -- Initialization
make (a_from: like from_address; a_to_address: READABLE_STRING_8; a_subject: like subject; a_content: like content)
make (a_from: like from_address; a_to_address: READABLE_STRING_8; a_subject: like subject; a_body: like body)
-- Initialize `Current'.
require
well_formed_from_address: is_valid_address (a_from)
well_formed_to_address: a_to_address.has ('@')
do
initialize
from_address := a_from
subject := a_subject
content := a_content
body := a_body
to_addresses.extend (a_to_address)
end
initialize
@@ -39,36 +37,11 @@ feature -- Access
from_address: READABLE_STRING_8
reply_to_address: detachable READABLE_STRING_8
to_addresses: ARRAYED_LIST [READABLE_STRING_8]
cc_addresses: detachable ARRAYED_LIST [READABLE_STRING_8]
bcc_addresses: detachable ARRAYED_LIST [READABLE_STRING_8]
subject: READABLE_STRING_8
content: READABLE_STRING_8
additional_header_lines: detachable ARRAYED_LIST [READABLE_STRING_8]
-- Additional header lines.
body: like content
obsolete
"Use `content' [June/2015]"
do
Result := body
end
feature -- Status report
is_valid: BOOLEAN
-- Is current email ready to be sent?
do
Result := is_valid_address (from_address) and
across to_addresses as ic all is_valid_address (ic.item) end
end
body: READABLE_STRING_8
feature -- Change
@@ -77,90 +50,13 @@ feature -- Change
date := d
end
set_subject (s: READABLE_STRING_8)
-- Set `subject' to `s'.
do
subject := s
end
set_content (s: READABLE_STRING_8)
-- Set `content' to `s'.
do
content := s
end
set_from_address (add: READABLE_STRING_8)
require
well_formed_address: add.has ('@')
do
from_address := add
end
add_cc_address (add: READABLE_STRING_8)
require
well_formed_address: add.has ('@')
local
lst: like cc_addresses
do
lst := cc_addresses
if lst = Void then
create lst.make (1)
cc_addresses := lst
end
lst.force (add)
end
add_bcc_address (add: READABLE_STRING_8)
require
well_formed_address: add.has ('@')
local
lst: like bcc_addresses
do
lst := bcc_addresses
if lst = Void then
create lst.make (1)
bcc_addresses := lst
end
lst.force (add)
end
add_header_line (a_line: READABLE_STRING_8)
require
well_formed_header_line: a_line.has (':')
local
lst: like additional_header_lines
do
lst := additional_header_lines
if lst = Void then
create lst.make (1)
additional_header_lines := lst
end
lst.force (a_line)
end
feature -- Reset
reset
do
reset_addresses
additional_header_lines := Void
end
reset_addresses
-- Reset all addresses.
do
to_addresses.wipe_out
cc_addresses := Void
bcc_addresses := Void
end
feature -- Conversion
message: STRING_8
do
Result := header
Result.append_character ('%N')
Result.append (content)
Result.append (body)
Result.append_character ('%N')
Result.append_character ('%N')
end
@@ -170,14 +66,13 @@ feature -- Conversion
hdate: HTTP_DATE
do
create Result.make (20)
if attached reply_to_address as l_reply_to then
Result.append ("Reply-To: ")
Result.append (l_reply_to)
Result.append_character ('%N')
end
Result.append ("From: ")
Result.append (from_address)
Result.append_character ('%N')
Result.append ("Date: ")
create hdate.make_from_date_time (date)
hdate.append_to_rfc1123_string (Result)
Result.append (" GMT%N")
Result.append ("To: ")
across
to_addresses as c
@@ -186,67 +81,18 @@ feature -- Conversion
Result.append_character (';')
end
Result.append_character ('%N')
if
attached cc_addresses as l_cc and then
not l_cc.is_empty
then
Result.append ("Cc: ")
across
l_cc as c
loop
Result.append (c.item)
Result.append_character (';')
end
Result.append_character ('%N')
end
if
attached bcc_addresses as l_bcc and then
not l_bcc.is_empty
then
Result.append ("Bcc: ")
across
l_bcc as c
loop
Result.append (c.item)
Result.append_character (';')
end
Result.append_character ('%N')
end
Result.append ("Subject: ")
Result.append (subject)
Result.append_character ('%N')
Result.append ("Date: ")
create hdate.make_from_date_time (date)
hdate.append_to_rfc1123_string (Result)
Result.append_character ('%N')
if attached additional_header_lines as l_lines and then
not l_lines.is_empty
then
across
l_lines as ic
loop
Result.append (ic.item)
Result.append_character ('%N')
end
end
ensure
Result.ends_with ("%N")
end
feature -- Helpers
is_valid_address (add: READABLE_STRING_8): BOOLEAN
-- Is `add' a valid email address?
do
-- FIXME: improve email validation
Result := add.has ('@')
end
invariant
-- invariant_clause: True
note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
copyright: "2011-2013, 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

View File

@@ -11,20 +11,8 @@
</option>
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
<library name="http" location="..\..\..\network\protocol\http\http.ecf"/>
<library name="net" location="$ISE_LIBRARY\library\net\net.ecf">
<condition>
<custom name="smtp_notification_email_disabled" excluded_value="true"/>
</condition>
</library>
<library name="process" location="$ISE_LIBRARY\library\process\process.ecf"/>
<library name="time" location="$ISE_LIBRARY\library\time\time.ecf"/>
<cluster name="src" location=".">
<cluster name="storage" location="$|storage"/>
<cluster name="smtp" location="$|smtp">
<condition>
<custom name="smtp_notification_email_disabled" excluded_value="true"/>
</condition>
</cluster>
</cluster>
<cluster name="src" location="." recursive="true"/>
</target>
</system>

View File

@@ -2,9 +2,9 @@ note
description: "[
Component responsible to send email
]"
author: "$Author: jfiat $"
date: "$Date: 2015-06-30 11:07:17 +0200 (mar., 30 juin 2015) $"
revision: "$Revision: 97586 $"
author: "$Author$"
date: "$Date$"
revision: "$Revision$"
deferred class
NOTIFICATION_MAILER
@@ -45,40 +45,8 @@ feature -- Basic operation
deferred
end
feature -- Error
has_error: BOOLEAN
-- Previous operation reported error?
-- Use `reset_errors', to reset this state.
do
Result := attached last_errors as lst and then not lst.is_empty
end
reset_errors
-- Reset last errors.
do
last_errors := Void
end
last_errors: detachable ARRAYED_LIST [READABLE_STRING_32]
-- Last reported errors since previous `reset_errors' call.
report_error (a_msg: READABLE_STRING_GENERAL)
-- Report error message `a_msg'.
local
lst: like last_errors
do
lst := last_errors
if lst = Void then
create lst.make (1)
last_errors := lst
end
lst.force (a_msg.to_string_32)
end
note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
copyright: "2011-2013, 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

View File

@@ -1,34 +0,0 @@
note
description: "Mailer that does nothing."
date: "$Date: 2015-06-30 15:49:56 +0200 (mar., 30 juin 2015) $"
revision: "$Revision: 97588 $"
class
NOTIFICATION_NULL_MAILER
inherit
NOTIFICATION_MAILER
feature -- Status
is_available: BOOLEAN = True
-- <Precursor>
feature -- Basic operation
process_email (a_email: NOTIFICATION_EMAIL)
-- <Precursor>
do
end
note
copyright: "2011-2015, 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

View File

@@ -2,9 +2,9 @@ note
description : "[
NOTIFICATION_MAILER using sendmail as mailtool
]"
author: "$Author: jfiat $"
date: "$Date: 2015-06-30 15:49:56 +0200 (mar., 30 juin 2015) $"
revision: "$Revision: 97588 $"
author: "$Author$"
date: "$Date$"
revision: "$Revision$"
class
NOTIFICATION_SENDMAIL_MAILER
@@ -16,29 +16,23 @@ inherit
end
create
default_create,
make_with_location
default_create
feature {NONE} -- Initialization
make_with_location (a_path: READABLE_STRING_GENERAL)
do
make (a_path, <<"-t">>)
set_stdin_mode (True, "%N.%N%N")
end
default_create
do
Precursor
make_with_location ("/usr/sbin/sendmail")
make ("/usr/sbin/sendmail", <<"-t">>)
if not is_available then
make_with_location ("/usr/bin/sendmail")
make ("/usr/bin/sendmail", <<"-t">>)
end
set_stdin_mode (True, "%N.%N%N")
end
note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
copyright: "2011-2013, 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

View File

@@ -1,54 +0,0 @@
note
description: "Summary description for {NOTIFICATION_STORAGE_MAILER}."
author: ""
date: "$Date: 2015-06-30 15:49:56 +0200 (mar., 30 juin 2015) $"
revision: "$Revision: 97588 $"
class
NOTIFICATION_STORAGE_MAILER
inherit
NOTIFICATION_MAILER
create
make
feature {NONE} -- Initialization
make (a_storage: NOTIFICATION_EMAIL_STORAGE)
do
storage := a_storage
end
storage: NOTIFICATION_EMAIL_STORAGE
feature -- Status report
is_available: BOOLEAN
-- <Precursor>
do
Result := storage.is_available
end
feature -- Basic operation
process_email (a_email: NOTIFICATION_EMAIL)
-- <Precursor>
do
storage.put (a_email)
if storage.has_error then
report_error ("Issue storing email.")
end
end
note
copyright: "2011-2015, 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

View File

@@ -1,181 +0,0 @@
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_SMTP_MAILER
inherit
NOTIFICATION_MAILER
create
make,
make_with_user
feature {NONE} -- Initialization
make (a_smtp_server: READABLE_STRING_8)
do
make_with_user (a_smtp_server, Void, Void)
end
make_with_user (a_smtp_server: READABLE_STRING_8; a_user: detachable READABLE_STRING_8; a_password: detachable READABLE_STRING_8)
-- Initialize `Current'.
local
i: INTEGER
do
i := a_smtp_server.index_of (':', 1)
if i > 0 then
smtp_host := a_smtp_server.substring (1, i - 1)
smtp_port := a_smtp_server.substring (i + 1, a_smtp_server.count).to_integer
else
smtp_host := a_smtp_server
smtp_port := 0
end
username := a_user
initialize
end
initialize
-- Initialize service.
local
l_address_factory: INET_ADDRESS_FACTORY
do
if attached username as u then
create smtp_protocol.make (smtp_host, u)
else
-- Get local host name needed in creation of SMTP_PROTOCOL.
create l_address_factory
create smtp_protocol.make (smtp_host, l_address_factory.create_localhost.host_name)
end
if smtp_port > 0 then
smtp_protocol.set_default_port (smtp_port)
end
reset_errors
end
smtp_protocol: SMTP_PROTOCOL
-- SMTP protocol.
feature -- Access
smtp_host: READABLE_STRING_8
smtp_port: INTEGER
username: detachable READABLE_STRING_8
feature -- Status
is_available: BOOLEAN
do
Result := True
end
feature -- Basic operation
process_email (a_email: NOTIFICATION_EMAIL)
-- Process the sending of `a_email'
local
l_email: EMAIL
h: STRING
k,v: STRING
i: INTEGER
hdate: HTTP_DATE
do
create l_email.make_with_entry (a_email.from_address, addresses_to_header_line_value (a_email.to_addresses))
if attached a_email.reply_to_address as l_reply_to then
l_email.add_header_entry ({EMAIL_CONSTANTS}.h_reply_to, l_reply_to)
end
if attached a_email.cc_addresses as lst then
l_email.add_header_entry ({EMAIL_CONSTANTS}.h_cc, addresses_to_header_line_value (lst))
end
if attached a_email.bcc_addresses as lst then
l_email.add_header_entry ({EMAIL_CONSTANTS}.h_bcc, addresses_to_header_line_value (lst))
end
l_email.set_message (a_email.content)
l_email.add_header_entry ({EMAIL_CONSTANTS}.H_subject, a_email.subject)
create h.make_empty
create hdate.make_from_date_time (a_email.date)
hdate.append_to_rfc1123_string (h)
l_email.add_header_entry ("Date", h)
if attached a_email.additional_header_lines as lst then
across
lst as ic
loop
h := ic.item
i := h.index_of (':', 1)
if i > 0 then
k := h.head (i - 1)
v := h.substring (i + 1, h.count)
l_email.add_header_entry (k, v)
else
check is_header_line: False end
end
end
end
smtp_send_email (l_email)
end
feature {NONE} -- Implementation
addresses_to_header_line_value (lst: ITERABLE [READABLE_STRING_8]): STRING
local
l_need_separator: BOOLEAN
do
create Result.make (10)
l_need_separator := False
across
lst as ic
loop
if l_need_separator then
Result.append_character (',')
Result.append_character (' ')
else
l_need_separator := True
end
Result.append (ic.item)
end
end
smtp_send_email (a_email: EMAIL)
-- Send the email represented by `a_email'.
local
retried: BOOLEAN
do
if not retried then
smtp_protocol.initiate_protocol
smtp_protocol.transfer (a_email)
smtp_protocol.close_protocol
if smtp_protocol.error then
report_error ("smtp_protocol reported an error.")
end
end
rescue
report_error ("smtp_protocol raised an exception.")
retried := True
retry
end
note
copyright: "2011-2015, 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

View File

@@ -1,74 +0,0 @@
note
description: "Store email in specific file (could also be stderr, ...)."
date: "$Date: 2015-06-30 15:49:56 +0200 (mar., 30 juin 2015) $"
revision: "$Revision: 97588 $"
class
NOTIFICATION_EMAIL_FILE_STORAGE
inherit
NOTIFICATION_EMAIL_STORAGE
create
make
feature {NONE} -- Initialization
make (a_output_file: FILE)
require
a_output_file_valid: a_output_file.exists
do
output := a_output_file
end
output: FILE
feature -- Status report
is_available: BOOLEAN
-- Is associated storage available?
do
Result := output.exists and output.is_access_writable
end
has_error: BOOLEAN
-- Last operation reported an error?
feature -- Storage
put (a_email: NOTIFICATION_EMAIL)
-- Store `a_email'.
local
retried: BOOLEAN
l_close_needed: BOOLEAN
do
if not retried then
has_error := False
if not output.is_open_write then
output.open_write
l_close_needed := True
end
output.put_string ("%N----%N" + a_email.message)
if l_close_needed then
output.close
else
output.flush
end
end
rescue
retried := True
has_error := True
retry
end
;note
copyright: "2011-2015, 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

View File

@@ -1,38 +0,0 @@
note
description: "Abtract interface of email storage."
date: "$Date: 2015-06-30 15:49:56 +0200 (mar., 30 juin 2015) $"
revision: "$Revision: 97588 $"
deferred class
NOTIFICATION_EMAIL_STORAGE
feature -- Status report
is_available: BOOLEAN
-- Is associated storage available?
deferred
end
has_error: BOOLEAN
-- Last operation reported an error?
deferred
end
feature -- Storage
put (a_email: NOTIFICATION_EMAIL)
-- Store `a_email'.
deferred
end
note
copyright: "2011-2015, 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

View File

@@ -60,6 +60,7 @@ feature -- Access
is_persistent_connection_supported: BOOLEAN = True
-- Is persistent connection supported?
--| For now, disabled during dev.
feature -- Callbacks

View File

@@ -87,7 +87,6 @@ feature -- Request processing
else
l_output.set_http_version (version)
end
res.set_is_persistent_connection_supported ({HTTPD_SERVER}.is_persistent_connection_supported)
res.set_is_persistent_connection_requested (is_persistent_connection_requested)
req.set_meta_string_variable ("RAW_HEADER_DATA", request_header)
@@ -112,30 +111,22 @@ feature -- Request processing
end
end
process_rescue (res: detachable WGI_RESPONSE)
local
s: STRING
do
if attached (create {EXCEPTION_MANAGER}).last_exception as e and then attached e.trace as l_trace then
if res /= Void then
if not res.status_is_set then
res.set_status_code ({HTTP_STATUS_CODE}.internal_server_error, Void)
end
create s.make_empty
s.append ("<pre>")
s.append (html_encoder.encoded_string (l_trace))
s.append ("</pre>")
if not res.header_committed then
res.put_header_text ("Content-Type: text/html%R%NContent-Length: " + s.count.out + "%R%N%R%N")
end
if res.message_writable then
res.put_string (s)
res.put_string ("<pre>")
res.put_string (html_encoder.encoded_string (l_trace))
res.put_string ("</pre>")
end
res.push
end
end
end
end
httpd_environment (a_socket: HTTPD_STREAM_SOCKET): STRING_TABLE [READABLE_STRING_8]
local

View File

@@ -29,7 +29,7 @@ feature {NONE} -- Initialization
last_target_call_succeed := True
end
feature {WGI_STANDALONE_CONNECTOR, WGI_SERVICE} -- Server
feature {WGI_STANDALONE_CONNECTOR, WGI_SERVICE} -- Nino
set_target (o: like target)
do
@@ -100,7 +100,7 @@ feature -- Status report
-- <Precursor>
-- for instance IO failure due to socket disconnection.
do
Result := last_target_call_succeed
Result := not last_target_call_succeed
end
is_open_write: BOOLEAN

View File

@@ -23,9 +23,6 @@ feature -- Settings
is_http_version_1_0: BOOLEAN
-- Is associated request using HTTP/1.0 ?
is_persistent_connection_supported: BOOLEAN
-- Is persistent connection supported?
is_persistent_connection_requested: BOOLEAN
-- Is persistent connection requested?
@@ -37,12 +34,6 @@ feature -- Settings change
is_http_version_1_0 := True
end
set_is_persistent_connection_supported (b: BOOLEAN)
-- Set `is_persistent_connection_supported' to `b'.
do
is_persistent_connection_supported := b
end
set_is_persistent_connection_requested (b: BOOLEAN)
-- Set `is_persistent_connection_requested' to `b'.
do
@@ -62,7 +53,7 @@ feature -- Header output operation
create s.make_from_string (a_text)
i := s.substring_index ("%NConnection:", 1)
if is_persistent_connection_supported then
if {HTTPD_SERVER}.is_persistent_connection_supported then
-- Current standalone support persistent connection.
-- If HTTP/1.1:
-- by default all connection are persistent

View File

@@ -1,23 +0,0 @@
package ewsgi
project
ewsgi = "ewsgi-safe.ecf"
ewsgi = "ewsgi.ecf"
ewsgi_spec = "ewsgi_spec-safe.ecf"
ewsgi_spec = "ewsgi_spec.ecf"
connector_cgi = "connectors/cgi/cgi-safe.ecf"
connector_cgi = "connectors/cgi/cgi.ecf"
connector_libfcgi = "connectors/libfcgi/libfcgi-safe.ecf"
connector_libfcgi = "connectors/libfcgi/libfcgi.ecf"
connector_nino = "connectors/nino/nino-safe.ecf"
connector_nino = "connectors/nino/nino.ecf"
connector_null = "connectors/null/null-safe.ecf"
connector_null = "connectors/null/null.ecf"
note
title: EWSGI
description: EWSGI specification, and a few connectors.
tags: web, httpd, ewf
license: Eiffel Forum v2
end

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="connector_libfcgi_v0" uuid="5E1C9860-2D9E-4A94-A11D-DA0FD9B31470" library_target="connector_libfcgi_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="connector_libfcgi_v0" uuid="59C57E56-3EE6-4EF7-873F-7ED084B0EB22" library_target="connector_libfcgi_v0">
<target name="connector_libfcgi_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="connector_libfcgi_v0" uuid="5E1C9860-2D9E-4A94-A11D-DA0FD9B31470" library_target="connector_libfcgi_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="connector_libfcgi_v0" uuid="59C57E56-3EE6-4EF7-873F-7ED084B0EB22" library_target="connector_libfcgi_v0">
<target name="connector_libfcgi_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="connector_nino_v0" uuid="6E00FB27-C0E2-4859-93A0-BF516C44C95F" library_target="connector_nino_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="connector_nino_v0" uuid="F91861FB-4FEA-455F-9570-828D7903DC64" library_target="connector_nino_v0">
<target name="connector_nino_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="connector_nino_v0" uuid="6E00FB27-C0E2-4859-93A0-BF516C44C95F" library_target="connector_nino_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="connector_nino_v0" uuid="F91861FB-4FEA-455F-9570-828D7903DC64" library_target="connector_nino_v0">
<target name="connector_nino_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_libfcgi_v0" uuid="36DB043B-E4E9-4BB6-936C-3564335C34EF" library_target="wsf_libfcgi_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_libfcgi_v0" uuid="00B169F1-2BE2-4986-8B93-825FEB944FFD" library_target="wsf_libfcgi_v0">
<target name="wsf_libfcgi_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_libfcgi_v0" uuid="36DB043B-E4E9-4BB6-936C-3564335C34EF" library_target="wsf_libfcgi_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_libfcgi_v0" uuid="00B169F1-2BE2-4986-8B93-825FEB944FFD" library_target="wsf_libfcgi_v0">
<target name="wsf_libfcgi_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="wsf_nino_v0" uuid="81525F4F-7BCA-471B-B1E3-2601EFD242E0" library_target="wsf_nino_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="wsf_nino_v0" uuid="BACF0220-900B-4409-8CB2-30A09836A650" library_target="wsf_nino_v0">
<target name="wsf_nino_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="wsf_nino_v0" uuid="81525F4F-7BCA-471B-B1E3-2601EFD242E0" library_target="wsf_nino_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="wsf_nino_v0" uuid="BACF0220-900B-4409-8CB2-30A09836A650" library_target="wsf_nino_v0">
<target name="wsf_nino_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="default_libfcgi_v0" uuid="757C822A-6A23-42E6-9A30-2B0977960E3D" library_target="default_libfcgi_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="default_libfcgi_v0" uuid="B853CC3A-D173-4DA4-9832-6D0148C8F01F" library_target="default_libfcgi_v0">
<target name="default_libfcgi_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="default_libfcgi_v0" uuid="757C822A-6A23-42E6-9A30-2B0977960E3D" library_target="default_libfcgi_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="default_libfcgi_v0" uuid="B853CC3A-D173-4DA4-9832-6D0148C8F01F" library_target="default_libfcgi_v0">
<target name="default_libfcgi_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="default_nino_v0" uuid="D3606AED-7593-460A-94FD-2859C71386FF" library_target="default_nino_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="default_nino_v0" uuid="ACBEDC97-956C-45F5-97E3-65A6D9987625" library_target="default_nino_v0">
<target name="default_nino_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="default_nino_v0" uuid="D3606AED-7593-460A-94FD-2859C71386FF" library_target="default_nino_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-12-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-12-0 http://www.eiffel.com/developers/xml/configuration-1-12-0.xsd" name="default_nino_v0" uuid="ACBEDC97-956C-45F5-97E3-65A6D9987625" library_target="default_nino_v0">
<target name="default_nino_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_extension_v0" uuid="66FC8180-27E6-4335-B571-4D38D3BC633A" library_target="wsf_extension_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_extension_v0" uuid="11055B92-CBEF-4272-8B50-0450BDA154E5" library_target="wsf_extension_v0">
<target name="wsf_extension_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_extension_v0" uuid="66FC8180-27E6-4335-B571-4D38D3BC633A" library_target="wsf_extension_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_extension_v0" uuid="11055B92-CBEF-4272-8B50-0450BDA154E5" library_target="wsf_extension_v0">
<target name="wsf_extension_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="wsf_policy_driven_v0" uuid="E175F999-1164-48AA-83E1-6C14FC5E8C82" library_target="wsf_policy_driven_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="wsf_policy_driven_v0" uuid="3FC00449-5101-461D-94C6-10920C30EBF4" library_target="wsf_policy_driven_v0">
<target name="wsf_policy_driven_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="wsf_policy_driven_v0" uuid="E175F999-1164-48AA-83E1-6C14FC5E8C82" library_target="wsf_policy_driven_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="wsf_policy_driven_v0" uuid="3FC00449-5101-461D-94C6-10920C30EBF4" library_target="wsf_policy_driven_v0">
<target name="wsf_policy_driven_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_router_context_v0" uuid="BA6468F6-2130-45FC-A2F7-26A7781B09CE" library_target="wsf_router_context_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_router_context_v0" uuid="1A0F9B0E-26CE-4DE0-BE47-C74D1AB2B389" library_target="wsf_router_context_v0">
<target name="wsf_router_context_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_router_context_v0" uuid="BA6468F6-2130-45FC-A2F7-26A7781B09CE" library_target="wsf_router_context_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_router_context_v0" uuid="1A0F9B0E-26CE-4DE0-BE47-C74D1AB2B389" library_target="wsf_router_context_v0">
<target name="wsf_router_context_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,3 +1,3 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<redirection xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" uuid="74D6AAE4-1AF5-4D5C-B19D-D24383B7DE93" location="../../../wsf/wsf_session-safe.ecf">
<redirection xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" uuid="C41D0367-9852-4AA7-9E7E-DEA162A4CBB0" location="../../../wsf/wsf_session-safe.ecf">
</redirection>

View File

@@ -1,3 +1,3 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<redirection xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" uuid="74D6AAE4-1AF5-4D5C-B19D-D24383B7DE93" location="../../../wsf/wsf_session.ecf">
<redirection xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" uuid="C41D0367-9852-4AA7-9E7E-DEA162A4CBB0" location="../../../wsf/wsf_session.ecf">
</redirection>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_html_v0" uuid="9D0DC2A2-BE67-4499-B730-87C7DDE25860" library_target="wsf_html_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-11-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-11-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_html_v0" uuid="6AAAE037-7E66-4F5D-BED0-0042245C26BC" library_target="wsf_html_v0">
<target name="wsf_html_v0">
<root all_classes="true"/>
<file_rule>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-11-0.xsd" name="wsf_html_v0" uuid="9D0DC2A2-BE67-4499-B730-87C7DDE25860" library_target="wsf_html_v0">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="wsf_html_v0" uuid="6AAAE037-7E66-4F5D-BED0-0042245C26BC" library_target="wsf_html_v0">
<target name="wsf_html_v0">
<root all_classes="true"/>
<file_rule>
@@ -9,14 +9,13 @@
</file_rule>
<option warning="true" full_class_checking="true" void_safety="none" syntax="standard">
</option>
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
<library name="base" location="$ISE_LIBRARY/library/base/base.ecf"/>
<library name="encoder" location="../../../../text/encoder/encoder.ecf"/>
<library name="uri_template" location="../../../../text/parser/uri_template/uri_template.ecf"/>
<library name="wsf" location="..\wsf\wsf.ecf"/>
<cluster name="api" location="..\..\..\wsf_html\api\" recursive="true"/>
<cluster name="css" location="..\..\..\wsf_html\css\" recursive="true"/>
<cluster name="form" location="..\..\..\wsf_html\form\" recursive="true"/>
<cluster name="widget" location="..\..\..\wsf_html\widget\" recursive="true"/>
<library name="wsf" location="../wsf/wsf.ecf"/>
<cluster name="form" location="./form" recursive="true"/>
<cluster name="widget" location="./widget" recursive="true"/>
<cluster name="css" location="./css" recursive="true"/>
<cluster name="api" location="./api" recursive="true"/>
</target>
</system>

View File

@@ -13,21 +13,27 @@ inherit
initialize
end
WSF_FILTERED
WSF_FILTERED_EXECUTOR
rename
initialize as initialize_executor,
execute as process_execution
end
feature {NONE} -- Initialization
initialize
do
Precursor
initialize_filter
Precursor {WSF_EXECUTION}
initialize_executor
end
feature -- Execution
execute
-- Dispatch the request
-- and if handler is not found, execute the default procedure `execute_default'.
do
filter.execute (request, response)
process_execution (request, response)
end
;note

View File

@@ -0,0 +1,43 @@
note
description: "Summary description for {WSF_FILTERED_EXECUTOR}."
author: ""
date: "$Date$"
revision: "$Revision$"
deferred class
WSF_FILTERED_EXECUTOR
inherit
WSF_EXECUTOR
redefine
initialize
end
WSF_FILTERED
feature {NONE} -- Initialization
initialize
do
Precursor
initialize_filter
end
feature -- Execution
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
do
filter.execute (req, res)
end
;note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
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

View File

@@ -0,0 +1,281 @@
note
description: "Skeleton execution based on router."
date: "$Date$"
revision: "$Revision$"
deferred class
WSF_ROUTED_SKELETON_EXECUTOR
inherit
WSF_ROUTED_EXECUTOR
redefine
execute
end
WSF_SYSTEM_OPTIONS_ACCESS_POLICY
WSF_PROXY_USE_POLICY
feature -- Execution
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- If the service is available, and request URI is not too long, dispatch the request
-- and if handler is not found, execute the default procedure `execute_default'.
do
--| When we reach here, the request has already passed check for 400 (Bad request),
--| which is implemented in WSF_REQUEST.make_from_wgi (when it calls `analyze').
if unavailable then
handle_unavailable (res)
elseif requires_proxy (req) then
handle_use_proxy (req, res)
elseif
maximum_uri_length > 0 and then
req.request_uri.count.to_natural_32 > maximum_uri_length
then
handle_request_uri_too_long (res)
elseif
req.is_request_method ({HTTP_REQUEST_METHODS}.method_options) and then
req.request_uri.same_string ("*")
then
handle_server_options (req, res)
else
Precursor (req, res)
end
end
feature -- Measurement
maximum_uri_length: NATURAL
-- Maximum length in characters (or zero for no limit) permitted
-- for {WSF_REQUEST}.request_uri
feature -- Status report
unavailable: BOOLEAN
-- Is service currently unavailable?
unavailablity_message: detachable READABLE_STRING_8
-- Message to be included as text of response body for {HTTP_STATUS_CODE}.service_unavailable
unavailability_duration: NATURAL
-- Delta seconds for service unavailability (0 if not known)
unavailable_until: detachable DATE_TIME
-- Time at which service becomes available again (if known)
feature -- Status setting
set_available
-- Set `unavailable' to `False'.
do
unavailable := False
unavailablity_message := Void
unavailable_until := Void
ensure
available: unavailable = False
unavailablity_message_detached: unavailablity_message = Void
unavailable_until_detached: unavailable_until = Void
end
set_unavailable (a_message: READABLE_STRING_8; a_duration: NATURAL; a_until: detachable DATE_TIME)
-- Set `unavailable' to `True'.
require
a_message_attached: a_message /= Void
a_duration_xor_a_until: a_duration > 0 implies a_until = Void
do
unavailable := True
unavailablity_message := a_message
unavailability_duration := a_duration
ensure
unavailable: unavailable = True
unavailablity_message_aliased: unavailablity_message = a_message
unavailability_duration_set: unavailability_duration = a_duration
unavailable_until_aliased: unavailable_until = a_until
end
set_maximum_uri_length (a_len: NATURAL)
-- Set `maximum_uri_length' to `a_len'.
-- Can pass zero to mean no restrictions.
do
maximum_uri_length := a_len
ensure
maximum_uri_length_set: maximum_uri_length = a_len
end
feature {NONE} -- Implementation
handle_unavailable (res: WSF_RESPONSE)
-- Write "Service unavailable" response to `res'.
require
unavailable: unavailable
res_attached: res /= Void
local
h: HTTP_HEADER
do
create h.make
h.put_content_type_text_plain
check attached unavailablity_message as m then
-- invariant `unavailability_message_attached' plus precondition `unavailable'
h.put_content_length (m.count)
h.put_current_date
res.set_status_code ({HTTP_STATUS_CODE}.service_unavailable)
if unavailability_duration > 0 then
h.put_header_key_value ({HTTP_HEADER_NAMES}.header_retry_after, unavailability_duration.out)
elseif attached unavailable_until as u then
h.put_header_key_value ({HTTP_HEADER_NAMES}.header_retry_after,
h.date_to_rfc1123_http_date_format (u))
end
res.put_header_text (h.string)
res.put_string (m)
end
ensure
response_status_is_set: res.status_is_set
status_is_service_unavailable: res.status_code = {HTTP_STATUS_CODE}.service_unavailable
body_sent: res.message_committed and then res.transfered_content_length > 0
body_content_was_unavailablity_message: True -- doesn't seem to be any way to check
end
handle_request_uri_too_long (res: WSF_RESPONSE)
-- Write "Request URI too long" response into `res'.
require
res_attached: res /= Void
local
h: HTTP_HEADER
m: READABLE_STRING_8
do
create h.make
h.put_content_type_text_plain
h.put_current_date
m := "Maximum permitted length for request URI is " + maximum_uri_length.out + " characters"
h.put_content_length (m.count)
res.set_status_code ({HTTP_STATUS_CODE}.request_uri_too_long)
res.put_header_text (h.string)
res.put_string (m)
ensure
response_status_is_set: res.status_is_set
status_is_request_uri_too_long: res.status_code = {HTTP_STATUS_CODE}.request_uri_too_long
body_sent: res.message_committed and then res.transfered_content_length > 0
end
frozen handle_server_options (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Write response to OPTIONS * into `res'.
require
req_attached: req /= Void
res_attached: res /= Void
method_is_options: req.is_request_method ({HTTP_REQUEST_METHODS}.method_options)
server_options_requested: req.request_uri.same_string ("*")
do
--| First check if forbidden.
--| (N.B. authentication requires an absoluteURI (RFC3617 page 3), and so cannot be used for OPTIONS *.
--| Otherwise construct an Allow response automatically from the router.
if is_system_options_forbidden (req) then
handle_system_options_forbidden (req, res)
else
handle_system_options (req, res)
end
ensure
response_status_is_set: res.status_is_set
valid_response_code: res.status_code = {HTTP_STATUS_CODE}.forbidden or
res.status_code = {HTTP_STATUS_CODE}.not_found or res.status_code = {HTTP_STATUS_CODE}.ok
header_sent: res.header_committed and res.message_committed
end
frozen handle_system_options_forbidden (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Write a 403 Forbidden or a 404 Not found response into `res'.
require
req_attached: req /= Void
res_attached: res /= Void
method_is_options: req.is_request_method ({HTTP_REQUEST_METHODS}.method_options)
server_options_requested: req.request_uri.same_string ("*")
local
m: detachable READABLE_STRING_8
h: HTTP_HEADER
do
m := system_options_forbidden_text (req)
if attached {READABLE_STRING_8} m as l_msg then
create h.make
h.put_content_type_text_plain
h.put_current_date
h.put_content_length (l_msg.count)
res.set_status_code ({HTTP_STATUS_CODE}.forbidden)
res.put_header_text (h.string)
res.put_string (l_msg)
else
create h.make
h.put_content_type_text_plain
h.put_current_date
h.put_content_length (0)
res.set_status_code ({HTTP_STATUS_CODE}.not_found)
res.put_header_text (h.string)
end
ensure
response_status_is_set: res.status_is_set
valid_response_code: res.status_code = {HTTP_STATUS_CODE}.forbidden or
res.status_code = {HTTP_STATUS_CODE}.not_found
header_sent: res.header_committed
message_sent: res.message_committed
end
handle_system_options (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Write response to OPTIONS * into `res'.
-- This may be redefined by the user, but normally this will not be necessary.
require
req_attached: req /= Void
res_attached: res /= Void
method_is_options: req.is_request_method ({HTTP_REQUEST_METHODS}.method_options)
server_options_requested: req.request_uri.same_string ("*")
local
h: HTTP_HEADER
do
create h.make
h.put_content_type_text_plain
h.put_current_date
h.put_allow (router.all_allowed_methods)
h.put_content_length (0)
res.set_status_code ({HTTP_STATUS_CODE}.ok)
res.put_header_text (h.string)
ensure
response_status_is_set: res.status_is_set
response_code_ok: res.status_code = {HTTP_STATUS_CODE}.ok
header_sent: res.header_committed and res.message_committed
empty_body: res.transfered_content_length = 0
end
frozen handle_use_proxy (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Write Use Proxy response `res'.
require
res_attached: res /= Void
req_attached: req /= Void
proxy_required: requires_proxy (req)
local
h: HTTP_HEADER
do
create h.make
h.put_content_type_text_plain
h.put_current_date
h.put_location (proxy_server (req).string)
h.put_content_length (0)
res.put_header_lines (h)
res.set_status_code ({HTTP_STATUS_CODE}.use_proxy)
ensure
response_status_is_set: res.status_is_set
response_code_use_proxy: res.status_code = {HTTP_STATUS_CODE}.use_proxy
end
invariant
unavailability_message_attached: unavailable implies attached unavailablity_message as m and then
m.count > 0
unavailability_duration_xor_unavailable_until: unavailability_duration > 0 implies unavailable_until = Void
;note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
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

View File

@@ -12,75 +12,27 @@ inherit
initialize
end
WSF_ROUTED
WSF_ROUTED_EXECUTOR
rename
initialize as initialize_executor,
execute as process_execution
end
feature {NONE} -- Initialize
initialize
do
Precursor
initialize_router
Precursor {WSF_EXECUTION}
initialize_executor
end
feature -- Router
initialize_router
-- Initialize router
do
create_router
setup_router
end
create_router
-- Create `router'
--| could be redefine to initialize with proper capacity
do
create router.make (10)
ensure
router_created: router /= Void
end
setup_router
-- Setup `router'
require
router_created: router /= Void
deferred
end
feature -- Access
router: WSF_ROUTER
-- Router used to dispatch the request according to the WSF_REQUEST object
-- and associated request methods
feature -- Execution
execute
-- Dispatch the request
-- and if handler is not found, execute the default procedure `execute_default'.
do
router_execute (request, response)
end
router_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
local
sess: WSF_ROUTER_SESSION
do
create sess
router.dispatch (req, res, sess)
if not sess.dispatched then
execute_default (req, res)
end
end
execute_default (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Dispatch requests without a matching handler.
local
msg: WSF_DEFAULT_ROUTER_RESPONSE
do
create msg.make_with_router (request, router)
msg.set_documentation_included (True)
response.send (msg)
process_execution (request, response)
end
note

View File

@@ -0,0 +1,91 @@
note
description: "Summary description for {WSF_ROUTED_EXECUTOR}."
author: ""
date: "$Date$"
revision: "$Revision$"
deferred class
WSF_ROUTED_EXECUTOR
inherit
WSF_EXECUTOR
redefine
initialize
end
WSF_ROUTED
feature {NONE} -- Initialize
initialize
do
Precursor
initialize_router
end
feature -- Router
initialize_router
-- Initialize router
do
create_router
setup_router
end
create_router
-- Create `router'
--| could be redefine to initialize with proper capacity
do
create router.make (10)
ensure
router_created: router /= Void
end
setup_router
-- Setup `router'
require
router_created: router /= Void
deferred
end
feature -- Access
router: WSF_ROUTER
-- Router used to dispatch the request according to the WSF_REQUEST object
-- and associated request methods
feature -- Execution
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
local
sess: WSF_ROUTER_SESSION
do
create sess
router.dispatch (req, res, sess)
if not sess.dispatched then
execute_default (req, res)
end
end
execute_default (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Dispatch requests without a matching handler.
local
msg: WSF_DEFAULT_ROUTER_RESPONSE
do
create msg.make_with_router (req, router)
msg.set_documentation_included (True)
res.send (msg)
end
note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
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

View File

@@ -116,7 +116,7 @@ feature -- Output operation
end
note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
copyright: "2011-2013, 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

View File

@@ -1,7 +1,7 @@
note
description: "Request execution based on attributes `request' and `response'. "
date: "$Date$"
revision: "$Revision$"
date: "$Date: 2015-06-16 15:03:22 +0200 (mar., 16 juin 2015) $"
revision: "$Revision: 97475 $"
deferred class
WSF_EXECUTION
@@ -11,7 +11,7 @@ inherit
rename
request as wgi_request,
response as wgi_response,
make_from_execution as make_from_wgi_execution
make_from_execution as make_from_wgi_execution
redefine
make,
execute,

View File

@@ -0,0 +1,31 @@
note
description: "Request execution with request and response passed as argument."
date: "$Date$"
revision: "$Revision$"
deferred class
WSF_EXECUTOR
feature {NONE} -- Initialization
initialize
do
end
feature -- Execution
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
deferred
end
note
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
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

View File

@@ -1902,7 +1902,7 @@ feature -- URL Utility
elseif spos > 0 then
i := spos
end
spos := l_rq_uri.substring_index (percent_encoded_path_info, i)
spos := l_rq_uri.substring_index (path_info, i)
if spos > 0 then
l_base_url := l_rq_uri.substring (1, spos - 1)
else

View File

@@ -319,8 +319,8 @@ feature -- Header output operation: helpers
feature -- Header add cookie
add_cookie (a_cookie: WSF_COOKIE)
-- Add a Set-Cookie header field to the response,
-- if no Set-Cookie header field already use same cookie-name.
-- Add a Set-Cookie header field to the response, iff there is not exist
-- a Set-Cookie header field with the same cookie-name.
--| Servers SHOULD NOT include more than one Set-Cookie header field in
--| the same response with the same cookie-name.
local
@@ -328,8 +328,7 @@ feature -- Header add cookie
do
across
internal_header.headers as ic
until
l_same_cookie_name
until l_same_cookie_name
loop
if ic.item.starts_with ("Set-Cookie:") then
l_same_cookie_name := has_cookie_name (ic.item, a_cookie.name)
@@ -545,29 +544,24 @@ feature -- Error reporting
feature {NONE} -- Implemenation
has_cookie_name (a_cookie_line, a_cookie_name: READABLE_STRING_GENERAL): BOOLEAN
-- Has the cookie line `a_cookie_line', the cookie name `a_cookie_name'?
local
i,j,n: INTEGER
do
has_cookie_name (a_cookie_line, a_cookie_name: READABLE_STRING_32 ): BOOLEAN
-- Has the cookie line `a_cookie_line', the cookie name `a_cookie_name'?
local
i,j: INTEGER
do
Result := False
i := a_cookie_line.index_of ('=', 1)
j := a_cookie_line.index_of (':', 1)
if j > 0 then
i := a_cookie_line.index_of ('=', 1)
if i > j then
i := i - 1
j := j + 1
-- Skip spaces.
from
n := a_cookie_line.count
until
j > n or not a_cookie_line[j].is_space
loop
j := j + 1
end
if j > n then
Result := a_cookie_name.same_characters (a_cookie_line, j, i, 1)
end
end
if i > j and j > 0 then
i := i - 1
j := j + 1
from until not a_cookie_line[j].is_space loop
j := j + 1
end
if a_cookie_name.same_characters (a_cookie_line, j, i, 1) then
Result := True
end
end
end

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="wsf" uuid="A37CE5AA-4D2A-4441-BC6A-0A1D7EC49647" library_target="wsf">
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="wsf" uuid="A37CE5AA-4D2A-4441-BC6A-0A1D7EC49647" library_target="wsf">
<target name="wsf">
<root all_classes="true"/>
<file_rule>
@@ -9,23 +9,23 @@
</file_rule>
<option warning="true" full_class_checking="true" void_safety="none" syntax="provisional">
</option>
<mapping old_name="WSF_URI_TEMPLATE_HELPER_FOR_ROUTED_EXECUTION" new_name="WSF_ROUTED_URI_TEMPLATE_HELPER"/>
<mapping old_name="WSF_URI_HELPER_FOR_ROUTED_EXECUTION" new_name="WSF_ROUTED_URI_HELPER"/>
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
<library name="base" location="$ISE_LIBRARY/library/base/base.ecf"/>
<library name="base_extension" location="$ISE_LIBRARY\library\base_extension\base_extension.ecf"/>
<library name="conneg" location="..\..\network\protocol\content_negotiation\conneg.ecf"/>
<library name="encoder" location="..\..\text\encoder\encoder.ecf"/>
<library name="error" location="..\..\utility\general\error\error.ecf"/>
<library name="ewsgi" location="..\ewsgi\ewsgi.ecf"/>
<library name="http" location="..\..\network\protocol\http\http.ecf"/>
<library name="time" location="$ISE_LIBRARY\library\time\time.ecf"/>
<library name="uri" location="$ISE_LIBRARY\library\text\uri\uri.ecf"/>
<library name="uri_template" location="..\..\text\parser\uri_template\uri_template.ecf"/>
<cluster name="router" location=".\router\" recursive="true">
<library name="error" location="../../utility/general/error/error.ecf"/>
<library name="http" location="../../network/protocol/http/http.ecf"/>
<library name="conneg" location="..\..\network\protocol\content_negotiation\conneg.ecf"/>
<library name="uri_template"
location="../../text/parser/uri_template/uri_template.ecf"/>
<library name="encoder"
location="..\..\text\encoder\encoder.ecf"/>
<library name="uri" location="$ISE_LIBRARY\library\text\uri\uri.ecf" readonly="true"/>
<cluster name="src" location=".\src" recursive="true"/>
<cluster name="router" location=".\router" recursive="true">
<file_rule>
<exclude>/policy_driven$</exclude>
</file_rule>
</cluster>
<cluster name="src" location=".\src\" recursive="true"/>
</target>
</system>

View File

@@ -72,22 +72,12 @@ feature -- Change
set_value (v: detachable WSF_VALUE)
-- Set value `v' if applicable to Current
local
l_found: BOOLEAN
do
if attached {ITERABLE [WSF_VALUE]} v as lst then
across
lst as c
until
l_found
loop
if attached {WSF_STRING} c.item as s and then is_same_value (s.value) then
set_checked_by_value (c.item)
l_found := True
end
end
if not l_found then
set_checked (False)
set_checked_by_value (c.item)
end
else
set_checked_by_value (v)

View File

@@ -45,8 +45,7 @@
<library name="rss" location="..\draft\library\protocol\syndication\rss\rss-safe.ecf" readonly="false"/>
<library name="upload_image" location="..\examples\upload_image\upload_image-safe.ecf" readonly="false"/>
<library name="uri_template" location="..\library\text\parser\uri_template\uri_template-safe.ecf" readonly="false"/>
<library name="wizard" location="..\tools\estudio_wizard\wizard.ecf" readonly="false"/>
<library name="console_wizard" location="..\tools\estudio_wizard\console_wizard.ecf" readonly="false"/>
<library name="wizard" location="..\tools\estudio_wizard\ewf_ise_wizard-safe.ecf" readonly="false"/>
<library name="wsf" location="..\library\server\wsf\wsf-safe.ecf" readonly="false"/>
<library name="wsf_all" location="..\library\server\wsf\connector\all-safe.ecf" readonly="false"/>
<library name="wsf_cgi" location="..\library\server\wsf\connector\cgi-safe.ecf" readonly="false"/>

View File

@@ -40,8 +40,7 @@
<library name="restbucks" location="..\examples\restbucksCRUD\restbucks-safe.ecf" readonly="false"/>
<library name="upload_image" location="..\examples\upload_image\upload_image-safe.ecf" readonly="false"/>
<library name="uri_template" location="..\library\text\parser\uri_template\uri_template-safe.ecf" readonly="false"/>
<library name="wizard" location="..\tools\estudio_wizard\wizard.ecf" readonly="false"/>
<library name="console_wizard" location="..\tools\estudio_wizard\console_wizard.ecf" readonly="false"/>
<library name="wizard" location="..\tools\estudio_wizard\ewf_ise_wizard-safe.ecf" readonly="false"/>
<library name="wsf" location="..\library\server\wsf\wsf-safe.ecf" readonly="false"/>
<library name="wsf_all" location="..\library\server\wsf\connector\all-safe.ecf" readonly="false"/>
<library name="wsf_cgi" location="..\library\server\wsf\connector\cgi-safe.ecf" readonly="false"/>

View File

@@ -38,7 +38,7 @@ feature {NONE} -- Initialization
feature -- UI change
set_title (a_title: separate READABLE_STRING_GENERAL)
set_title (a_title: READABLE_STRING_GENERAL)
deferred
end

View File

@@ -89,12 +89,12 @@ echo Install library: http
echo Install library: content_negotiation
%COPYCMD% %TMP_DIR%\library\network\protocol\content_negotiation %TMP_CONTRIB_DIR%\library\network\protocol\content_negotiation
echo Install library: http_authorization
%SAFE_MD% %TMP_CONTRIB_DIR%\library\web\authentication
%COPYCMD% %TMP_DIR%\library\server\authentication\http_authorization %TMP_CONTRIB_DIR%\library\web\authentication\http_authorization
%SAFE_MD% %TMP_CONTRIB_DIR%\library\network\authentication
%COPYCMD% %TMP_DIR%\library\server\authentication\http_authorization %TMP_CONTRIB_DIR%\library\network\authentication\http_authorization
echo Install library: openid
%SAFE_MD% %TMP_CONTRIB_DIR%\library\web\authentication
%COPYCMD% %TMP_DIR%\library\security\openid %TMP_CONTRIB_DIR%\library\web\authentication\openid
%SAFE_MD% %TMP_CONTRIB_DIR%\library\security
%COPYCMD% %TMP_DIR%\library\security\openid %TMP_CONTRIB_DIR%\library\security\openid
echo Install library: uri_template
%COPYCMD% %TMP_DIR%\library\text\parser\uri_template %TMP_CONTRIB_DIR%\library\text\parser\uri_template

View File

@@ -60,9 +60,9 @@ echo Uninstall library: http
echo Uninstall library: content_negotiation
%RDCMD% %TMP_CONTRIB_DIR%\library\network\protocol\content_negotiation
echo Uninstall library: http_authorization
%RDCMD% %TMP_CONTRIB_DIR%\library\web\authentication\http_authorization
%RDCMD% %TMP_CONTRIB_DIR%\library\network\authentication\http_authorization
echo Uninstall library: security\openid
%RDCMD% %TMP_CONTRIB_DIR%\library\web\authentication\openid
%RDCMD% %TMP_CONTRIB_DIR%\library\security\openid
echo Uninstall library: uri_template
%RDCMD% %TMP_CONTRIB_DIR%\library\text\parser\uri_template
echo Uninstall library: runtime\process\notification_email