Updated workbook for web site.
This commit is contained in:
@@ -20,7 +20,7 @@ Nav: [Workbook](../../workbook) :: [Handling Requests: Form/Query Parameter](../
|
|||||||
|
|
||||||
## EWF service 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. We will need to define a `Service Launcher` and a `Request Execution` implementation.
|
||||||
|
|
||||||
```eiffel
|
```eiffel
|
||||||
class
|
class
|
||||||
@@ -64,8 +64,8 @@ feature -- Basic operations
|
|||||||
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 "standalone" connector (or the deprecated "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).
|
To define another port, redefine the feature `initialize` and set up a new port number using the service options (see below).
|
||||||
|
|
||||||
|
|
||||||
```eiffel
|
```eiffel
|
||||||
@@ -95,7 +95,7 @@ The **WSF_REQUEST** gives access to the incoming data; the class provides featur
|
|||||||
|
|
||||||
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.
|
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.
|
**APPLICATION** is the root class of our example, it launches the application, using the corresponding connector, Which connector? this depends how do you want to run it `cgi`, `fcgi`, `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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -106,14 +106,13 @@ Other connectors:
|
|||||||
|
|
||||||
**WSF_STANDALONE_SERVICE_LAUNCHER**
|
**WSF_STANDALONE_SERVICE_LAUNCHER**
|
||||||
**WSF_CGI_SERVICE_LAUNCHER**
|
**WSF_CGI_SERVICE_LAUNCHER**
|
||||||
**WSF_NINO_SERVICE_LAUNCHER**
|
|
||||||
**WSF_LIBFCGI_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**.
|
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) ...```.
|
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*.
|
In the **APPLICATION_EXECUTION** class class you will need to implement the **execute** feature, get data from the request *req* and write the response in *res*.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -155,9 +154,10 @@ 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.git```
|
||||||
|
|
||||||
The example of simple service that generate plain text response is located in the directory $PATH/ewf/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/doc/workbook/basics/simple, where $PATH is where you run ```git clone``` .
|
||||||
|
Just double click on the simple.ecf file and select the simple_standalone target or if you prefer the command line, run the command:
|
||||||
|
|
||||||
```estudio -config simple.ecf -target simple_nino```
|
```estudio -config simple.ecf -target simple_standalone```
|
||||||
|
|
||||||
<a name="html"></a>
|
<a name="html"></a>
|
||||||
|
|
||||||
@@ -210,9 +210,10 @@ 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.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/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_standalone target or if you prefer the command line, run the command:
|
||||||
|
|
||||||
```estudio -config simple_html.ecf -target simple_html_nino```
|
```estudio -config simple_html.ecf -target simple_html_standalone```
|
||||||
|
|
||||||
Nav: [Workbook](../../workbook) :: [Handling Requests: Form/Query Parameter](../../handling_request/form)
|
Nav: [Workbook](../../workbook) :: [Handling Requests: Form/Query Parameter](../../handling_request/form)
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,21 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="simple" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486" library_target="simple">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="simple" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" full_class_checking="false" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="simple_nino" 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_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
|
||||||
<cluster name="simple" location=".\" recursive="true"/>
|
|
||||||
</target>
|
|
||||||
<target name="simple_cgi" extends="common">
|
<target name="simple_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,7 +23,7 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="simple_libfcgi" extends="common">
|
<target name="simple_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
@@ -39,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="simple_standalone" extends="common">
|
<target name="simple_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="simple" location=".\" recursive="true"/>
|
<cluster name="simple" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="simple" extends="simple_nino">
|
<target name="simple" extends="simple_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="simple_html" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486" library_target="simple_html">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="simple_html" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="simple_html_nino" extends="common">
|
<target name="simple_html_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="simple_html" location=".\" recursive="true"/>
|
<cluster name="simple_html" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="simple_html_cgi" extends="common">
|
<target name="simple_html_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="simple_html_libfcgi" extends="common">
|
<target name="simple_html_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="simple_html" location=".\" recursive="true"/>
|
<cluster name="simple_html" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="simple_html" extends="simple_html_nino">
|
<target name="simple_html" extends="simple_html_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ EWF Deployment
|
|||||||
4. Deploying EWF FCGI
|
4. Deploying EWF FCGI
|
||||||
5. FCGI overview
|
5. FCGI overview
|
||||||
1. Build EWF application
|
1. Build EWF application
|
||||||
2. Copy the generated exe file and the www content.htaccess CGI
|
2. Copy the generated exe file and the www content.htaccess CGI
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -30,15 +30,19 @@ EWF Deployment
|
|||||||
>Apache Version: Apache 2.4.4
|
>Apache Version: Apache 2.4.4
|
||||||
>Windows: http://www.apachelounge.com/download/
|
>Windows: http://www.apachelounge.com/download/
|
||||||
|
|
||||||
|
note: on linux (debian), use
|
||||||
|
> sudo apt-get install apache2
|
||||||
|
|
||||||
#### Deploying EWF CGI
|
#### Deploying EWF CGI
|
||||||
|
|
||||||
#### CGI overview
|
#### CGI overview
|
||||||
>A new process is started for each HTTP request. So if there are N requests to the same >CGI program, the code of the CGI program is loaded into memory N times.
|
>A new process is started for each HTTP request. So if there are N requests to the same
|
||||||
|
>CGI program, the code of the CGI program is loaded into memory N times.
|
||||||
>When a CGI program finishes handling a request, the program terminates.
|
>When a CGI program finishes handling a request, the program terminates.
|
||||||
|
|
||||||
* Build EWF application
|
* Build EWF application
|
||||||
|
|
||||||
ec -config [app.ecf] -target [app_cgi] -finalize -c_compile -project_path
|
```ec -config [app.ecf] -target [app_cgi] -finalize -c_compile -project_path```
|
||||||
|
|
||||||
|
|
||||||
>Note: change app.ecf and target app_cgi based on your own configuration.
|
>Note: change app.ecf and target app_cgi based on your own configuration.
|
||||||
@@ -48,6 +52,7 @@ EWF Deployment
|
|||||||
Copy the app.exe and the folder _www_ into a folder served by apache2, for example under.
|
Copy the app.exe and the folder _www_ into a folder served by apache2, for example under.
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
<APACHE_PATH>/htdocs.
|
<APACHE_PATH>/htdocs.
|
||||||
|
|
||||||
<APACHE_PATH> = path to your apache installation
|
<APACHE_PATH> = path to your apache installation
|
||||||
@@ -60,11 +65,14 @@ Copy the app.exe and the folder _www_ into a folder served by apache2, for exam
|
|||||||
AllowOverride All --
|
AllowOverride All --
|
||||||
Require all granted -- this is required in Apache 2.4.4
|
Require all granted -- this is required in Apache 2.4.4
|
||||||
</Directory>
|
</Directory>
|
||||||
|
```
|
||||||
|
|
||||||
Check that you have the following modules enabled
|
Check that you have the following modules enabled
|
||||||
|
|
||||||
|
```
|
||||||
LoadModule cgi_module modules/mod_cgi.so
|
LoadModule cgi_module modules/mod_cgi.so
|
||||||
LoadModule rewrite_module modules/mod_rewrite.so
|
LoadModule rewrite_module modules/mod_rewrite.so
|
||||||
|
```
|
||||||
|
|
||||||
#### Tip:
|
#### Tip:
|
||||||
>To check the syntax of your httpd.conf file. From command line run the following
|
>To check the syntax of your httpd.conf file. From command line run the following
|
||||||
@@ -77,6 +85,7 @@ Check that you have the following modules enabled
|
|||||||
|
|
||||||
#### .htaccess
|
#### .htaccess
|
||||||
|
|
||||||
|
```
|
||||||
Options +ExecCGI +Includes +FollowSymLinks -Indexes
|
Options +ExecCGI +Includes +FollowSymLinks -Indexes
|
||||||
AddHandler cgi-script exe
|
AddHandler cgi-script exe
|
||||||
|
|
||||||
@@ -91,7 +100,8 @@ Check that you have the following modules enabled
|
|||||||
RewriteRule ^(.*)$ $service/$1
|
RewriteRule ^(.*)$ $service/$1
|
||||||
|
|
||||||
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
|
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
|
||||||
</IfModule
|
</IfModule>
|
||||||
|
```
|
||||||
|
|
||||||
>Replace $service with the name of your executable service, for example app_service.exe
|
>Replace $service with the name of your executable service, for example app_service.exe
|
||||||
|
|
||||||
@@ -100,12 +110,15 @@ Check that you have the following modules enabled
|
|||||||
>To deploy FCGI you will need to download the mod_fcgi module.
|
>To deploy FCGI you will need to download the mod_fcgi module.
|
||||||
>You can get it from here http://www.apachelounge.com/download/
|
>You can get it from here http://www.apachelounge.com/download/
|
||||||
|
|
||||||
|
note: on linux (debian), use
|
||||||
|
> sudo apt-get install libapache2-mod-fastcgi
|
||||||
|
|
||||||
#### FCGI overview
|
#### FCGI overview
|
||||||
>FastCGI allows a single, long-running process to handle more than one user request while keeping close to the CGI programming model, retaining the simplicity while eliminating the overhead of creating a new process for each request. Unlike converting an application to a web server plug-in, FastCGI applications remain independent of the web server.
|
>FastCGI allows a single, long-running process to handle more than one user request while keeping close to the CGI programming model, retaining the simplicity while eliminating the overhead of creating a new process for each request. Unlike converting an application to a web server plug-in, FastCGI applications remain independent of the web server.
|
||||||
|
|
||||||
* Build EWF application
|
* Build EWF application
|
||||||
|
|
||||||
ec -config [app.ecf] -target [app_fcgi] -finalize -c_compile -project_path .
|
``` ec -config [app.ecf] -target [app_fcgi] -finalize -c_compile -project_path .```
|
||||||
|
|
||||||
>Note: change app.ecf and target app_fcgi based on your own configuration.
|
>Note: change app.ecf and target app_fcgi based on your own configuration.
|
||||||
|
|
||||||
@@ -113,6 +126,7 @@ Check that you have the following modules enabled
|
|||||||
|
|
||||||
Copy the app.exe and the folder "www" into a folder served by apache2, for example under
|
Copy the app.exe and the folder "www" into a folder served by apache2, for example under
|
||||||
|
|
||||||
|
```
|
||||||
<APACHE_PATH>/htdocs.
|
<APACHE_PATH>/htdocs.
|
||||||
|
|
||||||
<APACHE_PATH> = path to your apache installation
|
<APACHE_PATH> = path to your apache installation
|
||||||
@@ -125,6 +139,7 @@ Copy the app.exe and the folder "www" into a folder served by apache2, for exam
|
|||||||
AllowOverride All --
|
AllowOverride All --
|
||||||
Require all granted -- this is required in Apache 2.4.4
|
Require all granted -- this is required in Apache 2.4.4
|
||||||
</Directory>
|
</Directory>
|
||||||
|
```
|
||||||
|
|
||||||
>Check that you have the following modules enabled
|
>Check that you have the following modules enabled
|
||||||
|
|
||||||
@@ -133,6 +148,22 @@ Copy the app.exe and the folder "www" into a folder served by apache2, for exam
|
|||||||
|
|
||||||
>NOTE: By default Apache does not come with fcgid module, so you will need to download it, and put the module under Apache2/modules
|
>NOTE: By default Apache does not come with fcgid module, so you will need to download it, and put the module under Apache2/modules
|
||||||
|
|
||||||
|
It is also possible to set various parameters in the apache site configuration file such as:
|
||||||
|
```
|
||||||
|
<IfModule mod_fcgid.c>
|
||||||
|
# FcgidIdleTimeout 600
|
||||||
|
# FcgidBusyScanInterval 120
|
||||||
|
# FcgidProcessLifeTime 3600
|
||||||
|
# FcgidMaxProcesses 5
|
||||||
|
# FcgidMaxProcessesPerClass 100
|
||||||
|
# FcgidMinProcessesPerClass 100
|
||||||
|
# FcgidConnectTimeout 8
|
||||||
|
# FcgidIOTimeout 60
|
||||||
|
# FcgidBusyTimeout 1200
|
||||||
|
</IfModule>
|
||||||
|
```
|
||||||
|
See https://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html for more information.
|
||||||
|
|
||||||
# .htaccess FCGI
|
# .htaccess FCGI
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -140,7 +171,7 @@ http://perishablepress.com/stupid-htaccess-tricks/
|
|||||||
```
|
```
|
||||||
|
|
||||||
#### .htaccess
|
#### .htaccess
|
||||||
|
```
|
||||||
Options +ExecCGI +Includes +FollowSymLinks -Indexes
|
Options +ExecCGI +Includes +FollowSymLinks -Indexes
|
||||||
|
|
||||||
<IfModule mod_fcgid.c>
|
<IfModule mod_fcgid.c>
|
||||||
@@ -164,6 +195,7 @@ http://perishablepress.com/stupid-htaccess-tricks/
|
|||||||
|
|
||||||
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
|
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
```
|
||||||
|
|
||||||
Replace $service with the name of your executable $service, for example app_service.exe
|
Replace $service with the name of your executable $service, for example app_service.exe
|
||||||
You will need to create an service.ews file, this file will be located at the same place where you copy your app service executable.
|
You will need to create an service.ews file, this file will be located at the same place where you copy your app service executable.
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="exel" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486" library_target="exel">l
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="exel" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="exel_nino" extends="common">
|
<target name="exel_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="exel" location=".\" recursive="true"/>
|
<cluster name="exel" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="exel_cgi" extends="common">
|
<target name="exel_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="exel_libfcgi" extends="common">
|
<target name="exel_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="exel" location=".\" recursive="true"/>
|
<cluster name="exel" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="exel" extends="exel_nino">
|
<target name="exel" extends="exel_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ Example
|
|||||||
res.put_string (l_msg)
|
res.put_string (l_msg)
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
Both features takes an INTEGER (the status code) as an formal argument, you can use 200, 300, 500 etc directly, but instead of using explicit numbers, it's recommended to use the constants defined in the class [HTTP_STATUS_CODE](). The name of each constant is based from the standard [HTTP 1.1](https://httpwg.github.io/).
|
Both features takes an INTEGER (the status code) as an formal argument, you can use 200, 300, 500 etc directly, but instead of using explicit numbers, it's recommended to use the constants defined in the class `HTTP_STATUS_CODE`. The name of each constant is based from the standard [HTTP 1.1](https://httpwg.github.io/).
|
||||||
|
|
||||||
<a name="redirect"></a>
|
<a name="redirect"></a>
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ The next code show a custom feature to write a redirection, you can use found or
|
|||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
The class [WSF_RESPONSE]() provide features to work with redirection
|
The class `WSF_RESPONSE` provide features to work with redirection
|
||||||
|
|
||||||
```eiffel
|
```eiffel
|
||||||
redirect_now (a_url: READABLE_STRING_8)
|
redirect_now (a_url: READABLE_STRING_8)
|
||||||
@@ -487,6 +487,7 @@ end
|
|||||||
```
|
```
|
||||||
|
|
||||||
Using cURL to test the application
|
Using cURL to test the application
|
||||||
|
---
|
||||||
|
|
||||||
In the first call we use the ```res.redirect_now (l_engine_url)``` feature
|
In the first call we use the ```res.redirect_now (l_engine_url)``` feature
|
||||||
```
|
```
|
||||||
@@ -681,9 +682,9 @@ helpers
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
The other way to build headers is using the class [HTTP_HEADER](), that provide routines to build a header. It's recomended to
|
The other way to build headers is using the class `HTTP_HEADER`, that provide routines to build a header. It's recomended to
|
||||||
take a look at constants classes such as [HTTP_MIME_TYPES](),[HTTP_HEADER_NAMES](),[HTTP_STATUS_CODE](),[HTTP_REQUEST_METHODS](), or
|
take a look at constants classes such as `HTTP_MIME_TYPES`,`HTTP_HEADER_NAMES`,`HTTP_STATUS_CODE`,`HTTP_REQUEST_METHODS`, or
|
||||||
[HTTP_CONSTANTS]() which groups them for convenience.
|
`HTTP_CONSTANTS` which groups them for convenience.
|
||||||
|
|
||||||
|
|
||||||
```eiffel
|
```eiffel
|
||||||
@@ -702,7 +703,7 @@ take a look at constants classes such as [HTTP_MIME_TYPES](),[HTTP_HEADER_NAMES]
|
|||||||
res.put_string (l_msg)
|
res.put_string (l_msg)
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
The class [HTTP_HEADER]() also supplies a number of convenience routines for specifying common headers, in fact the features are inherited from the class [HTTP_HEADER_MODIFIER].
|
The class `HTTP_HEADER` also supplies a number of convenience routines for specifying common headers, in fact the features are inherited from the class `HTTP_HEADER_MODIFIER`.
|
||||||
|
|
||||||
|
|
||||||
```eiffel
|
```eiffel
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="headers" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486" library_target="headers">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="headers" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
<exclude>/EIFGENs$</exclude>
|
||||||
<exclude>/CVS$</exclude>
|
<exclude>/CVS$</exclude>
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="headers_nino" extends="common">
|
<target name="headers_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="headers" location=".\" recursive="true"/>
|
<cluster name="headers" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="headers_cgi" extends="common">
|
<target name="headers_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="headers_libfcgi" extends="common">
|
<target name="headers_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="headers" location=".\" recursive="true"/>
|
<cluster name="headers" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="headers" extends="headers_nino">
|
<target name="headers" extends="headers_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="search" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486" library_target="search">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="search" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="search_nino" extends="common">
|
<target name="search_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="search" location=".\" recursive="true"/>
|
<cluster name="search" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="search_cgi" extends="common">
|
<target name="search_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="search_libfcgi" extends="common">
|
<target name="search_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="search" location=".\" recursive="true"/>
|
<cluster name="search" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="search" extends="search_nino">
|
<target name="search" extends="search_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="status" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486" library_target="status">l
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="status" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="status_nino" extends="common">
|
<target name="status_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="status" location=".\" recursive="true"/>
|
<cluster name="status" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="status_cgi" extends="common">
|
<target name="status_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="status_libfcgi" extends="common">
|
<target name="status_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="status" location=".\" recursive="true"/>
|
<cluster name="status" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="status" extends="status_nino">
|
<target name="status" extends="status_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -1,42 +1,42 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="example" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486" library_target="example">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="example" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" full_class_checking="false" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="example_nino" extends="common">
|
<target name="example_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="example" location=".\" recursive="true"/>
|
<cluster name="example" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="example_cgi" extends="common">
|
<target name="example_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
<cluster name="example" location=".\" recursive="true"/>
|
<cluster name="example" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="example_libfcgi" extends="common">
|
<target name="example_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="transitional" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="example" location=".\" recursive="true"/>
|
<cluster name="example" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="example" extends="example_nino">
|
<target name="example" extends="example_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ Client send cookies to server
|
|||||||
|
|
||||||
## Write and Read Cookies.
|
## Write and Read Cookies.
|
||||||
|
|
||||||
To send a cookie to the client we should use the [HTTP_HEADER] class, and call ```h.put_cookie``` feature or
|
To send a cookie to the client we should use the **HTTP_HEADER** class, and call ```h.put_cookie``` feature or
|
||||||
```h.put_cookie_with_expiration_date``` feature, see [How to set Cookies]() to learn the details, and the set it to response object [WSF_RESPONSE] as we saw previously.
|
```h.put_cookie_with_expiration_date``` feature, see `How to set Cookies` to learn the details, and the set it to response object **WSF_RESPONSE** as we saw previously.
|
||||||
|
|
||||||
We will show an example.
|
We will show an example.
|
||||||
|
|
||||||
|
|||||||
@@ -22,17 +22,17 @@ Nav: [Workbook](../../workbook) :: [Basic Concepts](../../basics/basics) :: [Han
|
|||||||
- [Examples](#examples)
|
- [Examples](#examples)
|
||||||
|
|
||||||
|
|
||||||
An HTML Form can handle GET and POST requests.
|
An HTML Form can handle `GET` and `POST` requests.
|
||||||
When we use a form with method GET, the data is attached at the end of the url for example:
|
When we use a form with method `GET`, the data is attached at the end of the url for example:
|
||||||
|
|
||||||
>http://wwww.example.com?key1=value1&...keyn=valuen
|
>http://wwww.example.com?key1=value1&...keyn=valuen
|
||||||
|
|
||||||
If we use the method POST, the data is sent to the server in a different line.
|
If we use the method `POST`, the data is sent to the server in a different line.
|
||||||
|
|
||||||
Extracting form data from the server side is one of the most tedious parts. If you do it by hand, you will need
|
Extracting form data from the server side is one of the most tedious parts. If you do it by hand, you will need
|
||||||
to parse the input, you'll have to URL-decode the value.
|
to parse the input, you'll have to URL-decode the value.
|
||||||
|
|
||||||
Here we will show you how to read input submitted by a user using a Form (GET and POST).
|
Here we will show you how to read input submitted by a user using a Form (`GET` and `POST`).
|
||||||
* How to handle missing values:
|
* How to handle missing values:
|
||||||
* client side validattion, server side validations, set default if it's a valid option.
|
* client side validattion, server side validations, set default if it's a valid option.
|
||||||
* How to populate Eiffel objects from the request data.
|
* How to populate Eiffel objects from the request data.
|
||||||
@@ -40,50 +40,57 @@ Here we will show you how to read input submitted by a user using a Form (GET an
|
|||||||
<a name="read"></a>
|
<a name="read"></a>
|
||||||
|
|
||||||
## Reading Form Data
|
## Reading Form Data
|
||||||
EWF [WSF_REQUEST]() class, provides features to handling this form parsing automatically.
|
EWF `WSF_REQUEST` class, provides features to handling this form parsing automatically.
|
||||||
|
|
||||||
<a name="query"></a>
|
<a name="query"></a>
|
||||||
|
|
||||||
### Query Parameters
|
### Query Parameters
|
||||||
|
|
||||||
|
```eiffel
|
||||||
WSF_REQUEST.query_parameters: ITERABLE [WSF_VALUE]
|
WSF_REQUEST.query_parameters: ITERABLE [WSF_VALUE]
|
||||||
-- All query parameters
|
-- All query parameters
|
||||||
|
|
||||||
WSF_REQUEST.query_parameter (a_name: READABLE_STRING_GENERAL): detachable WSF_VALUE
|
WSF_REQUEST.query_parameter (a_name: READABLE_STRING_GENERAL): detachable WSF_VALUE
|
||||||
-- Query parameter for name `a_name'.
|
-- Query parameter for name `a_name'.
|
||||||
|
```
|
||||||
|
|
||||||
<a name="form_parameters"></a>
|
<a name="form_parameters"></a>
|
||||||
|
|
||||||
### Form Parameters
|
### Form Parameters
|
||||||
|
|
||||||
|
```eiffel
|
||||||
WSF_REQUEST.form_parameters: ITERABLE [WSF_VALUE]
|
WSF_REQUEST.form_parameters: ITERABLE [WSF_VALUE]
|
||||||
-- All form parameters sent by a POST
|
-- All form parameters sent by a POST
|
||||||
|
|
||||||
WSF_REQUEST.form_parameter (a_name: READABLE_STRING_GENERAL): detachable WSF_VALUE
|
WSF_REQUEST.form_parameter (a_name: READABLE_STRING_GENERAL): detachable WSF_VALUE
|
||||||
-- Field for name `a_name'.
|
-- Field for name `a_name'.
|
||||||
|
```
|
||||||
|
|
||||||
The values supplied to form_parameter and query_parameter are case sensitive.
|
The values supplied to `form_parameter` and `query_parameter` are _case_ _sensitive_.
|
||||||
|
|
||||||
<a name="uniform"></a>
|
<a name="uniform"></a>
|
||||||
|
|
||||||
### Read Data
|
### Read Data
|
||||||
The previous features, let you read the data one way for GET request and a different way for POST request. WSF_REQUEST provide a feature to read all the data in a uniform way.
|
The previous features, let you read the data one way for `GET` request and a different way for `POST` request. **WSF_REQUEST** provide a feature to read all the data in a uniform way.
|
||||||
|
|
||||||
|
```eiffel
|
||||||
WSF_REQUEST.item (a_name: READABLE_STRING_GENERAL): detachable WSF_VALUE
|
WSF_REQUEST.item (a_name: READABLE_STRING_GENERAL): detachable WSF_VALUE
|
||||||
-- Variable named `a_name' from any of the variables container
|
-- Variable named `a_name' from any of the variables container
|
||||||
-- and following a specific order: form_, query_ and path_ parameters
|
-- and following a specific order: form_, query_ and path_ parameters
|
||||||
|
```
|
||||||
|
|
||||||
So, you use **WSF_REQUEST.item** feature exactly the same way for GET and POST request.
|
So, you can use **WSF_REQUEST.item** feature exactly the same way for `GET` and `POST` request.
|
||||||
|
|
||||||
>Note: if a query parameter has the same name as a form paramenter req.item will retrieve the form paramenter. Remember the precedence: form > query > path
|
>Note: if a query parameter has the same name as a form paramenter req.item will retrieve the form paramenter. Remember the precedence: `form` > `query` > `path`
|
||||||
|
|
||||||
|
|
||||||
<a name="reading_pv"></a>
|
<a name="reading_pv"></a>
|
||||||
|
|
||||||
## Reading Parameters and Values
|
## Reading Parameters and Values
|
||||||
|
|
||||||
Suppose we have the following HTML5 form using Method POST. This HTML5 form has client side form validation using the new HTML5 attribute, you can do the same using Javascript. So in this case if the user does not fill the fields as expected the form will not be submitted to the server.
|
Suppose we have the following HTML5 form using method `POST`. This HTML5 form has client side form validation using the new HTML5 `attribute`, you can do the same using Javascript. So in this case if the user does not fill the fields as expected the form will not be submitted to the server.
|
||||||
|
|
||||||
>Note: You want to validate on the server side because you can protect against the malicious user, who can easily bypass your JavaScript and submit dangerous input to the server.
|
>Note: it is recommended to validate client side input on the server side (as a double check) because you can protect against the malicious user, who can easily bypass your JavaScript and submit dangerous input to the server.
|
||||||
|
|
||||||
```
|
```
|
||||||
<h1> EWF Handling Client Request: Form example </h1>
|
<h1> EWF Handling Client Request: Form example </h1>
|
||||||
@@ -122,17 +129,17 @@ Suppose we have the following HTML5 form using Method POST. This HTML5 form has
|
|||||||
<a name="all_names"></a>
|
<a name="all_names"></a>
|
||||||
|
|
||||||
### How to read all parameter names
|
### How to read all parameter names
|
||||||
To read all the parameters names we simple call WSF_REQUEST.form_parameters.
|
To read all the parameters names we simple call **WSF_REQUEST.form_parameters**.
|
||||||
|
|
||||||
```
|
```eiffel
|
||||||
req: WSF_REQUEST
|
req: WSF_REQUEST
|
||||||
across req.form_parameters as ic loop show_parameter_name (ic.item.key) end
|
across req.form_parameters as ic loop show_parameter_name (ic.item.key) end
|
||||||
```
|
```
|
||||||
<a name="single_values"></a>
|
<a name="single_values"></a>
|
||||||
|
|
||||||
### How to read single values
|
### How to read single values
|
||||||
To read a particular parameter, a single value, for example `given-name', we simple call WSF_REQUEST.form_parameter (a_name) and we check if it's attached to WSF_STRING (represents a String parameter)
|
To read a particular parameter, a single value, for example `given-name`, we simple call **WSF_REQUEST.form_parameter (a_name)** and we check if it's attached to **WSF_STRING** (represents a String parameter)
|
||||||
```
|
```eiffel
|
||||||
req: WSF_REQUEST
|
req: WSF_REQUEST
|
||||||
if attached {WSF_STRING} req.form_paramenter ('given-name') as l_given_name then
|
if attached {WSF_STRING} req.form_paramenter ('given-name') as l_given_name then
|
||||||
-- Work with the given parameter, for example populate an USER object
|
-- Work with the given parameter, for example populate an USER object
|
||||||
@@ -145,9 +152,9 @@ To read a particular parameter, a single value, for example `given-name', we sim
|
|||||||
|
|
||||||
### How to read multiple values
|
### How to read multiple values
|
||||||
|
|
||||||
To read multiple values, for example in the case of `languages', we simple call WSF_REQUEST.form_parameter (a_name) and we check if it's attached to WSF_MULTIPLE_STRING (represents a String parameter)
|
To read multiple values, for example in the case of `languages`, we simple call **WSF_REQUEST.form_parameter (a_name)** and we check if it's attached to **WSF_MULTIPLE_STRING** (represents a String parameter)
|
||||||
|
|
||||||
```
|
```eiffel
|
||||||
req: WSF_REQUEST
|
req: WSF_REQUEST
|
||||||
idioms: LIST[STRING]
|
idioms: LIST[STRING]
|
||||||
-- the argument is case sensitive
|
-- the argument is case sensitive
|
||||||
@@ -164,18 +171,18 @@ To read multiple values, for example in the case of `languages', we simple call
|
|||||||
-- Value missing
|
-- Value missing
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
In this case we are handling strings values, but in some cases you will need to do a conversion, betweend the strings that came from the request to map them to your domain model.
|
In this case we are handling strings values, but in some cases you will need to do a conversion, between the strings that came from the request to map them to your domain model.
|
||||||
|
|
||||||
<a name="table_values"></a>
|
<a name="table_values"></a>
|
||||||
|
|
||||||
### How to read table values
|
### How to read table values
|
||||||
This is particularly useful when you have a request with the following format
|
This is particularly useful when you have a request with the following format
|
||||||
|
|
||||||
``` <a href="/link?tab[a]=1&tab[b]=2&tab[c]=foo"> ```
|
```<a href="/link?tab[a]=1&tab[b]=2&tab[c]=foo">```
|
||||||
|
|
||||||
To read table values, for example in the case of `tab', we simple call WSF_REQUEST.form_parameter (a_name) and we check if it's attached to WSF_TABLE.
|
To read table values, for example in the case of `tab`, we simple call **WSF_REQUEST.form_parameter (a_name)** and we check if it's attached to **WSF_TABLE**.
|
||||||
|
|
||||||
```
|
```eiffel
|
||||||
if attached {WSF_TABLE} req.query_parameter ("tab") as l_tab then
|
if attached {WSF_TABLE} req.query_parameter ("tab") as l_tab then
|
||||||
l_parameter_names.append ("<br>")
|
l_parameter_names.append ("<br>")
|
||||||
l_parameter_names.append (l_tab.name)
|
l_parameter_names.append (l_tab.name)
|
||||||
@@ -198,14 +205,14 @@ end
|
|||||||
<a name="raw_data"></a>
|
<a name="raw_data"></a>
|
||||||
|
|
||||||
## Reading Raw Data
|
## Reading Raw Data
|
||||||
You can also access the data in raw format, it means you will need to parse and url-decode it, and also you will not be able to use the previous features, by default, to enable that you need to call `req.set_raw_input_data_recorded (True)'. This feature (reading raw data) is useful if you are reading POST data with JSON or XML formats, but it's not convinient for HTML forms.
|
You can also access the data in raw format, it means you will need to parse and url-decode it, and also you will not be able to use the previous features, by default, to enable that, you will need to call `req.set_raw_input_data_recorded (True)`. This feature (reading raw data) is useful if you are reading `POST` data with JSON or XML formats, but it's not convinient for HTML forms.
|
||||||
|
|
||||||
To read raw data you need to do this
|
To read raw data you need to do this
|
||||||
|
|
||||||
```
|
```eiffel
|
||||||
l_raw_data:STRING
|
l_raw_data:STRING
|
||||||
|
|
||||||
req.set_raw_input_data_recorded (True) --
|
req.set_raw_input_data_recorded (True)
|
||||||
create l_raw_data.make_empty
|
create l_raw_data.make_empty
|
||||||
req.read_input_data_into (l_raw_data)
|
req.read_input_data_into (l_raw_data)
|
||||||
```
|
```
|
||||||
@@ -216,7 +223,7 @@ To read raw data you need to do this
|
|||||||
|
|
||||||
## Upload Files
|
## Upload Files
|
||||||
How can we read data when the date come from an uploaded file/s?.
|
How can we read data when the date come from an uploaded file/s?.
|
||||||
HTML supports a form element ```<input type="File" ... > ``` to upload a single file and ```<input type="File" ... multiplr> ``` to upload multiple files.
|
HTML supports a form element ```<input type="File" ... >``` to upload a single file and ```<input type="File" ... multiplr> ``` to upload multiple files.
|
||||||
|
|
||||||
So supose we have the following form
|
So supose we have the following form
|
||||||
|
|
||||||
@@ -245,16 +252,16 @@ So supose we have the following form
|
|||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
|
|
||||||
The class WSF_REQUEST has defines mechanism to work with uploaded files. We can call the query
|
The class **WSF_REQUEST** has a mechanism to work with uploaded files. We can call the query
|
||||||
|
|
||||||
```
|
```eiffel
|
||||||
WSF_REQUEST.has_uploaded_file: BOOLEAN
|
WSF_REQUEST.has_uploaded_file: BOOLEAN
|
||||||
-- Has any uploaded file?
|
-- Has any uploaded file?
|
||||||
```
|
```
|
||||||
|
|
||||||
to check if the request form parameters has any uploaded file, and we can call the feature
|
to check if the request form parameters has any uploaded file, we can call the feature
|
||||||
|
|
||||||
```
|
```eiffel
|
||||||
WSF_REQUEST.uploaded_files: ITERABLE [WSF_UPLOADED_FILE]
|
WSF_REQUEST.uploaded_files: ITERABLE [WSF_UPLOADED_FILE]
|
||||||
-- uploaded files values
|
-- uploaded files values
|
||||||
--| filename: original path from the user
|
--| filename: original path from the user
|
||||||
@@ -264,9 +271,9 @@ WSF_REQUEST.uploaded_files: ITERABLE [WSF_UPLOADED_FILE]
|
|||||||
--| error: if /= 0 , there was an error : TODO ...
|
--| error: if /= 0 , there was an error : TODO ...
|
||||||
--| size: size of the file given by the http request
|
--| size: size of the file given by the http request
|
||||||
```
|
```
|
||||||
to iterate over the uploaded files if any, and the details in the class [WSF_UPLOADED_FILE].
|
to iterate over the uploaded files if any, and the details in the class **WSF_UPLOADED_FILE**.
|
||||||
|
|
||||||
The following snipet code show how to work with Uploaded files using EWF [WSF_REQUEST] class, in the example
|
The following snipet code show how to work with Uploaded files using EWF **WSF_REQUEST** class, in the example
|
||||||
we build a simple html answer with basic information, if there is not uploaded files, we send a 400 status code
|
we build a simple html answer with basic information, if there is not uploaded files, we send a 400 status code
|
||||||
and a simple message.
|
and a simple message.
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="form" library_target="form">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="form" uuid="4BF86AB0-AEEE-46BF-93DE-0463E3510ACE">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="form_nino" extends="common">
|
<target name="form_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="form" location=".\" recursive="true"/>
|
<cluster name="form" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="form_cgi" extends="common">
|
<target name="form_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="form_libfcgi" extends="common">
|
<target name="form_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="form" location=".\" recursive="true"/>
|
<cluster name="form" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="form" extends="form_nino">
|
<target name="form" extends="form_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="form" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486" library_target="form">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="form" uuid="C28C4F53-9963-46C0-A080-8F13E94E7486">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="form_nino" extends="common">
|
<target name="form_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="form" location=".\" recursive="true"/>
|
<cluster name="form" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="form_cgi" extends="common">
|
<target name="form_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="form_libfcgi" extends="common">
|
<target name="form_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="form" location=".\" recursive="true"/>
|
<cluster name="form" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="form" extends="form_nino">
|
<target name="form" extends="form_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Nav: [Workbook](../../workbook) :: [Handling Requests: Form/Query parameters](..
|
|||||||
# Handling Requests: Headers
|
# Handling Requests: Headers
|
||||||
|
|
||||||
##### Introduction
|
##### Introduction
|
||||||
- The [HTTP request header fields (also known as "headers")](https://httpwg.github.io/specs/rfc7231.html#request.header.fields) are set by the client (usually web browser) and sent in the header of the http request text (see http protocol), as opposed to form or query parameters [Form Data]().
|
- The [HTTP request header fields (also known as "headers")](https://httpwg.github.io/specs/rfc7231.html#request.header.fields) are set by the client (usually web browser) and sent in the header of the http request text (see http protocol), as opposed to form or query parameters `Form Data`.
|
||||||
- Query parameters are encoded in the URL [GET requests](https://httpwg.github.io/specs/rfc7230.html#http.message).
|
- Query parameters are encoded in the URL [GET requests](https://httpwg.github.io/specs/rfc7230.html#http.message).
|
||||||
- Form parameters are encoded in the request message for [POST/PUT requests.](https://httpwg.github.io/specs/rfc7230.html#http.message).
|
- Form parameters are encoded in the request message for [POST/PUT requests.](https://httpwg.github.io/specs/rfc7230.html#http.message).
|
||||||
|
|
||||||
@@ -44,13 +44,13 @@ That section explains how to read HTTP information sent by the browser via the r
|
|||||||
The Eiffel Web Framework is using the traditional Common Gateway Interface (CGI) programming interface to access the header fields, query and form parameters.
|
The Eiffel Web Framework is using the traditional Common Gateway Interface (CGI) programming interface to access the header fields, query and form parameters.
|
||||||
Among other, this means the header fields are exposed with associated CGI field names:
|
Among other, this means the header fields are exposed with associated CGI field names:
|
||||||
- the header field name are uppercased, and any dash "-" replaced by underscore "_".
|
- the header field name are uppercased, and any dash "-" replaced by underscore "_".
|
||||||
- and also prefixed by "HTTP_" except for CONTENT_TYPE and CONTENT_LENGTH.
|
- and also prefixed by "HTTP_" except for `CONTENT_TYPE` and `CONTENT_LENGTH`.
|
||||||
- For instance `X-Server` will be known as `HTTP_X_SERVER`.
|
- For instance `X-Server` will be known as `HTTP_X_SERVER`.
|
||||||
|
|
||||||
<a name="read_header"></a>
|
<a name="read_header"></a>
|
||||||
|
|
||||||
## Reading HTTP Header fields
|
## Reading HTTP Header fields
|
||||||
EWF [WSF_REQUEST]() class provides features to access HTTP headers.
|
EWF `WSF_REQUEST` class provides features to access HTTP headers.
|
||||||
|
|
||||||
Reading most headers is straightforward by calling:
|
Reading most headers is straightforward by calling:
|
||||||
- the corresponding `http_*` functions such as `http_accept` for header "Accept".
|
- the corresponding `http_*` functions such as `http_accept` for header "Accept".
|
||||||
@@ -89,7 +89,7 @@ GET http://eiffel.org/search?q=EiffelBase HTTP/1.1
|
|||||||
Overview of the features
|
Overview of the features
|
||||||
|
|
||||||
* HTTP method
|
* HTTP method
|
||||||
- The function `request_method: READABLE_STRING_8` gives access to the HTTP request method, (usually GET or POST in conventional Web Applications), but with the raise of REST APIs other methods are also frequently used such as HEAD, PUT, DELETE, OPTIONS, or TRACE.
|
- The function `request_method: READABLE_STRING_8` gives access to the HTTP request method, (usually `GET` or `POST` in conventional Web Applications), but with the raise of REST APIs other methods are also frequently used such as `HEAD`, `PUT`, `DELETE`, `OPTIONS`, or `TRACE`.
|
||||||
A few functions helps determining quickly the nature of the request method:
|
A few functions helps determining quickly the nature of the request method:
|
||||||
- `is_get_request_method: BOOLEAN -- Is Current a GET request method?`
|
- `is_get_request_method: BOOLEAN -- Is Current a GET request method?`
|
||||||
- `is_put_request_method: BOOLEAN -- Is Current a PUT request method?`
|
- `is_put_request_method: BOOLEAN -- Is Current a PUT request method?`
|
||||||
@@ -118,7 +118,7 @@ This section summarizes the headers most often used; for more information, see t
|
|||||||
|
|
||||||
* [Accept](https://httpwg.github.io/specs/rfc7231.html#header.accept)
|
* [Accept](https://httpwg.github.io/specs/rfc7231.html#header.accept)
|
||||||
- The "Accept" header field can be used by user agents (browser or other clients) to define response media types that are acceptable. Accept header fields can be used to indicate that the request is limited to a small set of desired types, as in the case of a request for an inline image.
|
- The "Accept" header field can be used by user agents (browser or other clients) to define response media types that are acceptable. Accept header fields can be used to indicate that the request is limited to a small set of desired types, as in the case of a request for an inline image.
|
||||||
For example, assume an APIs Learn4Kids can respond with XML or JSON data (JSON format have some advantages over XML, readability, parsing etc...), a client can define its preference using "Accept: application/json" to request data in JSON format, or "Accept: application/xml" to get XML format. In other case the server sends a not acceptable response. Note that the client can define an ordered list of accepted content types, including "*", the client will get the response and know the content type via the response header field "Content-Type". Related [Content-Negotiation]()
|
For example, assume an APIs Learn4Kids can respond with XML or JSON data (JSON format have some advantages over XML, readability, parsing etc...), a client can define its preference using "Accept: application/json" to request data in JSON format, or "Accept: application/xml" to get XML format. In other case the server sends a not acceptable response. Note that the client can define an ordered list of accepted content types, including "*", the client will get the response and know the content type via the response header field "Content-Type". Related `Content-Negotiation`
|
||||||
|
|
||||||
<a name="accept_charset"></a>
|
<a name="accept_charset"></a>
|
||||||
|
|
||||||
@@ -307,11 +307,10 @@ To be completed.
|
|||||||
|
|
||||||
#### Detecting Browser Types
|
#### Detecting Browser Types
|
||||||
|
|
||||||
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 User-Agent header identifies the specific browser/client that is sending the request. The following code shows an [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.
|
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```
|
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.
|
||||||
feature to retrieve the current browser name or Unknown in other case.
|
|
||||||
|
|
||||||
```eiffel
|
```eiffel
|
||||||
class
|
class
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="browsers" library_target="browsers">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="browsers" uuid="6E4221A7-CB45-4B14-98F2-75F9C273DF68">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="browsers_nino" extends="common">
|
<target name="browsers_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="browsers" location=".\" recursive="true"/>
|
<cluster name="browsers" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="browsers_cgi" extends="common">
|
<target name="browsers_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="browsers_libfcgi" extends="common">
|
<target name="browsers_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="browsers" location=".\" recursive="true"/>
|
<cluster name="browsers" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="browsers" extends="browsers_nino">
|
<target name="browsers" extends="browsers_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="cgi_variables" library_target="cgi_variables">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="cgi_variables" uuid="73FCA1D1-DE9D-4112-96BB-92F2C40AC5D1">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="cgi_variables_nino" extends="common">
|
<target name="cgi_variables_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="cgi_variables" location=".\" recursive="true"/>
|
<cluster name="cgi_variables" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="cgi_variables_cgi" extends="common">
|
<target name="cgi_variables_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="cgi_variables_libfcgi" extends="common">
|
<target name="cgi_variables_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="cgi_variables" location=".\" recursive="true"/>
|
<cluster name="cgi_variables" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="cgi_variables" extends="cgi_variables_nino">
|
<target name="cgi_variables" extends="cgi_variables_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="header_fields" library_target="header_fields">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="header_fields" uuid="F4644919-0908-470F-A0C1-66C2E08C2D90">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="header_fields_nino" extends="common">
|
<target name="header_fields_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="header_fields" location=".\" recursive="true"/>
|
<cluster name="header_fields" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="header_fields_cgi" extends="common">
|
<target name="header_fields_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="header_fields_libfcgi" extends="common">
|
<target name="header_fields_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="header_fields" location=".\" recursive="true"/>
|
<cluster name="header_fields" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="header_fields" extends="header_fields_nino">
|
<target name="header_fields" extends="header_fields_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-10-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-10-0 http://www.eiffel.com/developers/xml/configuration-1-10-0.xsd" name="upload" library_target="upload">
|
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="upload" uuid="274576E6-E7EA-420F-ADED-0CC6955E48DD">
|
||||||
<target name="common" abstract="true">
|
<target name="common" abstract="true">
|
||||||
<file_rule>
|
<file_rule>
|
||||||
<exclude>/EIFGENs$</exclude>
|
|
||||||
<exclude>/CVS$</exclude>
|
|
||||||
<exclude>/.svn$</exclude>
|
<exclude>/.svn$</exclude>
|
||||||
|
<exclude>/CVS$</exclude>
|
||||||
|
<exclude>/EIFGENs$</exclude>
|
||||||
</file_rule>
|
</file_rule>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||||
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
<library name="http" location="$ISE_LIBRARY\contrib\library\network\protocol\http\http-safe.ecf"/>
|
||||||
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
<library name="wsf" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\wsf-safe.ecf"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="upload_nino" extends="common">
|
<target name="upload_standalone" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_nino" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\nino-safe.ecf"/>
|
<library name="default_standalone" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\standalone-safe.ecf"/>
|
||||||
<cluster name="upload" location=".\" recursive="true"/>
|
<cluster name="upload" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="upload_cgi" extends="common">
|
<target name="upload_cgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
<library name="default_cgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\cgi-safe.ecf"/>
|
||||||
@@ -31,12 +31,12 @@
|
|||||||
</target>
|
</target>
|
||||||
<target name="upload_libfcgi" extends="common">
|
<target name="upload_libfcgi" extends="common">
|
||||||
<root class="APPLICATION" feature="make_and_launch"/>
|
<root class="APPLICATION" feature="make_and_launch"/>
|
||||||
<option warning="true" is_attached_by_default="true" void_safety="all" syntax="transitional">
|
<option warning="true" void_safety="all">
|
||||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||||
</option>
|
</option>
|
||||||
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
<library name="default_libfcgi" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\wsf\default\libfcgi-safe.ecf"/>
|
||||||
<cluster name="upload" location=".\" recursive="true"/>
|
<cluster name="upload" location=".\" recursive="true"/>
|
||||||
</target>
|
</target>
|
||||||
<target name="upload" extends="upload_nino">
|
<target name="upload" extends="upload_standalone">
|
||||||
</target>
|
</target>
|
||||||
</system>
|
</system>
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
#include <windows.h>
|
|
||||||
|
|
||||||
STRINGTABLE
|
|
||||||
BEGIN
|
|
||||||
1 "This Program was made using EiffelStudio using Visual Studio C++"
|
|
||||||
END
|
|
||||||
Reference in New Issue
Block a user