From f254b599c080178eb809c218d898f6ed46323d25 Mon Sep 17 00:00:00 2001 From: jvelilla Date: Mon, 29 Jun 2015 16:17:43 -0300 Subject: [PATCH 01/11] Update basic document to the new EWF concurrent design --- doc/workbook/basics/APPLICATION_EXECUTION.png | Bin 0 -> 5971 bytes doc/workbook/basics/Launcher Hierarchy.png | Bin 0 -> 16595 bytes doc/workbook/basics/basics.md | 84 ++++++++++-------- 3 files changed, 45 insertions(+), 39 deletions(-) create mode 100644 doc/workbook/basics/APPLICATION_EXECUTION.png create mode 100644 doc/workbook/basics/Launcher Hierarchy.png diff --git a/doc/workbook/basics/APPLICATION_EXECUTION.png b/doc/workbook/basics/APPLICATION_EXECUTION.png new file mode 100644 index 0000000000000000000000000000000000000000..270c78aa571825451c5620c5d424292dd348f7ac GIT binary patch literal 5971 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 literal 0 HcmV?d00001 diff --git a/doc/workbook/basics/Launcher Hierarchy.png b/doc/workbook/basics/Launcher Hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c047237a1a71b690c29fd31dea6d7f93f77991 GIT binary patch literal 16595 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 ONa2;LY=!ijkpBh`q`oQu literal 0 HcmV?d00001 diff --git a/doc/workbook/basics/basics.md b/doc/workbook/basics/basics.md index e425620a..c26867f2 100644 --- a/doc/workbook/basics/basics.md +++ b/doc/workbook/basics/basics.md @@ -14,83 +14,89 @@ Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query Parameter](/wor ## EWF service structure -The following code describes the basic structure of an EWF basic service that handles HTTP requests. +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 class - SERVICE_TEMPLATE + APPLICACTION inherit - WSF_DEFAULT_SERVICE -- Todo explain this, and the concept of launchers and connectors () + WSF_DEFAULT_SERVICE [APPLICATION_EXECUTION] create - make_and_launch + make_and_launch -feature -- Basic operations - - execute (req: WSF_REQUEST; res: WSF_RESPONSE) - do - -- To read incoming HTTP request, we need to use `req' - - -- May require talking to databases or other services. - - -- To send a response we need to setup, the status code and - -- the response headers and the content we want to send out our client - end end ``` -When using the "nino" connector, by default the service listens on port 80, but often this port is already used by other applications, so it is recommended to use another port. -To define another port, redefine the feature `initialize' and set up a new port number using the service options (see below). +The class ```APPLICATION``` inherit from +```WSF_DEFAULT_SERVICE [G ->WSF_EXECUTION create make end]``` it will be responsible to launch the service an set optional options. + +The class ```APPLICATION_EXECUTION``` is an implementation ```WSF_EXECUTION``` interface, which is instantiated for each incoming request. ```eiffel class - SERVICE_TEMPLATE + APPLICATION_EXECUTION + inherit - WSF_DEFAULT_SERVICE - redefine + WSF_EXECUTION + +create + make + +feature -- Basic operations + + execute (req: WSF_REQUEST; res: WSF_RESPONSE) + do + -- To read incoming HTTP request, we need to use `req' + + -- May require talking to databases or other services. + + -- To send a response we need to setup, the status code and + -- the response headers and the content we want to send out our client + end +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. +To define another port, redefine the feature `initialize' and set up a new port number using the service options (see below). + + +```eiffel +class + APPLICATION + +inherit + WSF_DEFAULT_SERVICE [APPLICATION_EXECUTION] + redefine initialize end create - make_and_launch + make_and_launch feature {NONE} -- Initialization initialize -- Initialize current service. - -- on port 9090 do set_service_option ("port", 9090) end - -feature -- Basic operations - - execute (req: WSF_REQUEST; res: WSF_RESPONSE) - -- Execute the incoming request. - do - -- To read incoming HTTP requires, we need to use `req' - - -- May require talking to databases or other services. - - -- To send a response we need to setup, the status code and - -- the response headers and the content we want to send out client - end end ``` The **WSF_REQUEST** gives access to the incoming data; the class provides features to get information such as request method, form data, query parameters, uploaded files, HTTP request headers, and hostname of the client among others. The **WSF_RESPONSE** provides features to define the response with information such as HTTP status codes (10x,20x, 30x, 40x, and 50x), response headers (Content-Type, Content-Length, etc.) and obviously the body of the message itself. -**SERVICE_TEMPLATE** is the root class of our example, it launches the application, using the corresponding connector, Which connector? this depends how you want to run it cgi, fcgi or nino. For development is recommended to use Nino, a standalone web server written in Eiffel, and run the execution within the EiffelStudio debugger. For production fcgi (or cgi) using Apache or another popular web server. +**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, 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. -The **SERVICE_TEMPLATE** class inherits from _WSF_DEFAULT_SERVICE_ class, and this one also inherits from other interfaces. Let’s describe them in a few words. +The **APPLICATION_EXECUTION** class inherits from _WSF_EXECUTION_ interface, which is instantiated for each incoming request. Let’s describe them in a few words. -![Service Template Hierarchy](/workbook/SERVICE_TEMPLATE.png "Service Template") +![Execution Hierarchy](/workbook/APPLICATION_EXECUTION.png "Application ExecUtion ") **WS_LAUNCHABLE_SERVICE** inherit from **WS_SERVICE** class, which is the low level entry point in EWF, handling each incoming request with a single procedure ```execute (req: WSF_REQUEST; res: WSF_RESPONSE) ...```. And also provides a way to launch our application using different kind of connectors. Below a [BON diagram] (http://www.bon-method.com/index_normal.htm) showing the different kind of connectors. -![Launcher Hierarchy](/app/doc/WSF_SERVICE_LAUNCHER.png "Launcher") +![Launcher Hierarchy](./basic/Launcher Hierarchy.png "Launcher Hierarchy") A basic EWF service inherits from **WSF_DEFAULT_SERVICE** (for other options see [?]). And then you only need to implement the **execute** feature, get data from the request *req* and write the response in *res*. From 6e3a7deb6eebf3858e804b9b0a444762ce30c35e Mon Sep 17 00:00:00 2001 From: Javier Velilla Date: Mon, 29 Jun 2015 16:20:19 -0300 Subject: [PATCH 02/11] Update workbook.md --- doc/workbook/workbook.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/workbook/workbook.md b/doc/workbook/workbook.md index 37b7789b..aa68c191 100644 --- a/doc/workbook/workbook.md +++ b/doc/workbook/workbook.md @@ -19,20 +19,20 @@ Before reading (or walking throught) the workbook, to get a quick overview of EW ## Introduction -[Basic Concepts] (/workbook/basics/basics.md). +[Basic Concepts] (/doc/workbook/basics/basics.md). ## Handling Requests: Form/Query Parameter -[Handling Requests: Form/Query Parameter] (/workbook/handling_request/form.md). +[Handling Requests: Form/Query Parameter] (/doc/workbook/handling_request/form.md). ## Handling Requests: Header Fields -[Handling Requests: Header Fields](/workbook/handling_request/headers.md). +[Handling Requests: Header Fields](/doc/workbook/handling_request/headers.md). ## Generating Response -[Generating Responses](/workbook/generating_response/generating_response.md) +[Generating Responses](/doc/workbook/generating_response/generating_response.md) ## Handling Cookies -[Handling Cookies](/workbook/handling_cookies/handling_cookies.md) +[Handling Cookies](/doc/workbook/handling_cookies/handling_cookies.md) From f2405e0ccd9b46f2e2079b4fb9bb1f3b7911c070 Mon Sep 17 00:00:00 2001 From: Javier Velilla Date: Mon, 29 Jun 2015 16:22:01 -0300 Subject: [PATCH 03/11] Update basics.md --- doc/workbook/basics/basics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/workbook/basics/basics.md b/doc/workbook/basics/basics.md index c26867f2..1dce4d0c 100644 --- a/doc/workbook/basics/basics.md +++ b/doc/workbook/basics/basics.md @@ -92,11 +92,11 @@ The **WSF_RESPONSE** provides features to define the response with information s The **APPLICATION_EXECUTION** class inherits from _WSF_EXECUTION_ interface, which is instantiated for each incoming request. Let’s describe them in a few words. -![Execution Hierarchy](/workbook/APPLICATION_EXECUTION.png "Application ExecUtion ") +![Execution Hierarchy](/doc/workbook/basic/APPLICATION_EXECUTION.png "Application ExecUtion ") **WS_LAUNCHABLE_SERVICE** inherit from **WS_SERVICE** class, which is the low level entry point in EWF, handling each incoming request with a single procedure ```execute (req: WSF_REQUEST; res: WSF_RESPONSE) ...```. And also provides a way to launch our application using different kind of connectors. Below a [BON diagram] (http://www.bon-method.com/index_normal.htm) showing the different kind of connectors. -![Launcher Hierarchy](./basic/Launcher Hierarchy.png "Launcher Hierarchy") +![Launcher Hierarchy](/doc/workbook/basic/Launcher Hierarchy.png "Launcher Hierarchy") A basic EWF service inherits from **WSF_DEFAULT_SERVICE** (for other options see [?]). And then you only need to implement the **execute** feature, get data from the request *req* and write the response in *res*. From 9e06fb2ab8bf75d86f9d275c2e93c48c22408034 Mon Sep 17 00:00:00 2001 From: Javier Velilla Date: Mon, 29 Jun 2015 16:24:09 -0300 Subject: [PATCH 04/11] Update basics.md --- doc/workbook/basics/basics.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/workbook/basics/basics.md b/doc/workbook/basics/basics.md index 1dce4d0c..523381a1 100644 --- a/doc/workbook/basics/basics.md +++ b/doc/workbook/basics/basics.md @@ -1,4 +1,4 @@ -Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query Parameter](/workbook/handling_request/form.md) +Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query Parameter](/doc/workbook/handling_request/form.md) ## EWF basic service @@ -92,11 +92,11 @@ The **WSF_RESPONSE** provides features to define the response with information s The **APPLICATION_EXECUTION** class inherits from _WSF_EXECUTION_ interface, which is instantiated for each incoming request. Let’s describe them in a few words. -![Execution Hierarchy](/doc/workbook/basic/APPLICATION_EXECUTION.png "Application ExecUtion ") +![Execution Hierarchy](/doc/workbook/basics/APPLICATION_EXECUTION.png "Application ExecUtion ") **WS_LAUNCHABLE_SERVICE** inherit from **WS_SERVICE** class, which is the low level entry point in EWF, handling each incoming request with a single procedure ```execute (req: WSF_REQUEST; res: WSF_RESPONSE) ...```. And also provides a way to launch our application using different kind of connectors. Below a [BON diagram] (http://www.bon-method.com/index_normal.htm) showing the different kind of connectors. -![Launcher Hierarchy](/doc/workbook/basic/Launcher Hierarchy.png "Launcher Hierarchy") +![Launcher Hierarchy](/doc/workbook/basics/Launcher Hierarchy.png "Launcher Hierarchy") A basic EWF service inherits from **WSF_DEFAULT_SERVICE** (for other options see [?]). And then you only need to implement the **execute** feature, get data from the request *req* and write the response in *res*. @@ -213,5 +213,5 @@ The example of the service that generates HTML is located in the directory $PATH ```estudio -config simple_html.ecf -target simple_html_nino``` -Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query Parameter](/workbook/handling_request/form.md) +Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query Parameter](/doc/workbook/handling_request/form.md) From 57048373f4cbef2a7dbee497abc1f664889dd0b7 Mon Sep 17 00:00:00 2001 From: jvelilla Date: Mon, 29 Jun 2015 18:30:11 -0300 Subject: [PATCH 05/11] Update basic document --- .../basics/WSF_SERVICE_LAUNCHER_CGI.png | Bin 0 -> 9471 bytes .../basics/WSF_SERVICE_LAUNCHER_FCGI.png | Bin 0 -> 9552 bytes .../basics/WSF_SERVICE_LAUNCHER_NINO.png | Bin 0 -> 9523 bytes .../WSF_SERVICE_LAUNCHER_STANDALONE.png | Bin 0 -> 11031 bytes doc/workbook/basics/basics.md | 32 +++++++++++++----- doc/workbook/basics/simple/simple.ecf | 8 +++++ 6 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 doc/workbook/basics/WSF_SERVICE_LAUNCHER_CGI.png create mode 100644 doc/workbook/basics/WSF_SERVICE_LAUNCHER_FCGI.png create mode 100644 doc/workbook/basics/WSF_SERVICE_LAUNCHER_NINO.png create mode 100644 doc/workbook/basics/WSF_SERVICE_LAUNCHER_STANDALONE.png diff --git a/doc/workbook/basics/WSF_SERVICE_LAUNCHER_CGI.png b/doc/workbook/basics/WSF_SERVICE_LAUNCHER_CGI.png new file mode 100644 index 0000000000000000000000000000000000000000..ba484064766681fff3b3cfb3fda0a16a9d58fa76 GIT binary patch literal 9471 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 AG5`Po literal 0 HcmV?d00001 diff --git a/doc/workbook/basics/WSF_SERVICE_LAUNCHER_FCGI.png b/doc/workbook/basics/WSF_SERVICE_LAUNCHER_FCGI.png new file mode 100644 index 0000000000000000000000000000000000000000..b42d4b96eab5a19e8793c14ae5f032072c8bcc57 GIT binary patch literal 9552 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 E9||hX#sB~S literal 0 HcmV?d00001 diff --git a/doc/workbook/basics/WSF_SERVICE_LAUNCHER_NINO.png b/doc/workbook/basics/WSF_SERVICE_LAUNCHER_NINO.png new file mode 100644 index 0000000000000000000000000000000000000000..ecca100efcd47b3cf630e6f526aa225dfce1052e GIT binary patch literal 9523 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 z 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 ## A simple Service to Generate Plain Text. diff --git a/doc/workbook/basics/simple/simple.ecf b/doc/workbook/basics/simple/simple.ecf index 5f3b30d7..3d9149d0 100644 --- a/doc/workbook/basics/simple/simple.ecf +++ b/doc/workbook/basics/simple/simple.ecf @@ -37,6 +37,14 @@ + + + + + + From 5255b15fa9db5be728b6ce5fca038970b04ede69 Mon Sep 17 00:00:00 2001 From: Javier Velilla Date: Mon, 29 Jun 2015 18:36:44 -0300 Subject: [PATCH 06/11] Update basics.md --- doc/workbook/basics/basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/workbook/basics/basics.md b/doc/workbook/basics/basics.md index 3f2aa197..d4d9b987 100644 --- a/doc/workbook/basics/basics.md +++ b/doc/workbook/basics/basics.md @@ -95,7 +95,7 @@ on fcgi (or cgi) using Apache or another popular web server. **WS_LAUNCHABLE_SERVICE** inherit from **WS_SERVICE** class, which is a marker interface in EWF. And also provides a way to launch our application using different kind of connectors. The class **WSF_DEFAULT_SERVICE_I**, inherit from **WS_LAUNCHABLE_SERVICE** and has a formal generic that should conform to **WSF_SERVICE_LAUNCHER [WSF_EXECUTION]**. Below a [BON diagram] (http://www.bon-method.com/index_normal.htm) showing one of the possible options. -![Nino Launcher](/doc/workbook/basics/WSF_SERVICE_LAUNCHER_NINO.png" Nino Hierarchy") +![Standalone Launcher](/doc/workbook/basics/WSF_SERVICE_LAUNCHER_STANDALONE.png "Standalone Hierarchy") Other connectors: **WSF_STANDALONE_SERVICE_LAUNCHER** From b16e4aa57018cbddf0aa9882a4a6e835f9f22f57 Mon Sep 17 00:00:00 2001 From: jvelilla Date: Mon, 29 Jun 2015 19:03:54 -0300 Subject: [PATCH 07/11] Updated basic documentation --- doc/workbook/basics/basics.md | 59 ++++++------------- .../basics/simple/application_execution.e | 1 - 2 files changed, 17 insertions(+), 43 deletions(-) diff --git a/doc/workbook/basics/basics.md b/doc/workbook/basics/basics.md index 3f2aa197..b6c520ab 100644 --- a/doc/workbook/basics/basics.md +++ b/doc/workbook/basics/basics.md @@ -113,8 +113,6 @@ Im the **APPLICATION_EXECUTION** class class you will need to implement implemen The WSF_EXECUTION instance, in this case ```APPLICATION_EXECUTION``` is created per request, with two main attributes request: ```WSF_REQUEST``` and response: ```WSF_RESPONSE```. - - ## A simple Service to Generate Plain Text. @@ -122,45 +120,34 @@ Before to continue, it is recommended to review the getting started guided. ```eiffel class - APPLICATION + APPLICATION_EXECUTION inherit - WSF_DEFAULT_SERVICE - redefine - initialize - end + WSF_EXECUTION create - make_and_launch - -feature {NONE} -- Initialization - - initialize - -- Initialize current service. - do - set_service_option ("port", 9090) - end + make feature -- Basic operations - execute (req: WSF_REQUEST; res: WSF_RESPONSE) + execute -- Execute the incomming request do -- To send a response we need to setup, the status code and -- the response headers. - res.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/plain"], ["Content-Length", "11"]>>) - res.put_string ("Hello World") + response.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/plain"], ["Content-Length", "11"]>>) + response.put_string ("Hello World") end - end + ``` ##### Source code The source code is available on Github. You can get it by running the command: -```git clone https://github.com/EiffelWebFramework/ewf_examples.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_examples/workbook/basics/simple, where $PATH is where you run ```git clone``` . Just double click on the simple.ecf file and select the simple_nino target or if you prefer the command line, run the command: +The example of simple service that generate plain text response is located in the directory $PATH/ewd/doc/workbook/basics/simple, where $PATH is where you run ```git clone``` . Just double click on the simple.ecf file and select the simple_nino target or if you prefer the command line, run the command: ```estudio -config simple.ecf -target simple_nino``` @@ -173,37 +160,25 @@ To generate HTML, it's needed ```eiffel class - APPLICATION + APPLICATION_EXECUTION inherit - WSF_DEFAULT_SERVICE - redefine - initialize - end + WSF_EXECUTION create - make_and_launch - -feature {NONE} -- Initialization - - initialize - -- Initialize current service. - do - set_service_option ("port", 9090) - end + make feature -- Basic operations - execute (req: WSF_REQUEST; res: WSF_RESPONSE) + execute -- Execute the incomming request do -- To send a response we need to setup, the status code and -- the response headers. - res.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/html"], ["Content-Length", web_page.count.out]>>) - res.put_string (web_page) + response.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/html"], ["Content-Length", web_page.count.out]>>) + response.put_string (web_page) end - web_page: STRING = "[ @@ -221,9 +196,9 @@ end ##### Source code The source code is available on Github. You can get it by running the command: -```git clone https://github.com/EiffelWebFramework/ewf_examples.git``` +```git clone https://github.com/EiffelWebFramework/ewf.git``` -The example of the service that generates HTML is located in the directory $PATH/ewf_examples/workbook/basics/simple_html, where $PATH is where you run ```git clone``` . Just double click on the simple_html.ecf file and select the simple_html_nino target or if you prefer the command line, run the command: +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: ```estudio -config simple_html.ecf -target simple_html_nino``` diff --git a/doc/workbook/basics/simple/application_execution.e b/doc/workbook/basics/simple/application_execution.e index 28b1e2f3..58917ef8 100644 --- a/doc/workbook/basics/simple/application_execution.e +++ b/doc/workbook/basics/simple/application_execution.e @@ -22,5 +22,4 @@ feature -- Basic operations response.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/plain"], ["Content-Length", "11"]>>) response.put_string ("Hello World") end - end From f23aeb64129fbbdd2817d864f028150d154e50a9 Mon Sep 17 00:00:00 2001 From: jvelilla Date: Tue, 30 Jun 2015 08:42:29 -0300 Subject: [PATCH 08/11] Updated Workbook basic documentation. --- doc/workbook/basics/basics.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/workbook/basics/basics.md b/doc/workbook/basics/basics.md index 2547729c..f5706441 100644 --- a/doc/workbook/basics/basics.md +++ b/doc/workbook/basics/basics.md @@ -30,9 +30,9 @@ end ``` The class ```APPLICATION``` inherit from -```WSF_DEFAULT_SERVICE [G ->WSF_EXECUTION create make end]``` it will be responsible to launch the service an set optional options. +```WSF_DEFAULT_SERVICE [G ->WSF_EXECUTION create make end]``` it will be responsible to launch the service and set optional options. -The class ```APPLICATION_EXECUTION``` is an implementation ```WSF_EXECUTION``` interface, which is instantiated for each incoming request. +The class ```APPLICATION_EXECUTION``` is an implementation of ```WSF_EXECUTION``` interface, which is instantiated for each incoming request. ```eiffel class @@ -86,10 +86,10 @@ end ``` The **WSF_REQUEST** gives access to the incoming data; the class provides features to get information such as request method, form data, query parameters, uploaded files, HTTP request headers, and hostname of the client among others. + The **WSF_RESPONSE** provides features to define the response with information such as HTTP status codes (10x,20x, 30x, 40x, and 50x), response headers (Content-Type, Content-Length, etc.) and obviously the body of the message itself. -**APPLICATION** is the root class of our example, it launches the application, using the corresponding connector, Which connector? this depends how you want to run it cgi, fcgi, or 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 producti -on 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 you want to run it cgi, fcgi,nino or standalone. For development is recommended to use a standalone web server written in Eiffel, and run the execution within the EiffelStudio debugger. For production fcgi (or cgi) using Apache or another popular web server. ![Launcher Hierarchy](/doc/workbook/basics/Launcher Hierarchy.png "Launcher Hierarchy") @@ -105,9 +105,9 @@ Other connectors: 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) ...```. -Im 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 implement the **execute** feature, get data from the request *req* and write the response in *res*. ![Execution Hierarchy](/doc/workbook/basics/APPLICATION_EXECUTION.png "Application Execution ") @@ -116,7 +116,7 @@ The WSF_EXECUTION instance, in this case ```APPLICATION_EXECUTION``` is created ## A simple Service to Generate Plain Text. -Before to continue, it is recommended to review the getting started guided. +Before to continue, it is recommended to review the getting started guided. In the example we will only shows the implementation of the WSF_EXECUTION interface. ```eiffel class From 01f649fd8888c3f9c6f84f0adce3da88d936337f Mon Sep 17 00:00:00 2001 From: jvelilla Date: Tue, 30 Jun 2015 08:57:00 -0300 Subject: [PATCH 09/11] Updated: workbook headers document. Removed: unnecessary files. --- doc/workbook/SERVICE_TEMPLATE.png | Bin 13437 -> 0 bytes doc/workbook/basics/reading_request_data.md | 0 doc/workbook/handling_request/headers.md | 59 +++++++------------- 3 files changed, 20 insertions(+), 39 deletions(-) delete mode 100644 doc/workbook/SERVICE_TEMPLATE.png delete mode 100644 doc/workbook/basics/reading_request_data.md diff --git a/doc/workbook/SERVICE_TEMPLATE.png b/doc/workbook/SERVICE_TEMPLATE.png deleted file mode 100644 index f8eecdbd84c70a08892492a5d938f7b5be926eb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13437 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 diff --git a/doc/workbook/basics/reading_request_data.md b/doc/workbook/basics/reading_request_data.md deleted file mode 100644 index e69de29b..00000000 diff --git a/doc/workbook/handling_request/headers.md b/doc/workbook/handling_request/headers.md index b7708689..a49a7440 100644 --- a/doc/workbook/handling_request/headers.md +++ b/doc/workbook/handling_request/headers.md @@ -1,4 +1,4 @@ -Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query parameters] (/workbook/handling_request/form.md) | [Generating Responses](/workbook/generating_response/generating_response.md) +Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query parameters] (/doc/workbook/handling_request/form.md) | [Generating Responses](/doc/workbook/generating_response/generating_response.md) #Handling Requests: Headers @@ -165,35 +165,26 @@ included in the Referer header when the browser requests Web page B. * [User-Agent](https://httpwg.github.io/specs/rfc7231.html#header.user-agent) - The "User-Agent" header field contains information about the user agent of the request, which is often used by servers to help identify the scope of reported interoperability problems, to work around or tailor responses to avoid particular user agent limitations, and for analytics regarding browser or operating system use or device. +**Note**: the example shows the **WSF_EXECUTION** implementation, that will be used by the service launcher. + #### Building a Table of All Request Headers -The following [EWF service](./headers/header_fields/application.e) code simply uses an ```html_template``` to fill a table (names and values) with all the headers fields it receives. +The following [EWF service](/doc/workbook/headers/header_fields/application.e) code simply uses an ```html_template``` to fill a table (names and values) with all the headers fields it receives. + The service accomplishes this task by calling ```req.meta_variables``` feature to get an ```ITERABLE [WSF_STRING]```, an structure that can be iterated over using ```across...loop...end```, then it checks if the name has the prefix ```HTTP_``` and if it is true, put the header name and value in a row. (the name in the left cell, the value in the right cell). The service also writes three components of the main request line (method, URI, and protocol), and also the raw header. ```eiffel class - APPLICATION + APPLICATION_EXECUTION inherit - WSF_DEFAULT_SERVICE - redefine - initialize - end + WSF_EXECUTION create - make_and_launch - -feature {NONE} -- Initialization - - initialize - -- Initialize current service. - do - set_service_option ("port", 9090) - set_service_option ("verbose", true) - end + make feature -- Basic operations @@ -293,32 +284,21 @@ To be completed. #### Detecting Browser Types -The User-Agent header identifies the specific browser/client that is sending the request. The following code shows a [EWF service](./headers/browser_name/application.e) that sends browser-specific responses. +The User-Agent header identifies the specific browser/client that is sending the request. The following code shows a [EWF service](/doc/workbook/headers/browser_name/application.e) that sends browser-specific responses. + The examples uses the ideas based on the [Browser detection using the user agent](https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent) article. Basically the code check if the header user_agent exist and then call the ```browser_name (a_user_agent: READABLE_STRING_8): READABLE_STRING_32``` feature to retrieve the current browser name or Unknown in other case. ```eiffel class - APPLICATION + APPLICATION_EXECUTION inherit - WSF_DEFAULT_SERVICE - redefine - initialize - end + WSF_EXECUTION create - make_and_launch - -feature {NONE} -- Initialization - - initialize - -- Initialize current service. - do - set_service_option ("port", 9090) - set_service_option ("verbose", true) - end + make feature -- Basic operations @@ -329,8 +309,8 @@ feature -- Basic operations l_page_response: STRING l_rows: STRING do - create l_page_response.make_from_string (html_template) - if req.path_info.same_string ("/") then + create l_page_response.make_from_string (html_template) + if req.path_info.same_string ("/") then -- retrieve the user-agent if attached req.http_user_agent as l_user_agent then @@ -404,7 +384,7 @@ end ``` Let see some results, we will show the html returned -Internet Explorer +**Internet Explorer** --- ```

EWF service example: Showing Browser Dectection Using User-Agent


@@ -414,7 +394,7 @@ Internet Explorer

Enjoy using Internet Explorer

``` -Chrome +**Chrome** --- ```

EWF service example: Showing Browser Dectection Using User-Agent


@@ -448,10 +428,11 @@ As an exercise, try to write a similar service to retrieve the OS family using t * [SERVER_PROTOCOL](https://tools.ietf.org/html/rfc3875#section-4.1.15) * [SERVER_SOFTWARE](https://tools.ietf.org/html/rfc3875#section-4.1.16) -An [EWF service](./headers/cgi_variables/application.e) that shows the CGI variables, creates a table showing the values of all the CGI variables. +**Example** +An [EWF service](/doc/workbook/headers/cgi_variables/application.e) that shows the CGI variables, creates a table showing the values of all the CGI variables. -Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query parameters] (/workbook/handling_request/form.md) | [Generating Responses](/workbook/generating_response/generating_response.md) +Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query parameters] (/doc/workbook/handling_request/form.md) | [Generating Responses](/doc/workbook/generating_response/generating_response.md) From efd80c1287738e88b90f811cca0f71bbeb84e3d0 Mon Sep 17 00:00:00 2001 From: jvelilla Date: Tue, 30 Jun 2015 09:00:47 -0300 Subject: [PATCH 10/11] Updated workbook form document --- doc/workbook/handling_request/form.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/doc/workbook/handling_request/form.md b/doc/workbook/handling_request/form.md index 47da6767..c72772b6 100644 --- a/doc/workbook/handling_request/form.md +++ b/doc/workbook/handling_request/form.md @@ -1,4 +1,4 @@ -Nav: [Workbook](../workbook.md) | [Basic Concepts] (/workbook/basics/basics.md) | [Handling Requests: Header Fields](/workbook/handling_request/headers.md) +Nav: [Workbook](../workbook.md) | [Basic Concepts] (/doc/workbook/basics/basics.md) | [Handling Requests: Header Fields](/doc/workbook/handling_request/headers.md) #Handling Requests: Form/Query Data @@ -285,25 +285,23 @@ and a simple message. ``` The source code is available on Github. You can get it by running the command: -```git clone https://github.com/EiffelWebFramework/ewf_examples.git``` +```git clone https://github.com/EiffelWebFramework/ewf.git``` -The example is located in the directory $PATH/ewf_examples/workbook/upload_file where $PATH is where you run git clone. +The example is located in the directory $PATH/ewf/doc/workbook/upload_file where $PATH is where you run git clone. ## Examples The source code is available on Github. You can get it by running the command: -```git clone https://github.com/EiffelWebFramework/ewf_examples.git``` +```git clone https://github.com/EiffelWebFramework/ewf.git``` -The GET example is located in the directory $PATH/ewf_examples/workbook/form/get, and the post example is located in the directory $PATH/ewf_examples/workbook/form/post where $PATH is where you run git clone . To run open it using Eiffel Studio or just run theg following command +The GET example is located in the directory $PATH/ewf/doc/workbook/form/get, and the post example is located in the directory $PATH/ewf_examples/workbook/form/post where $PATH is where you run git clone . To run open it using Eiffel Studio or just run theg following command ```estudio -config .ecf -target ``` >Note: replace and with the corresponding values. - - -Nav: [Workbook](../workbook.md) | [Basic Concepts] (/workbook/basics/basics.md) | [Handling Requests: Header Fields](/workbook/handling_request/headers.md) +Nav: [Workbook](../workbook.md) | [Basic Concepts] (/doc/workbook/basics/basics.md) | [Handling Requests: Header Fields](/doc/workbook/handling_request/headers.md) From 2c745c63d3ad5ac927cab74f88304e46e1041c3c Mon Sep 17 00:00:00 2001 From: jvelilla Date: Tue, 30 Jun 2015 09:21:12 -0300 Subject: [PATCH 11/11] Updated workbook: generating response, handling cookies and headers documents. --- .../generating_response.md | 38 ++++--------------- .../handling_cookies/handling_cookies.md | 22 +++-------- doc/workbook/handling_request/headers.md | 6 +-- 3 files changed, 16 insertions(+), 50 deletions(-) diff --git a/doc/workbook/generating_response/generating_response.md b/doc/workbook/generating_response/generating_response.md index 1c2609b3..4d63cdfd 100644 --- a/doc/workbook/generating_response/generating_response.md +++ b/doc/workbook/generating_response/generating_response.md @@ -1,5 +1,5 @@ -Nav: [Workbook](../workbook.md) | [Handling Requests: Header Fields](/workbook/handling_request/headers.md) | [Handling Cookies](/workbook/handling_cookies/handling_cookies.md) +Nav: [Workbook](../workbook.md) | [Handling Requests: Header Fields](/doc/workbook/handling_request/headers.md) | [Handling Cookies](/doc/workbook/handling_cookies/handling_cookies.md) ## EWF Generating Response @@ -164,24 +164,13 @@ Note: use ```res.set_status_code({HTTP_STATUS_CODE}.bad_request)``` rather than Basic Service that builds a simple web page to show the most common status codes ```eiffel class - APPLICATION + APPLICATION_EXECUTION inherit - WSF_DEFAULT_SERVICE - redefine - initialize - end + WSF_EXECUTION create - make_and_launch - -feature {NONE} -- Initialization - - initialize - -- Initialize current service. - do - set_service_option ("port", 9090) - end + make feature -- Basic operations @@ -321,24 +310,13 @@ note revision : "$Revision$" class - APPLICATION + APPLICATION_EXECUTION inherit - WSF_DEFAULT_SERVICE - redefine - initialize - end + WSF_EXECUTION create - make_and_launch - -feature {NONE} -- Initialization - - initialize - -- Initialize current service. - do - set_service_option ("port", 9090) - end + make feature -- Basic operations @@ -1018,4 +996,4 @@ There are four categories for response header fields: -| [Handling Requests: Header Fields](/workbook/handling_request/headers.md) | [Handling Cookies](/workbook/handling_cookies/handling_cookies.md) +Nav: [Workbook](../workbook.md) | [Handling Requests: Header Fields](/doc/workbook/handling_request/headers.md) | [Handling Cookies](/doc/workbook/handling_cookies/handling_cookies.md) diff --git a/doc/workbook/handling_cookies/handling_cookies.md b/doc/workbook/handling_cookies/handling_cookies.md index cfac299d..f1de9bdc 100644 --- a/doc/workbook/handling_cookies/handling_cookies.md +++ b/doc/workbook/handling_cookies/handling_cookies.md @@ -1,4 +1,4 @@ -Nav: [Workbook](../workbook.md) | [Generating Responses](/workbook/generating_response/generating_response.md) +Nav: [Workbook](../workbook.md) | [Generating Responses](/doc/workbook/generating_response/generating_response.md) # Handling Cookies @@ -146,25 +146,13 @@ note revision : "$Revision$" class - APPLICATION + APPLICATION_EXECUTION inherit - WSF_DEFAULT_SERVICE - redefine - initialize - end + WSF_EXECUTION create - make_and_launch - -feature {NONE} -- Initialization - - initialize - -- Initialize current service. - do - set_service_option ("port", 9090) - set_service_option ("verbose",True) - end + make feature -- Basic operations @@ -297,4 +285,4 @@ end ``` -Nav: [Workbook](../workbook.md) | [Generating Responses](/workbook/generating_response/generating_response.md) +Nav: [Workbook](../workbook.md) | [Generating Responses](/doc/workbook/generating_response/generating_response.md) diff --git a/doc/workbook/handling_request/headers.md b/doc/workbook/handling_request/headers.md index a49a7440..bba056ed 100644 --- a/doc/workbook/handling_request/headers.md +++ b/doc/workbook/handling_request/headers.md @@ -170,7 +170,7 @@ included in the Referer header when the browser requests Web page B. #### Building a Table of All Request Headers -The following [EWF service](/doc/workbook/headers/header_fields/application.e) code simply uses an ```html_template``` to fill a table (names and values) with all the headers fields it receives. +The following [EWF service](/doc/workbook/handling_request/headers/header_fields/application.e) code simply uses an ```html_template``` to fill a table (names and values) with all the headers fields it receives. The service accomplishes this task by calling ```req.meta_variables``` feature to get an ```ITERABLE [WSF_STRING]```, an structure that can be iterated over using ```across...loop...end```, then it checks if the name has the prefix ```HTTP_``` and if it is true, put the header name and value in a row. (the name in the left cell, the value in the right cell). @@ -284,7 +284,7 @@ To be completed. #### Detecting Browser Types -The User-Agent header identifies the specific browser/client that is sending the request. The following code shows a [EWF service](/doc/workbook/headers/browser_name/application.e) that sends browser-specific responses. +The User-Agent header identifies the specific browser/client that is sending the request. The following code shows a [EWF service](/doc/workbook/handling_request/headers/browser_name/application.e) that sends browser-specific responses. The examples uses the ideas based on the [Browser detection using the user agent](https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent) article. Basically the code check if the header user_agent exist and then call the ```browser_name (a_user_agent: READABLE_STRING_8): READABLE_STRING_32``` @@ -429,7 +429,7 @@ As an exercise, try to write a similar service to retrieve the OS family using t * [SERVER_SOFTWARE](https://tools.ietf.org/html/rfc3875#section-4.1.16) **Example** -An [EWF service](/doc/workbook/headers/cgi_variables/application.e) that shows the CGI variables, creates a table showing the values of all the CGI variables. +An [EWF service](/doc/workbook/handling_request/headers/cgi_variables/application.e) that shows the CGI variables, creates a table showing the values of all the CGI variables. Nav: [Workbook](../workbook.md) | [Handling Requests: Form/Query parameters] (/doc/workbook/handling_request/form.md) | [Generating Responses](/doc/workbook/generating_response/generating_response.md)