Compare commits
440 Commits
Review_EWS
...
v0.1.b1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
34c6288032 | ||
|
|
21b03a05fd | ||
|
|
0bd2d16c12 | ||
|
|
e6a727ee42 | ||
|
|
1403cc5c09 | ||
|
|
3bbf356f19 | ||
|
|
b541efcc8f | ||
|
|
082def2b70 | ||
|
|
79607600e6 | ||
|
|
0b6b7f793c | ||
|
|
badc2458c4 | ||
|
|
d4208c59f3 | ||
|
|
4bafa5b3c0 | ||
|
|
c89b19371e | ||
|
|
10ebc12852 | ||
|
|
593e48ec5b | ||
|
|
11b15ec5b7 | ||
|
|
ff713a42ab | ||
|
|
155c45be6c | ||
|
|
09fa1adaab | ||
|
|
425c276051 | ||
|
|
0040e4b0d0 | ||
|
|
b862065c04 | ||
|
|
874677ab7a | ||
|
|
ed200b93dd | ||
|
|
bcccfb22ed | ||
|
|
5c98d7ba4e | ||
|
|
40c6aff423 | ||
|
|
ac9cbb0bd2 | ||
|
|
95c3bbf6e5 | ||
|
|
b955912dc2 | ||
|
|
50223b12f7 | ||
|
|
6c7ba93062 | ||
|
|
743f26c376 | ||
|
|
d256ec3944 | ||
|
|
482f8e41e7 | ||
|
|
9eef812795 | ||
|
|
86fcaa2835 | ||
|
|
897aeb3132 | ||
|
|
48acdea73c | ||
|
|
cbaae12156 | ||
|
|
8344607eb6 | ||
|
|
71d5dc4795 | ||
|
|
3f0b745ecc | ||
|
|
3432e2d8b2 | ||
|
|
fea0f115a0 | ||
|
|
84a12447db | ||
|
|
876f9e02b7 | ||
|
|
e5323dd208 | ||
|
|
77834a3dd8 | ||
|
|
4906345a62 | ||
|
|
487487ad44 | ||
|
|
ef5ba19c46 | ||
|
|
b05ff01262 | ||
|
|
9f1940c46d | ||
|
|
f69ff42564 | ||
|
|
eb3e9f2186 | ||
|
|
03b10bdc14 | ||
|
|
46eb92ac37 | ||
|
|
25218996e0 | ||
|
|
68dbbdea9f | ||
|
|
5abc79b7c3 | ||
|
|
c5fe539acb | ||
|
|
ac3e969b3c | ||
|
|
98f2efbd68 | ||
|
|
7314e92fe6 | ||
|
|
468b2851be | ||
|
|
f1fe5464c6 | ||
|
|
d621987020 | ||
|
|
e541fdcb0c | ||
|
|
5950d768c9 | ||
|
|
413fdaf6cd | ||
|
|
9138ffedfb | ||
|
|
72cc05532c | ||
|
|
145b129b28 | ||
|
|
fbec89f354 | ||
|
|
f59d5cac32 | ||
|
|
4bb8a71c1b | ||
|
|
dd6b74326e | ||
|
|
e52cd6b352 | ||
|
|
537bd8241f | ||
|
|
040c1d1c10 | ||
|
|
f3c779cf6e | ||
|
|
6cf35e90c6 | ||
|
|
497fe03d38 | ||
|
|
ca3a520bb9 | ||
|
|
3c755019aa | ||
|
|
3a9b67c8ad | ||
|
|
e21da4a591 | ||
|
|
69bc4d568c | ||
|
|
cf8d25c4e5 | ||
|
|
2b9ca86501 | ||
|
|
2f43660628 | ||
|
|
d8476edf36 | ||
|
|
67e6b460b3 | ||
|
|
962154fc81 | ||
|
|
645b35590b | ||
|
|
a1354136fa | ||
|
|
945ef79857 | ||
|
|
2c4df29877 | ||
|
|
e6687c7791 | ||
|
|
754d3f670c | ||
|
|
8e420de8ec | ||
|
|
6dc1c0d2b0 | ||
|
|
80d68699b1 | ||
|
|
fcdf4e456e | ||
|
|
c92c2a91b4 | ||
|
|
da9fa4ecc2 | ||
|
|
abdd68863d | ||
|
|
83a8ad3879 | ||
|
|
1b55b09b64 | ||
|
|
4cf3393a13 | ||
|
|
4486df14cc | ||
|
|
60574ee85f | ||
|
|
7a6c51e47e | ||
|
|
d8c420c4b7 | ||
|
|
790aa40591 | ||
|
|
e506397406 | ||
|
|
434f031680 | ||
|
|
e36533bc99 | ||
|
|
d90ecbd5fe | ||
|
|
20281bc922 | ||
|
|
6b3a2d3b43 | ||
|
|
83346c92a7 | ||
|
|
6b50ab8c55 | ||
|
|
c8efa04147 | ||
|
|
37860f43b5 | ||
|
|
65a998cec3 | ||
|
|
7207a021be | ||
|
|
32373addfa | ||
|
|
e16f03b1c2 | ||
|
|
1698a06ea0 | ||
|
|
da3594db50 | ||
|
|
bfa620eee3 | ||
|
|
1423412f31 | ||
|
|
0f51925ec1 | ||
|
|
b6784ee35c | ||
|
|
ab5b43d8ef | ||
|
|
c7366615cf | ||
|
|
b60c41ee1b | ||
|
|
f9dfeb0034 | ||
|
|
5e35bc59a9 | ||
|
|
2ed6d92e53 | ||
|
|
33d3071cad | ||
|
|
35dde23976 | ||
|
|
390c05b056 | ||
|
|
011f8746d6 | ||
|
|
0335226e8b | ||
|
|
68e4ac9a8f | ||
|
|
f6b293d4ae | ||
|
|
89572b4f33 | ||
|
|
52e6944f37 | ||
|
|
bf056154d8 | ||
|
|
a3c50956f1 | ||
|
|
0d67533c83 | ||
|
|
c0c206e9ae | ||
|
|
36601fd3a4 | ||
|
|
9a85c24c0d | ||
|
|
5ef19021eb | ||
|
|
7495d0e6a7 | ||
|
|
f27c1f97a3 | ||
|
|
b96029a750 | ||
|
|
9ef10c749a | ||
|
|
0aa3d81b22 | ||
|
|
5d17b0dd29 | ||
|
|
5e2c2af18a | ||
|
|
de157be6f1 | ||
|
|
f601ae1c8b | ||
|
|
f6f94add80 | ||
|
|
a70e75f729 | ||
|
|
2dd43ad829 | ||
|
|
108396bd91 | ||
|
|
e9b7fc4c93 | ||
|
|
0dd2812574 | ||
|
|
d961544b8b | ||
|
|
3313e9cf81 | ||
|
|
39b5a70979 | ||
|
|
379e806166 | ||
|
|
c1e08a1bdc | ||
|
|
af21520e5d | ||
|
|
effc6ba81d | ||
|
|
019fb539ae | ||
|
|
03938b43c3 | ||
|
|
e70d67aed5 | ||
|
|
de38f46d1d | ||
|
|
8c79a64f0c | ||
|
|
fff7a5c96d | ||
|
|
1b92403045 | ||
|
|
8ae4a30ee8 | ||
|
|
8ffe2a8f73 | ||
|
|
769f2bb5a8 | ||
|
|
483f065ef1 | ||
|
|
8ff055803d | ||
|
|
3b30f4b994 | ||
|
|
f71bbc07e8 | ||
|
|
9b9bc1f190 | ||
|
|
6feaf5757f | ||
|
|
6f4ec89404 | ||
|
|
cdfc6851e7 | ||
|
|
e0ec84611e | ||
|
|
2234d3712b | ||
|
|
c89ccfa768 | ||
|
|
1a88388ffe | ||
|
|
5eab38778a | ||
|
|
9d457bb978 | ||
|
|
42be0b2a4e | ||
|
|
48d4d26cda | ||
|
|
182749d010 | ||
|
|
fd0912904c | ||
|
|
3032b91ff7 | ||
|
|
772b88f257 | ||
|
|
a1cc2d1d1a | ||
|
|
9f90bf56a5 | ||
|
|
dbea0e509b | ||
|
|
a3f28e3945 | ||
|
|
379a6193e9 | ||
|
|
03d9c3785c | ||
|
|
612915c918 | ||
|
|
ff967d6332 | ||
|
|
8d75a04068 | ||
|
|
202ad2861b | ||
|
|
44857d28ec | ||
|
|
e3597c0f3b | ||
|
|
0cce4d8244 | ||
|
|
aab910ab64 | ||
|
|
257ede7586 | ||
|
|
b58e4e19e1 | ||
|
|
6ec37c90a2 | ||
|
|
49c3e8e789 | ||
|
|
cc11debf08 | ||
|
|
b71a22d040 | ||
|
|
7022206a73 | ||
|
|
b715d674ca | ||
|
|
02f5bdd801 | ||
|
|
203d51a97e | ||
|
|
733296e71e | ||
|
|
0a497b9a4d | ||
|
|
4ed91a91a2 | ||
|
|
a76eb75267 | ||
|
|
2c94a98730 | ||
|
|
cc960310e9 | ||
|
|
d9daac67d9 | ||
|
|
955f73dee9 | ||
|
|
137ed3888c | ||
|
|
8382e8f134 | ||
|
|
0b7ea3c427 | ||
|
|
1e7b370859 | ||
|
|
8c02b0d546 | ||
|
|
13b09adc8c | ||
|
|
bc2e8b8ee2 | ||
|
|
36493b4324 | ||
|
|
a09908c048 | ||
|
|
d96ee66a32 | ||
|
|
7669ccfc1d | ||
|
|
3a6e3592ae | ||
|
|
07f9a8cec7 | ||
|
|
16cab53fb4 | ||
|
|
a2bf68e18a | ||
|
|
214255c4b9 | ||
|
|
082b8902ea | ||
|
|
ee9722fa18 | ||
|
|
4a81d02d12 | ||
|
|
0f5ae7e153 | ||
|
|
179dbceaba | ||
|
|
45292e0248 | ||
|
|
a38fca267b | ||
|
|
d4266a83ec | ||
|
|
83a181ebf1 | ||
|
|
54ecd2b1e8 | ||
|
|
da8a216448 | ||
|
|
085b520879 | ||
|
|
c115a40922 | ||
|
|
6f600362e3 | ||
|
|
bd36aa8b04 | ||
|
|
812f521c88 | ||
|
|
beb1bd1599 | ||
|
|
9bbcdc9927 | ||
|
|
0d637d478a | ||
|
|
8e4e7a5084 | ||
|
|
95d44890d9 | ||
|
|
161a5c720b | ||
|
|
35a4cd7df9 | ||
|
|
70ee7ff47a | ||
|
|
c9343688f3 | ||
|
|
f804a705d5 | ||
|
|
926c0a79b7 | ||
|
|
fb7854fbcc | ||
|
|
663a39d2ec | ||
|
|
6fb36da9ac | ||
|
|
3fbd81aeb1 | ||
|
|
6344f964fa | ||
|
|
14a2c01f41 | ||
|
|
79e12b8d04 | ||
|
|
aec0136739 | ||
|
|
9f53287226 | ||
|
|
eaa99c9c61 | ||
|
|
5f492d6fb6 | ||
|
|
c3f5376ef5 | ||
|
|
21e973f8a4 | ||
|
|
dec1958909 | ||
|
|
1453873b6c | ||
|
|
8255dfd996 | ||
|
|
fcdc164214 | ||
|
|
4c36d75ef3 | ||
|
|
09030a27d9 | ||
|
|
b9ca22006b | ||
|
|
593b48fe90 | ||
|
|
735730b5a0 | ||
|
|
035a133b5b | ||
|
|
0144e97d69 | ||
|
|
26bfd72f5f | ||
|
|
88542c2762 | ||
|
|
12fc54a403 | ||
|
|
eb44eef885 | ||
|
|
c2b66d6ca6 | ||
|
|
6758c4aef4 | ||
|
|
6408bec628 | ||
|
|
f77ba9ccd8 | ||
|
|
c105c267e7 | ||
|
|
19da4d6fd0 | ||
|
|
a9e2dc1135 | ||
|
|
142dbc39b4 | ||
|
|
b17887d634 | ||
|
|
f443087e71 | ||
|
|
e5eb11b4e7 | ||
|
|
720d8be08a | ||
|
|
ed04b7fba0 | ||
|
|
4c9e7a4331 | ||
|
|
cc6992a6fc | ||
|
|
71c851ca39 | ||
|
|
900ed8baea | ||
|
|
dba55fcfd9 | ||
|
|
456299ccdf | ||
|
|
810208f176 | ||
|
|
27c637b066 | ||
|
|
a0df04a7f2 | ||
|
|
bc5d20b221 | ||
|
|
7ba3eb9ecd | ||
|
|
2b14a40898 | ||
|
|
aa20a1423f | ||
|
|
34c8cfa427 | ||
|
|
f7dcadccd5 | ||
|
|
f24df1d745 | ||
|
|
5adf40a9ed | ||
|
|
f20bc42b76 | ||
|
|
a4df57a7ac | ||
|
|
df59ae579b | ||
|
|
738eb7555f | ||
|
|
d397d4e35d | ||
|
|
eeaa47d4f1 | ||
|
|
0db4317a49 | ||
|
|
668847f8e8 | ||
|
|
e7fd7af2c5 | ||
|
|
24a5c7613d | ||
|
|
d9f6cbe80e | ||
|
|
95ec2e77df | ||
|
|
19b5edd9b4 | ||
|
|
d25146dd27 | ||
|
|
ab1c696837 | ||
|
|
dae8e1d67d | ||
|
|
888bc61522 | ||
|
|
8291905da1 | ||
|
|
d9ba97d33b | ||
|
|
33eddd9197 | ||
|
|
458cb56f75 | ||
|
|
88c015470e | ||
|
|
f68a713c48 | ||
|
|
0414cd4501 | ||
|
|
284d7826c8 | ||
|
|
dff267cd58 | ||
|
|
c2f7c198e0 | ||
|
|
b3ef7c846b | ||
|
|
111812c4e9 | ||
|
|
92d8357d09 | ||
|
|
64060cfa41 | ||
|
|
d3239ec41b | ||
|
|
7b1557a52a | ||
|
|
c9a4ebcb23 | ||
|
|
3f899f6aae | ||
|
|
18684d167b | ||
|
|
32bb75b9dc | ||
|
|
d06bc76944 | ||
|
|
86825854ca | ||
|
|
774cd004db | ||
|
|
c300cf5b6e | ||
|
|
68247a1849 | ||
|
|
22fd7490fe | ||
|
|
8b6e9273fa | ||
|
|
76fa3e9ff5 | ||
|
|
1e3770d724 | ||
|
|
840ae1e6e4 | ||
|
|
5626e03aa8 | ||
|
|
4bcea900a6 | ||
|
|
b1f5065e63 | ||
|
|
c37fe9ad79 | ||
|
|
2e53f7e0c4 | ||
|
|
512f2d2ce5 | ||
|
|
92105ca7b3 | ||
|
|
f0c6eec23d | ||
|
|
32197d0513 | ||
|
|
11286eeeef | ||
|
|
fb8412fcae | ||
|
|
9ec87a4329 | ||
|
|
0c7e6c08e7 | ||
|
|
c1120a4226 | ||
|
|
5c0cae35ef | ||
|
|
7bd5cdc232 | ||
|
|
ef85c07603 | ||
|
|
10db3c28a5 | ||
|
|
54dc7de189 | ||
|
|
2244d101ea | ||
|
|
244fdf1b02 | ||
|
|
3c9fce293f | ||
|
|
eee085dd5a | ||
|
|
2d9e2d12a0 | ||
|
|
6a581f6d62 | ||
|
|
ed8f5d694f | ||
|
|
c20600f281 | ||
|
|
53ccaa3fde | ||
|
|
22afbd7ed0 | ||
|
|
f6b362217c | ||
|
|
e9ccf855b3 | ||
|
|
4d0148d562 | ||
|
|
ec6cc5f2b8 | ||
|
|
40018d36eb | ||
|
|
8e18329063 | ||
|
|
c372494713 | ||
|
|
10f4a99ee1 | ||
|
|
e9085c614c | ||
|
|
f7d3f519a7 | ||
|
|
4eb22d0272 | ||
|
|
bbcc9ef44b | ||
|
|
801caa4e69 | ||
|
|
1b49445077 | ||
|
|
f005d8bb06 | ||
|
|
a278537f7b | ||
|
|
78b5b6f5fe | ||
|
|
a215c1e4d2 | ||
|
|
fe3726677b | ||
|
|
94d4909644 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,2 +1,4 @@
|
||||
EIFGENs
|
||||
tests/temp/
|
||||
.svn/
|
||||
*.swp
|
||||
|
||||
17
.gitmodules
vendored
17
.gitmodules
vendored
@@ -1,9 +1,12 @@
|
||||
[submodule "doc/wiki"]
|
||||
path = doc/wiki
|
||||
url = https://github.com/Eiffel-World/Eiffel-Web-Framework.wiki.git
|
||||
[submodule "ext/server/nino"]
|
||||
path = ext/server/nino
|
||||
url = http://github.com/Eiffel-World/EiffelWebNino.git
|
||||
[submodule "ext/text/json"]
|
||||
path = ext/text/json
|
||||
url = http://github.com/Eiffel-World/ejson-svn.git
|
||||
url = https://github.com/EiffelWebFramework/EWF.wiki.git
|
||||
[submodule "contrib/library/server/nino"]
|
||||
path = contrib/library/server/nino
|
||||
url = https://github.com/Eiffel-World/EiffelWebNino.git
|
||||
[submodule "contrib/library/text/parser/json"]
|
||||
path = contrib/library/text/parser/json
|
||||
url = https://github.com/Eiffel-World/json.git
|
||||
[submodule "contrib/ise_library/cURL"]
|
||||
path = contrib/ise_library/cURL
|
||||
url = https://github.com/EiffelSoftware/mirror-Eiffel-cURL.git
|
||||
|
||||
38
CHANGELOGS.txt
Normal file
38
CHANGELOGS.txt
Normal file
@@ -0,0 +1,38 @@
|
||||
History for Eiffel-Web-Framework
|
||||
|
||||
[2011-09-23] Jocelyn
|
||||
* library "ewsgi":
|
||||
- NEW simple autotest cases using Nino web server
|
||||
-fixed issue with RAW_POST_DATA being added in form_data_parameters
|
||||
instead of meta_variables ...
|
||||
- Implemented WGI_VALUE for parameter's type (query_parameter,
|
||||
form_data_parameter, item ...)
|
||||
* Nino connector: added feature to shutdown the server from the WGI application
|
||||
* NEW library "http_client": a new library to perform simple http requests
|
||||
such as get, head, post, put, ... (currently implemented with Eiffel cURL)
|
||||
* NEW library "http_authorization": added simple library to support
|
||||
HTTP_AUTHORIZATION. For now only "Basic" auth type is supported ..
|
||||
|
||||
[2011-09-22] Javier
|
||||
* NEW Example: added partial Restbuck example
|
||||
|
||||
[2011-09-21] Jocelyn
|
||||
* Nino connector: fixed an issue with missing value for Content-Type and Content-Length
|
||||
|
||||
[2011-09-13] Jocelyn
|
||||
* library "router": now using a generic design to allow customization of
|
||||
request handler context class.
|
||||
* NEW library "server/request/rest": first attempt to provide a library to
|
||||
help building RESTful application (the interfaces are likely to change
|
||||
soon) EXPERIMENTAL
|
||||
|
||||
[2011-09-09] Jocelyn
|
||||
* library "uri-template": better support for {/vars} and {?vars}
|
||||
|
||||
[2011-09-07] Jocelyn
|
||||
* library "router": now routing depends on uri (or uri template) and request methods
|
||||
* Nino connector: Fixed issue where HTTP_ prefix were missing for header meta variable.
|
||||
|
||||
[2011-09-07] Jocelyn
|
||||
* changelog: starting to write down changelogs file
|
||||
|
||||
88
README.md
88
README.md
@@ -1,30 +1,80 @@
|
||||
# Eiffel Web Framework
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
Official project site for Eiffel Web Framework:
|
||||
* https://github.com/Eiffel-World/Eiffel-Web-Framework
|
||||
|
||||
* http://eiffelwebframework.github.com/EWF/
|
||||
|
||||
For more information please have a look at the related wiki:
|
||||
* https://github.com/Eiffel-World/Eiffel-Web-Framework/wiki
|
||||
|
||||
How to get the source code?
|
||||
---------------------------
|
||||
* https://github.com/EiffelWebFramework/EWF/wiki
|
||||
|
||||
git clone https://github.com/Eiffel-World/Eiffel-Web-Framework.git
|
||||
cd Eiffel-Web-Framework
|
||||
git submodule update --init
|
||||
git submodule foreach git pull origin master
|
||||
git submodule foreach git checkout master
|
||||
## Requirements
|
||||
|
||||
Overview
|
||||
--------
|
||||
* Developped using EiffelStudio 7.0 (on Windows, Linux)
|
||||
* Tested using EiffelStudio 7.0 with "jenkins" CI server (and v6.8 for time to time)
|
||||
* The code have to allow __void-safe__ compilation and non void-safe system (see [more about void-safety](http://docs.eiffel.com/book/method/void-safe-programming-eiffel) )
|
||||
|
||||
* library/server/ewsgi: Eiffel Web Server Gateway Interface
|
||||
* library/server/ewsgi/connectors: various web server connectors for EWSGI
|
||||
* library/server/libfcgi: Wrapper for libfcgi SDK
|
||||
## How to get the source code?
|
||||
|
||||
* library/protocol/http: HTTP related classes, constants for status code, content types, ...
|
||||
* library/protocol/uri_template: URI Template library (parsing and expander)
|
||||
Using git version >= 1.6.5
|
||||
* git clone --recursive https://github.com/EiffelWebFramework/EWF.git
|
||||
|
||||
Otherwise, try
|
||||
* git clone https://github.com/EiffelWebFramework/EWF.git
|
||||
* cd Eiffel-Web-Framework
|
||||
* git submodule update --init
|
||||
* git submodule foreach --recursive git checkout master
|
||||
|
||||
An alternative to the last 2 instructions is to use the script from tools folder:
|
||||
* cd tools
|
||||
* update_git_working_copy
|
||||
|
||||
* And to build the required and related Clibs
|
||||
* cd contrib/ise_library/cURL
|
||||
* geant compile
|
||||
|
||||
## Libraries under 'library'
|
||||
|
||||
### server
|
||||
* __ewsgi__: Eiffel Web Server Gateway Interface [read more](library/server/ewsgi)
|
||||
* connectors: various web server connectors for EWSGI
|
||||
* libfcgi: Wrapper for libfcgi SDK
|
||||
* __wsf__: Web Server Framework [read more](library/server/wsf)
|
||||
* __router__: URL dispatching/routing based on uri, uri_template, or custom [read more](library/server/wsf/router)
|
||||
|
||||
### protocol
|
||||
* __http__: HTTP related classes, constants for status code, content types, ... [read more](library/protocol/http)
|
||||
* __uri_template__: URI Template library (parsing and expander) [read more](library/protocol/uri_template)
|
||||
* __CONNEG__: CONNEG library (Content-type Negociation) [read more](library/protocol/CONNEG)
|
||||
|
||||
### client
|
||||
* __http_client__: simple HTTP client based on cURL [read more](library/client/http_client)
|
||||
|
||||
### text
|
||||
* __encoder__: Various simpler encoders: base64, url-encoder, xml entities, html entities [read more](library/text/encoder)
|
||||
|
||||
### crypto
|
||||
* eel
|
||||
* eapml
|
||||
|
||||
### Others
|
||||
* error: very simple/basic library to handle error
|
||||
|
||||
## External libraries under 'contrib'
|
||||
* [Eiffel Web Nino](contrib/library/server/nino)
|
||||
* ..
|
||||
|
||||
## Draft folder = call for contribution ##
|
||||
### library/server/request ###
|
||||
* request
|
||||
* rest: (experimental) "a" RESTful library to help building RESTful services
|
||||
|
||||
## Examples
|
||||
..
|
||||
|
||||
* library/error: very simple/basic library to handle error
|
||||
* library/text/encoder: Various simpler encoder: base64, url-encoder, xml entities, html entities
|
||||
|
||||
For more information please have a look at the related wiki:
|
||||
* https://github.com/Eiffel-World/Eiffel-Web-Framework/wiki
|
||||
* https://github.com/EiffelWebFramework/EWF/wiki
|
||||
|
||||
1
contrib/ise_library/cURL
Submodule
1
contrib/ise_library/cURL
Submodule
Submodule contrib/ise_library/cURL added at ad2a498fc0
93
contrib/ise_library/cURL-safe.ecf
Normal file
93
contrib/ise_library/cURL-safe.ecf
Normal file
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-5-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-5-0 http://www.eiffel.com/developers/xml/configuration-1-5-0.xsd" name="curl" uuid="D51EF190-6157-4B47-8E73-FA93DCBB7A71" library_target="curl">
|
||||
<target name="curl">
|
||||
<description>cURL: libcURL wrapper library for Eiffel.
|
||||
Copyright (c) 1984-2006, Eiffel Software and others.
|
||||
Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt).</description>
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/\.svn$</exclude>
|
||||
<exclude>/EIFGEN.{0,1}$</exclude>
|
||||
<exclude>/temp$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" cat_call_detection="false" is_attached_by_default="true" void_safety="all" namespace="EiffelSoftware.Library">
|
||||
</option>
|
||||
<setting name="dotnet_naming_convention" value="true"/>
|
||||
<external_include location="$(ECF_CONFIG_PATH)\curl\spec\include">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
</condition>
|
||||
</external_include>
|
||||
<external_include location="$(ECF_CONFIG_PATH)/curl/spec/include">
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
</condition>
|
||||
</external_include>
|
||||
<external_object location="$(ECF_CONFIG_PATH)/curl/spec/$(ISE_PLATFORM)/lib/eiffel_curl.o">
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
<multithreaded value="false"/>
|
||||
</condition>
|
||||
</external_object>
|
||||
<external_object location="$(ECF_CONFIG_PATH)/curl/spec/$(ISE_PLATFORM)/lib/MTeiffel_curl.o">
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
<multithreaded value="true"/>
|
||||
</condition>
|
||||
</external_object>
|
||||
<external_object location="$(ECF_CONFIG_PATH)\curl\spec\$(ISE_C_COMPILER)\$(ISE_PLATFORM)\lib\eiffel_curl.lib">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
<multithreaded value="false"/>
|
||||
<dotnet value="false"/>
|
||||
</condition>
|
||||
</external_object>
|
||||
<external_object location="$(ECF_CONFIG_PATH)\curl\spec\$(ISE_C_COMPILER)\$(ISE_PLATFORM)\lib\mteiffel_curl.lib">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
<multithreaded value="true"/>
|
||||
<dotnet value="false"/>
|
||||
</condition>
|
||||
</external_object>
|
||||
<external_object location="$(ECF_CONFIG_PATH)\spec\$(ISE_C_COMPILER)\$(ISE_PLATFORM)\lib\ileiffel_curl.lib">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
<dotnet value="true"/>
|
||||
</condition>
|
||||
</external_object>
|
||||
<library name="api_wrapper" location="$ISE_LIBRARY\library\api_wrapper\api_wrapper-safe.ecf"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<cluster name="curl" location=".\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/spec$</exclude>
|
||||
<exclude>/Clib$</exclude>
|
||||
</file_rule>
|
||||
<file_rule>
|
||||
<exclude>/gtk$</exclude>
|
||||
<exclude>/mac$</exclude>
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
</condition>
|
||||
</file_rule>
|
||||
<file_rule>
|
||||
<exclude>/mswin$</exclude>
|
||||
<exclude>/gtk$</exclude>
|
||||
<condition>
|
||||
<platform value="macintosh"/>
|
||||
<custom name="vision_implementation" value="cocoa"/>
|
||||
</condition>
|
||||
</file_rule>
|
||||
<file_rule>
|
||||
<exclude>/mswin$</exclude>
|
||||
<exclude>/mac$</exclude>
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
<custom name="vision_implementation" excluded_value="cocoa"/>
|
||||
</condition>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
</target>
|
||||
<target name="curl_dotnet" extends="curl">
|
||||
<setting name="msil_generation" value="true"/>
|
||||
</target>
|
||||
</system>
|
||||
93
contrib/ise_library/cURL.ecf
Normal file
93
contrib/ise_library/cURL.ecf
Normal file
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-5-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-5-0 http://www.eiffel.com/developers/xml/configuration-1-5-0.xsd" name="curl" uuid="D51EF190-6157-4B47-8E73-FA93DCBB7A71" library_target="curl">
|
||||
<target name="curl">
|
||||
<description>cURL: libcURL wrapper library for Eiffel.
|
||||
Copyright (c) 1984-2006, Eiffel Software and others.
|
||||
Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt).</description>
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/\.svn$</exclude>
|
||||
<exclude>/EIFGEN.{0,1}$</exclude>
|
||||
<exclude>/temp$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" namespace="EiffelSoftware.Library">
|
||||
</option>
|
||||
<setting name="dotnet_naming_convention" value="true"/>
|
||||
<external_include location="$(ECF_CONFIG_PATH}\curl\spec\include">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
</condition>
|
||||
</external_include>
|
||||
<external_include location="$(ECF_CONFIG_PATH}/curl/spec/include">
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
</condition>
|
||||
</external_include>
|
||||
<external_object location="$(ECF_CONFIG_PATH}/curl/spec/$(ISE_PLATFORM)/lib/eiffel_curl.o">
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
<multithreaded value="false"/>
|
||||
</condition>
|
||||
</external_object>
|
||||
<external_object location="$(ECF_CONFIG_PATH}/curl/spec/$(ISE_PLATFORM)/lib/MTeiffel_curl.o">
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
<multithreaded value="true"/>
|
||||
</condition>
|
||||
</external_object>
|
||||
<external_object location="$(ECF_CONFIG_PATH}\curl\spec\$(ISE_C_COMPILER)\$(ISE_PLATFORM)\lib\eiffel_curl.lib">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
<multithreaded value="false"/>
|
||||
<dotnet value="false"/>
|
||||
</condition>
|
||||
</external_object>
|
||||
<external_object location="$(ECF_CONFIG_PATH}\curl\spec\$(ISE_C_COMPILER)\$(ISE_PLATFORM)\lib\mteiffel_curl.lib">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
<multithreaded value="true"/>
|
||||
<dotnet value="false"/>
|
||||
</condition>
|
||||
</external_object>
|
||||
<external_object location="$(ECF_CONFIG_PATH}\curl\spec\$(ISE_C_COMPILER)\$(ISE_PLATFORM)\lib\ileiffel_curl.lib">
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
<dotnet value="true"/>
|
||||
</condition>
|
||||
</external_object>
|
||||
<library name="api_wrapper" location="$ISE_LIBRARY\library\api_wrapper\api_wrapper.ecf"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
|
||||
<cluster name="curl" location=".\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/spec$</exclude>
|
||||
<exclude>/Clib$</exclude>
|
||||
</file_rule>
|
||||
<file_rule>
|
||||
<exclude>/gtk$</exclude>
|
||||
<exclude>/mac$</exclude>
|
||||
<condition>
|
||||
<platform value="windows"/>
|
||||
</condition>
|
||||
</file_rule>
|
||||
<file_rule>
|
||||
<exclude>/mswin$</exclude>
|
||||
<exclude>/gtk$</exclude>
|
||||
<condition>
|
||||
<platform value="macintosh"/>
|
||||
<custom name="vision_implementation" value="cocoa"/>
|
||||
</condition>
|
||||
</file_rule>
|
||||
<file_rule>
|
||||
<exclude>/mswin$</exclude>
|
||||
<exclude>/mac$</exclude>
|
||||
<condition>
|
||||
<platform excluded_value="windows"/>
|
||||
<custom name="vision_implementation" excluded_value="cocoa"/>
|
||||
</condition>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
</target>
|
||||
<target name="curl_dotnet" extends="curl">
|
||||
<setting name="msil_generation" value="true"/>
|
||||
</target>
|
||||
</system>
|
||||
1
contrib/library/server/nino
Submodule
1
contrib/library/server/nino
Submodule
Submodule contrib/library/server/nino added at e85213689e
1
contrib/library/text/parser/json
Submodule
1
contrib/library/text/parser/json
Submodule
Submodule contrib/library/text/parser/json added at c873d62efa
BIN
doc/http-activity-diagram.png
Normal file
BIN
doc/http-activity-diagram.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
BIN
doc/http-headers-status-v3.png
Normal file
BIN
doc/http-headers-status-v3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 403 KiB |
2
doc/wiki
2
doc/wiki
Submodule doc/wiki updated: c7f4f45f5e...51b912c4f8
25
draft/README.md
Normal file
25
draft/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
This "draft" folder contains potential addition to EWF
|
||||
|
||||
Anyone wanting to contribute is welcome to the listed libraries, or by suggesting/contributing with extra libraries
|
||||
|
||||
## Current suggestions ##
|
||||
|
||||
### protocol ###
|
||||
* web syndication [__Atom__](library/protocol/syndication/atom)
|
||||
* web syndication [__RSS__](library/protocol/syndication/rss)
|
||||
* [__Twitter__](library/protocol/twitter)
|
||||
* [__XMPP__](library/protocol/xmpp) (also known as Jabber)
|
||||
|
||||
### Security ###
|
||||
* [__OAuth__](library/security/oauth)
|
||||
* [__OpenID__](library/security/openid)
|
||||
|
||||
### Text ###
|
||||
* [__Filters__](library/text/filter) : Wiki markup, Markdown, ...
|
||||
* [__Templates__](library/text/template) : Web template engine ...
|
||||
|
||||
|
||||
### ... ###
|
||||
|
||||
Any contribution is welcome, help us make Eiffel Web Framework bigger, richer and better.
|
||||
|
||||
9
draft/library/protocol/syndication/README.md
Normal file
9
draft/library/protocol/syndication/README.md
Normal file
@@ -0,0 +1,9 @@
|
||||
Web Syndication
|
||||
|
||||
http://en.wikipedia.org/wiki/Web_syndication
|
||||
|
||||
* [Atom Pub](atom)
|
||||
* [RSS](rss)
|
||||
* ...
|
||||
|
||||
Anyone wanting to contribute is welcome
|
||||
10
draft/library/protocol/syndication/atom/README.md
Normal file
10
draft/library/protocol/syndication/atom/README.md
Normal file
@@ -0,0 +1,10 @@
|
||||
Atom protocol
|
||||
|
||||
http://en.wikipedia.org/wiki/Atom_(standard)
|
||||
|
||||
Atom standard
|
||||
* [RFC 4287](http://tools.ietf.org/html/rfc4287) – "The Atom Syndication Format"
|
||||
* [RFC 5023](http://tools.ietf.org/html/rfc5023) – "The Atom Publishing Protocol"
|
||||
|
||||
|
||||
Anyone wanting to contribute is welcome
|
||||
15
draft/library/protocol/syndication/atom/atom-safe.ecf
Normal file
15
draft/library/protocol/syndication/atom/atom-safe.ecf
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="atom" uuid="076DEABB-20DA-43E9-A4C7-F3FAEDF5B1FC" library_target="atom">
|
||||
<target name="atom">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all" syntax="standard">
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY/library/base/base-safe.ecf"/>
|
||||
<cluster name="src" location="./src" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
15
draft/library/protocol/syndication/atom/atom.ecf
Normal file
15
draft/library/protocol/syndication/atom/atom.ecf
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="atom" uuid="076DEABB-20DA-43E9-A4C7-F3FAEDF5B1FC" library_target="atom">
|
||||
<target name="atom">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" void_safety="none" syntax="standard">
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY/library/base/base.ecf"/>
|
||||
<cluster name="src" location="./src" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
22
draft/library/protocol/syndication/atom/src/atom.e
Normal file
22
draft/library/protocol/syndication/atom/src/atom.e
Normal file
@@ -0,0 +1,22 @@
|
||||
note
|
||||
description: "[
|
||||
Main interface for ATOM interface
|
||||
]"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
ATOM
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
-- Instantiate Current object
|
||||
do
|
||||
check not_yet_implemented: False end
|
||||
end
|
||||
|
||||
end
|
||||
7
draft/library/protocol/syndication/rss/README.md
Normal file
7
draft/library/protocol/syndication/rss/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
RSS protocol
|
||||
|
||||
http://en.wikipedia.org/wiki/RSS
|
||||
|
||||
* [RSS specification](http://www.rssboard.org/rss-specification)
|
||||
|
||||
Anyone wanting to contribute is welcome
|
||||
15
draft/library/protocol/syndication/rss/rss-safe.ecf
Normal file
15
draft/library/protocol/syndication/rss/rss-safe.ecf
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="rss" uuid="8D8E3E5A-2685-40AF-9EF9-E3113B3C62AA" library_target="rss">
|
||||
<target name="rss">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all" syntax="standard">
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY/library/base/base-safe.ecf"/>
|
||||
<cluster name="src" location="./src" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
15
draft/library/protocol/syndication/rss/rss.ecf
Normal file
15
draft/library/protocol/syndication/rss/rss.ecf
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="rss" uuid="8D8E3E5A-2685-40AF-9EF9-E3113B3C62AA" library_target="rss">
|
||||
<target name="rss">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" void_safety="none" syntax="standard">
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY/library/base/base.ecf"/>
|
||||
<cluster name="src" location="./src" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
22
draft/library/protocol/syndication/rss/src/rss.e
Normal file
22
draft/library/protocol/syndication/rss/src/rss.e
Normal file
@@ -0,0 +1,22 @@
|
||||
note
|
||||
description: "[
|
||||
Main interface for RSS interface
|
||||
]"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
RSS
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
-- Instantiate Current object
|
||||
do
|
||||
check not_yet_implemented: False end
|
||||
end
|
||||
|
||||
end
|
||||
6
draft/library/protocol/twitter/README.md
Normal file
6
draft/library/protocol/twitter/README.md
Normal file
@@ -0,0 +1,6 @@
|
||||
Twitter protocol
|
||||
|
||||
http://en.wikipedia.org/wiki/Twitter
|
||||
|
||||
Eventually move http://bricabrac.origo.ethz.ch/wiki/Eiffel_Twitter here
|
||||
Anyone wanting to contribute is welcome
|
||||
6
draft/library/protocol/xmpp/README.md
Normal file
6
draft/library/protocol/xmpp/README.md
Normal file
@@ -0,0 +1,6 @@
|
||||
XMPP/Jabber protocol
|
||||
|
||||
http://en.wikipedia.org/wiki/Xmpp
|
||||
|
||||
Eventually move http://bricabrac.origo.ethz.ch/wiki/Eiffel_XMPP here
|
||||
Anyone wanting to contribute is welcome
|
||||
7
draft/library/security/oauth/README.md
Normal file
7
draft/library/security/oauth/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
OAuth
|
||||
|
||||
http://en.wikipedia.org/wiki/Oauth
|
||||
|
||||
* [RFC5849](http://tools.ietf.org/html/rfc5849)
|
||||
|
||||
Anyone wanting to contribute is welcome
|
||||
15
draft/library/security/oauth/oauth-safe.ecf
Normal file
15
draft/library/security/oauth/oauth-safe.ecf
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="oauth" uuid="F8B4DF74-C71B-45A3-9B9A-F6141C4D3C56" library_target="oauth">
|
||||
<target name="oauth">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all" syntax="standard">
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY/library/base/base-safe.ecf"/>
|
||||
<cluster name="src" location="./src" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
15
draft/library/security/oauth/oauth.ecf
Normal file
15
draft/library/security/oauth/oauth.ecf
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="oauth" uuid="F8B4DF74-C71B-45A3-9B9A-F6141C4D3C56" library_target="oauth">
|
||||
<target name="oauth">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" void_safety="none" syntax="standard">
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY/library/base/base.ecf"/>
|
||||
<cluster name="src" location="./src" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
22
draft/library/security/oauth/src/oauth.e
Normal file
22
draft/library/security/oauth/src/oauth.e
Normal file
@@ -0,0 +1,22 @@
|
||||
note
|
||||
description: "[
|
||||
Main interface for OAUTH interface
|
||||
]"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
OAUTH
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
-- Instantiate Current object
|
||||
do
|
||||
check not_yet_implemented: False end
|
||||
end
|
||||
|
||||
end
|
||||
5
draft/library/security/openid/README.md
Normal file
5
draft/library/security/openid/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
OpenID
|
||||
|
||||
http://en.wikipedia.org/wiki/Openid
|
||||
|
||||
Anyone wanting to contribute is welcome
|
||||
15
draft/library/security/openid/openid-safe.ecf
Normal file
15
draft/library/security/openid/openid-safe.ecf
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="openid" uuid="E6B80EAB-AC99-46F5-9896-4892D3477A9A" library_target="openid">
|
||||
<target name="openid">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all" syntax="standard">
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY/library/base/base-safe.ecf"/>
|
||||
<cluster name="src" location="./src" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
15
draft/library/security/openid/openid.ecf
Normal file
15
draft/library/security/openid/openid.ecf
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="openid" uuid="E6B80EAB-AC99-46F5-9896-4892D3477A9A" library_target="openid">
|
||||
<target name="openid">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" void_safety="none" syntax="standard">
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY/library/base/base.ecf"/>
|
||||
<cluster name="src" location="./src" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
22
draft/library/security/openid/src/openid.e
Normal file
22
draft/library/security/openid/src/openid.e
Normal file
@@ -0,0 +1,22 @@
|
||||
note
|
||||
description: "[
|
||||
Main interface for OPENID interface
|
||||
]"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
OPENID
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
-- Instantiate Current object
|
||||
do
|
||||
check not_yet_implemented: False end
|
||||
end
|
||||
|
||||
end
|
||||
1
draft/library/server/request/rest/license.lic
Normal file
1
draft/library/server/request/rest/license.lic
Normal file
@@ -0,0 +1 @@
|
||||
reference:forum2
|
||||
29
draft/library/server/request/rest/rest-safe.ecf
Normal file
29
draft/library/server/request/rest/rest-safe.ecf
Normal file
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="rest" uuid="97FA9457-7820-4A21-8A13-C8D0E9CCEC62" library_target="rest">
|
||||
<target name="rest">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/\.git$</exclude>
|
||||
<exclude>/\.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all">
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="wsf" location="..\..\..\..\..\library\server\wsf\wsf-safe.ecf" readonly="false"/>
|
||||
<library name="wsf_extension" location="..\..\..\..\..\library\server\wsf_extension\wsf_extension-safe.ecf" readonly="false"/>
|
||||
<library name="http" location="..\..\..\..\..\library\protocol\http\http-safe.ecf"/>
|
||||
<library name="uri_template" location="..\..\..\..\..\library\protocol\uri_template\uri_template-safe.ecf"/>
|
||||
<cluster name="contrib" location=".\src\contrib\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/html$</exclude>
|
||||
</file_rule>
|
||||
<cluster name="html" location="$|doc\html\" recursive="true" hidden="true"/>
|
||||
</cluster>
|
||||
<cluster name="src" location=".\src\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/contrib$</exclude>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
</target>
|
||||
</system>
|
||||
28
draft/library/server/request/rest/rest.ecf
Normal file
28
draft/library/server/request/rest/rest.ecf
Normal file
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="rest" uuid="97FA9457-7820-4A21-8A13-C8D0E9CCEC62" library_target="rest">
|
||||
<target name="rest">
|
||||
<root all_classes="true"/>
|
||||
<file_rule>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/\.git$</exclude>
|
||||
<exclude>/\.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
|
||||
<library name="wsf" location="..\..\..\..\..\library\server\wsf\wsf.ecf"/>
|
||||
<library name="wsf_extension" location="..\..\..\..\..\library\server\wsf_extension\wsf_extension.ecf" readonly="false"/>
|
||||
<library name="http" location="..\..\..\..\..\library\protocol\http\http.ecf"/>
|
||||
<library name="uri_template" location="..\..\..\..\..\library\protocol\uri_template\uri_template.ecf"/>
|
||||
<cluster name="contrib" location=".\src\contrib\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/html$</exclude>
|
||||
</file_rule>
|
||||
<cluster name="html" location="$|doc\html\" recursive="true" hidden="true"/>
|
||||
</cluster>
|
||||
<cluster name="src" location=".\src\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/contrib$</exclude>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
</target>
|
||||
</system>
|
||||
@@ -0,0 +1,184 @@
|
||||
note
|
||||
description: "Summary description for {HTML_PAGE}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HTML_PAGE
|
||||
|
||||
inherit
|
||||
HTML_UTILITIES
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_title: like title)
|
||||
do
|
||||
create {ARRAYED_LIST [like html_attributes.item]} html_attributes.make (0)
|
||||
create head.make (a_title)
|
||||
create {ARRAYED_LIST [like body_attributes.item]} body_attributes.make (0)
|
||||
create body.make_empty
|
||||
initialize
|
||||
end
|
||||
|
||||
initialize
|
||||
-- Initialize
|
||||
do
|
||||
create headers.make
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
headers: HTTP_HEADER
|
||||
|
||||
feature -- Recycle
|
||||
|
||||
recycle
|
||||
do
|
||||
html_attributes.wipe_out
|
||||
headers.recycle
|
||||
head.recycle
|
||||
body_attributes.wipe_out
|
||||
body.wipe_out
|
||||
internal_header_string := Void
|
||||
internal_message_string := Void
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
html_attributes: LIST [TUPLE [name: STRING; value: STRING]]
|
||||
|
||||
head: HTML_PAGE_HEAD
|
||||
|
||||
body_attributes: LIST [TUPLE [name: STRING; value: STRING]]
|
||||
|
||||
body: STRING
|
||||
|
||||
feature -- Query
|
||||
|
||||
title: detachable STRING
|
||||
do
|
||||
Result := head.title
|
||||
end
|
||||
|
||||
add_html_ttribute (a: like html_attributes.item)
|
||||
do
|
||||
html_attributes.force (a)
|
||||
end
|
||||
|
||||
add_body_attribute (a: like body_attributes.item)
|
||||
do
|
||||
body_attributes.force (a)
|
||||
end
|
||||
|
||||
set_body (s: like body)
|
||||
-- Set `body' to `s'
|
||||
do
|
||||
body := s
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_title (t: like title)
|
||||
do
|
||||
head.title := t
|
||||
end
|
||||
|
||||
feature -- Output
|
||||
|
||||
compute
|
||||
-- Compute the string output
|
||||
local
|
||||
s, t: STRING
|
||||
do
|
||||
--| HTML beginning
|
||||
create s.make (128)
|
||||
s.append_string ("<html")
|
||||
s.append_string (attributes_to_string (html_attributes))
|
||||
s.append_string (">%N")
|
||||
|
||||
--| Head
|
||||
head.compute --| Be sure to have a fresh string
|
||||
t := head.string
|
||||
if not t.is_empty then
|
||||
s.append_string (t)
|
||||
s.append_character ('%N')
|
||||
end
|
||||
|
||||
--| Body
|
||||
s.append_string ("<body")
|
||||
s.append_string (attributes_to_string (body_attributes))
|
||||
s.append_string (">%N")
|
||||
s.append_string (body)
|
||||
s.append_string ("</body>")
|
||||
|
||||
--| End
|
||||
s.append_string ("</html>")
|
||||
|
||||
--| Http headers
|
||||
headers.put_content_length (s.count)
|
||||
internal_header_string := headers.string
|
||||
internal_message_string := s
|
||||
end
|
||||
|
||||
header_string: STRING
|
||||
local
|
||||
o: like internal_header_string
|
||||
do
|
||||
o := internal_header_string
|
||||
if o = Void then
|
||||
compute
|
||||
o := internal_header_string
|
||||
if o = Void then
|
||||
check output_computed: False end
|
||||
create o.make_empty
|
||||
end
|
||||
end
|
||||
Result := o
|
||||
end
|
||||
|
||||
message_string: STRING
|
||||
local
|
||||
o: like internal_message_string
|
||||
do
|
||||
o := internal_message_string
|
||||
if o = Void then
|
||||
compute
|
||||
o := internal_message_string
|
||||
if o = Void then
|
||||
check output_computed: False end
|
||||
create o.make_empty
|
||||
end
|
||||
end
|
||||
Result := o
|
||||
end
|
||||
|
||||
send (buf: WSF_RESPONSE)
|
||||
do
|
||||
buf.set_status_code (200)
|
||||
buf.put_header_text (header_string)
|
||||
buf.put_string (message_string)
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation: output
|
||||
|
||||
internal_header_string: detachable like header_string
|
||||
|
||||
internal_message_string: detachable like message_string
|
||||
|
||||
invariant
|
||||
header_attached: headers /= Void
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,111 @@
|
||||
note
|
||||
description: "Summary description for {HTML_PAGE_HEAD}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HTML_PAGE_HEAD
|
||||
|
||||
inherit
|
||||
HTML_UTILITIES
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_title: like title)
|
||||
do
|
||||
initialize
|
||||
title := a_title
|
||||
end
|
||||
|
||||
initialize
|
||||
do
|
||||
create text.make_empty
|
||||
create {ARRAYED_LIST [like attributes.item]} attributes.make (0)
|
||||
end
|
||||
|
||||
feature -- Recycle
|
||||
|
||||
recycle
|
||||
do
|
||||
attributes.wipe_out
|
||||
title := Void
|
||||
text.wipe_out
|
||||
internal_string := Void
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
attributes: LIST [TUPLE [name: STRING; value: STRING]]
|
||||
|
||||
title: detachable STRING assign set_title
|
||||
|
||||
text: STRING
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_title (t: like title)
|
||||
do
|
||||
title := t
|
||||
end
|
||||
|
||||
feature -- Output
|
||||
|
||||
compute
|
||||
-- Compute the string output
|
||||
local
|
||||
s: STRING
|
||||
do
|
||||
create s.make_empty
|
||||
if attached title as t then
|
||||
s.append_string ("<title>" + t + "</title>%N")
|
||||
end
|
||||
if text.count > 0 then
|
||||
s.append_string (text)
|
||||
s.append_character ('%N')
|
||||
end
|
||||
if s.count > 0 then
|
||||
internal_string := "<head" + attributes_to_string (attributes) + ">%N" + s + "</head>"
|
||||
else
|
||||
internal_string := s
|
||||
end
|
||||
end
|
||||
|
||||
string: STRING
|
||||
--
|
||||
local
|
||||
o: like internal_string
|
||||
do
|
||||
o := internal_string
|
||||
if o = Void then
|
||||
compute
|
||||
o := internal_string
|
||||
if o = Void then
|
||||
check output_computed: False end
|
||||
create o.make_empty
|
||||
end
|
||||
end
|
||||
Result := o
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation: output
|
||||
|
||||
internal_string: detachable like string
|
||||
|
||||
invariant
|
||||
text_attached: text /= Void
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,90 @@
|
||||
note
|
||||
description: "Summary description for {HTML_UTILITIES}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HTML_UTILITIES
|
||||
|
||||
feature -- Encoding
|
||||
|
||||
html_special_chars_encoded_string (s: STRING): STRING
|
||||
local
|
||||
c: CHARACTER
|
||||
i,n: INTEGER
|
||||
do
|
||||
from
|
||||
i := 1
|
||||
n := s.count
|
||||
create Result.make (n + 10)
|
||||
until
|
||||
i > n
|
||||
loop
|
||||
c := s[i]
|
||||
inspect c
|
||||
when '&' then
|
||||
Result.append_string ("&")
|
||||
when '%"' then
|
||||
Result.append_string (""")
|
||||
when '%'' then
|
||||
Result.append_string ("'")
|
||||
when '<' then
|
||||
Result.append_string ("<")
|
||||
when '>' then
|
||||
Result.append_string (">")
|
||||
else
|
||||
Result.extend (c)
|
||||
end
|
||||
i := i + 1
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Helpers
|
||||
|
||||
strings_to_string (lst: LIST [STRING]; sep: STRING): STRING
|
||||
do
|
||||
create Result.make_empty
|
||||
if lst.count > 0 then
|
||||
from
|
||||
lst.start
|
||||
until
|
||||
lst.after
|
||||
loop
|
||||
Result.append_string (lst.item)
|
||||
Result.append_string (sep)
|
||||
lst.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
attributes_to_string (atts: LIST [TUPLE [name: STRING; value: STRING]]): STRING
|
||||
do
|
||||
create Result.make_empty
|
||||
if atts.count > 0 then
|
||||
from
|
||||
atts.start
|
||||
until
|
||||
atts.after
|
||||
loop
|
||||
Result.append_character (' ')
|
||||
Result.append_string (atts.item.name)
|
||||
Result.append_character ('=')
|
||||
Result.append_character ('%"')
|
||||
Result.append_string (html_special_chars_encoded_string (atts.item.value))
|
||||
Result.append_character ('%"')
|
||||
atts.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,327 @@
|
||||
note
|
||||
description: "Summary description for {REST_API_DOCUMENTATION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_API_DOCUMENTATION [C -> REST_REQUEST_HANDLER_CONTEXT]
|
||||
|
||||
inherit
|
||||
REST_REQUEST_HANDLER [C]
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_router: like router; a_base_doc_url: like base_doc_url)
|
||||
do
|
||||
router := a_router
|
||||
base_doc_url := a_base_doc_url
|
||||
description := "Technical documention for the API"
|
||||
end
|
||||
|
||||
feature {NONE} -- Access: Implementation
|
||||
|
||||
router: REST_REQUEST_ROUTER [REST_REQUEST_HANDLER [C], C]
|
||||
|
||||
base_doc_url: READABLE_STRING_8
|
||||
|
||||
feature -- Access
|
||||
|
||||
authentication_required (req: WSF_REQUEST): BOOLEAN
|
||||
do
|
||||
end
|
||||
|
||||
resource_value (ctx: C): detachable READABLE_STRING_32
|
||||
do
|
||||
if attached {WSF_STRING} ctx.item ("resource") as s then
|
||||
Result := s.string
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute_application (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
local
|
||||
rep: like new_html_page
|
||||
s: STRING
|
||||
rq: detachable REST_REQUEST_HANDLER [C]
|
||||
rq_resource: detachable READABLE_STRING_GENERAL
|
||||
-- l_dft_format_name: detachable STRING
|
||||
hdl_cursor: like router.new_cursor
|
||||
do
|
||||
rep := new_html_page
|
||||
rep.headers.put_content_type_text_html
|
||||
create s.make_empty
|
||||
|
||||
if
|
||||
attached resource_value (ctx) as l_resource
|
||||
then
|
||||
from
|
||||
hdl_cursor := router.new_cursor
|
||||
until
|
||||
hdl_cursor.after or rq /= Void
|
||||
loop
|
||||
if hdl_cursor.item.resource.same_string_general (l_resource) then
|
||||
rq := hdl_cursor.item.handler
|
||||
rq_resource := l_resource
|
||||
end
|
||||
hdl_cursor.forth
|
||||
end
|
||||
end
|
||||
-- if a_args /= Void and then not a_args.is_empty then
|
||||
-- rq := router.handler_by_path (a_args)
|
||||
-- if rq = Void then
|
||||
-- rq := handler_manager.smart_handler_by_path (a_args)
|
||||
---- if attached {REST_REQUEST_GROUP_HANDLER} rq as grp then
|
||||
---- rq := grp.handlers.handler_by_path (a_args)
|
||||
---- end
|
||||
-- end
|
||||
-- if
|
||||
-- rq /= Void and then
|
||||
-- attached rq.path_information (a_args) as l_info
|
||||
-- then
|
||||
-- l_dft_format_name := l_info.format
|
||||
-- end
|
||||
-- end
|
||||
|
||||
|
||||
if rq /= Void and then rq_resource /= Void then
|
||||
rep.set_big_title ("API: Technical documentation for ["+ rq_resource.as_string_8 +"]")
|
||||
|
||||
s.append_string ("<div class=%"api%">")
|
||||
s.append_string ("<h2 class=%"api-name%" >")
|
||||
|
||||
s.append_string ("<a href=%"" + base_doc_url + "%">.. Show all features ..</a>")
|
||||
s.append_string ("</h2></div>%N")
|
||||
|
||||
process_request_handler_doc (rq, rq_resource.as_string_8, s, ctx, req, res, Void)
|
||||
else
|
||||
rep.set_big_title ("API: Technical documentation")
|
||||
|
||||
from
|
||||
hdl_cursor := router.new_cursor
|
||||
until
|
||||
hdl_cursor.after
|
||||
loop
|
||||
if attached hdl_cursor.item as l_item then
|
||||
rq := l_item.handler
|
||||
rep.add_shortcut (l_item.resource)
|
||||
s.append ("<a name=%"" + rep.last_added_shortcut + "%"/>")
|
||||
process_request_handler_doc (rq, l_item.resource, s, ctx, req, res, Void)
|
||||
hdl_cursor.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
rep.set_body (s)
|
||||
rep.send (res)
|
||||
rep.recycle
|
||||
end
|
||||
|
||||
process_request_handler_doc (rq: REST_REQUEST_HANDLER [C]; a_resource: STRING; buf: STRING; ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE; a_dft_format: detachable STRING)
|
||||
local
|
||||
l_dft_format_name: detachable STRING
|
||||
s: STRING
|
||||
l_uri_tpl: URI_TEMPLATE
|
||||
do
|
||||
s := buf
|
||||
|
||||
if a_dft_format /= Void then
|
||||
if rq.supported_format_names.has (a_dft_format) then
|
||||
l_dft_format_name := a_dft_format
|
||||
end
|
||||
end
|
||||
|
||||
s.append_string ("<div class=%"api%">")
|
||||
s.append_string ("<h2 class=%"api-name%" ><a href=%""+ url (req, base_doc_url, a_resource, False) +"%">"+ a_resource +"</a></h2>")
|
||||
s.append_string ("<div class=%"inner%">")
|
||||
-- if rq.hidden (req) then
|
||||
-- s.append_string ("<div class=%"api-description%">This feature is hidden</div>%N")
|
||||
-- else
|
||||
if attached rq.description as desc then
|
||||
s.append_string ("<div class=%"api-description%">" + desc + "</div>")
|
||||
end
|
||||
-- if attached {REST_REQUEST_GROUP_HANDLER} rq as grp then
|
||||
-- s.append_string ("<div class=%"api-format%">Handler: <strong>")
|
||||
-- if attached grp.handlers.new_cursor as l_handlers_cursor then
|
||||
-- from
|
||||
|
||||
-- until
|
||||
-- l_handlers_cursor.after
|
||||
-- loop
|
||||
-- s.append_string (" ")
|
||||
-- s.append_string ("<a class=%"api-handler%" href=%"")
|
||||
-- s.append_string (url (ctx, l_handlers_cursor.item.path, False))
|
||||
-- s.append_string ("%">"+ l_handlers_cursor.item.path +"</a>")
|
||||
-- l_handlers_cursor.forth
|
||||
-- end
|
||||
-- end
|
||||
-- s.append_string ("</strong></div>")
|
||||
-- end
|
||||
if attached rq.supported_format_names as l_formats and then not l_formats.is_empty then
|
||||
s.append_string ("<div class=%"api-format%">Supported formats: <strong>")
|
||||
if attached l_formats.new_cursor as l_formats_cursor then
|
||||
from
|
||||
|
||||
until
|
||||
l_formats_cursor.after
|
||||
loop
|
||||
s.append_string (" ")
|
||||
s.append_string ("<a class=%"api-name api-format")
|
||||
if l_formats_cursor.item ~ l_dft_format_name then
|
||||
s.append_string (" selected")
|
||||
end
|
||||
s.append_string ("%" href=%"" + url (req, base_doc_url, a_resource, False) + "." + l_formats_cursor.item + "%">"+ l_formats_cursor.item +"</a>")
|
||||
l_formats_cursor.forth
|
||||
end
|
||||
end
|
||||
s.append_string ("</strong></div>")
|
||||
end
|
||||
if attached rq.supported_request_method_names as l_methods and then not l_methods.is_empty then
|
||||
s.append_string ("<div class=%"api-method%">Supported request methods: <strong>")
|
||||
if attached l_methods.new_cursor as l_methods_cursor then
|
||||
from
|
||||
|
||||
until
|
||||
l_methods_cursor.after
|
||||
loop
|
||||
s.append_string (" ")
|
||||
s.append_string (l_methods_cursor.item)
|
||||
l_methods_cursor.forth
|
||||
end
|
||||
end
|
||||
s.append_string ("</strong></div>")
|
||||
end
|
||||
s.append_string ("<div class=%"api-auth%">Authentication required: <strong>" + rq.authentication_required (req).out + "</strong></div>")
|
||||
if attached {REST_REQUEST_URI_TEMPLATE_ROUTER_I [REST_REQUEST_HANDLER [REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT], REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT]} router as l_uri_template_router then
|
||||
create l_uri_tpl.make (a_resource)
|
||||
if attached l_uri_tpl.query_variable_names as l_query_variable_names and then not l_query_variable_names.is_empty then
|
||||
s.append_string ("<div class=%"api-uri-template%">Query parameters: ")
|
||||
-- s.append_string (rq.path)
|
||||
from
|
||||
l_query_variable_names.start
|
||||
until
|
||||
l_query_variable_names.after
|
||||
loop
|
||||
if l_query_variable_names.isfirst then
|
||||
s.append_string ("?")
|
||||
else
|
||||
s.append_string ("&")
|
||||
end
|
||||
if attached l_query_variable_names.item as l_query_param then
|
||||
s.append_string ("<strong>" + l_query_param + "</strong>")
|
||||
s.append_string ("=<em>" + l_query_param + "</em>")
|
||||
end
|
||||
l_query_variable_names.forth
|
||||
end
|
||||
s.append_string ("</div>%N")
|
||||
end
|
||||
if attached l_uri_tpl.path_variable_names as l_path_variable_names and then not l_path_variable_names.is_empty then
|
||||
s.append_string ("<div class=%"api-uri-template%">Path Segment parameters: ")
|
||||
-- s.append_string (rq.path)
|
||||
from
|
||||
l_path_variable_names.start
|
||||
until
|
||||
l_path_variable_names.after
|
||||
loop
|
||||
if attached l_path_variable_names.item as l_seg_param then
|
||||
s.append_string ("<em>{" + l_seg_param + "}</em>")
|
||||
end
|
||||
l_path_variable_names.forth
|
||||
end
|
||||
s.append_string ("</div>%N")
|
||||
end
|
||||
|
||||
end
|
||||
-- if attached rq._parameters as l_uri_params and then not l_uri_params.is_empty then
|
||||
-- s.append_string ("<div class=%"api-uri-template%">URI Template: ")
|
||||
-- s.append_string (rq.path)
|
||||
-- if attached l_uri_params.new_cursor as l_uri_params_cursor then
|
||||
-- from
|
||||
|
||||
-- until
|
||||
-- l_uri_params_cursor.after
|
||||
-- loop
|
||||
-- if attached l_uri_params_cursor.item as l_uri_param then
|
||||
-- s.append_string ("/<strong>" + l_uri_param.name + "</strong>")
|
||||
-- s.append_string ("/<em>{" + l_uri_param.name + "}</em>")
|
||||
-- end
|
||||
-- l_uri_params_cursor.forth
|
||||
-- end
|
||||
-- end
|
||||
-- s.append_string ("</div>%N")
|
||||
-- end
|
||||
-- if attached rq.parameters as l_params and then not l_params.is_empty then
|
||||
-- s.append_string ("<div class=%"api-params%">Parameters: ")
|
||||
|
||||
-- --| show form only if we have a default format
|
||||
-- if l_dft_format_name = Void then
|
||||
-- s.append_string ("<span class=%"note%">to test the parameter(s), please first select a supported format.</span>%N")
|
||||
-- else
|
||||
-- if rq.method_post_supported then
|
||||
-- s.append_string ("<form id=%""+ rq.path +"%" method=%"POST%" action=%"" + ctx.script_url (rq.path) + "." + l_dft_format_name + "%">%N")
|
||||
-- else
|
||||
-- s.append_string ("<form id=%""+ rq.path +"%" method=%"GET%" action=%"" + ctx.script_url (rq.path) + "." + l_dft_format_name + "%">%N")
|
||||
-- end
|
||||
-- end
|
||||
-- s.append_string ("<ul>")
|
||||
-- if attached l_params.new_cursor as l_params_cursor then
|
||||
-- from
|
||||
|
||||
-- until
|
||||
-- l_params_cursor.after
|
||||
-- loop
|
||||
-- if attached l_params_cursor.item as l_param then
|
||||
-- s.append_string ("<li><strong>" + l_param.name + "</strong>")
|
||||
-- if l_param.optional then
|
||||
-- s.append_string (" <em>(Optional)</em>")
|
||||
-- end
|
||||
-- if attached l_param.description as l_param_desc then
|
||||
-- s.append_string (": <em>" + l_param_desc + "</em>")
|
||||
-- end
|
||||
-- if l_dft_format_name /= Void then
|
||||
-- s.append (" <input name=%"" + l_param.name + "%" type=%"text%" />")
|
||||
-- end
|
||||
-- s.append_string ("</li>")
|
||||
-- end
|
||||
-- l_params_cursor.forth
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- if l_dft_format_name /= Void then
|
||||
-- s.append_string ("<input type=%"submit%" value=%"Test "+ rq.path + "." + l_dft_format_name + "%"/>")
|
||||
-- s.append_string ("</form>")
|
||||
-- end
|
||||
-- s.append_string ("</ul></div>")
|
||||
-- else
|
||||
-- if l_dft_format_name /= Void then
|
||||
-- s.append_string ("<a class=%"api-name%" href=%"" + ctx.script_url (a_resource + "." + l_dft_format_name) + "%">Test "+ a_resource + "." + l_dft_format_name + "</a>")
|
||||
-- else
|
||||
-- s.append_string ("<a class=%"api-name%" href=%"" + ctx.script_url (a_resource) + "%">Test "+ a_resource +"</a>")
|
||||
-- end
|
||||
-- end
|
||||
s.append_string ("</div>%N")
|
||||
-- end
|
||||
s.append_string ("</div>%N") -- inner
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
new_html_page: REST_API_DOCUMENTATION_HTML_PAGE
|
||||
do
|
||||
create Result.make ("API Documentation")
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,124 @@
|
||||
note
|
||||
description: "Summary description for {REST_API_DOCUMENTATION_HTML_PAGE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_API_DOCUMENTATION_HTML_PAGE
|
||||
|
||||
inherit
|
||||
HTML_PAGE
|
||||
redefine
|
||||
head,
|
||||
initialize,
|
||||
recycle,
|
||||
compute
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
initialize
|
||||
do
|
||||
Precursor
|
||||
create {LINKED_LIST [like shortcuts.item]} shortcuts.make
|
||||
end
|
||||
|
||||
feature -- Recyle
|
||||
|
||||
recycle
|
||||
do
|
||||
Precursor
|
||||
shortcuts.wipe_out
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
head: REST_API_DOCUMENTATION_HTML_PAGE_HEAD
|
||||
|
||||
big_title: detachable STRING
|
||||
|
||||
shortcuts: LIST [TUPLE [name: STRING; anchor: STRING]]
|
||||
|
||||
add_shortcut (s: STRING)
|
||||
local
|
||||
t: STRING
|
||||
do
|
||||
t := s.string
|
||||
t.replace_substring_all ("/", "-")
|
||||
shortcuts.force ([s,t])
|
||||
end
|
||||
|
||||
last_added_shortcut: STRING
|
||||
do
|
||||
if shortcuts.count > 0 and then attached shortcuts.last as sht then
|
||||
Result := sht.anchor
|
||||
else
|
||||
create Result.make_empty
|
||||
end
|
||||
end
|
||||
|
||||
shortcuts_to_html: detachable STRING
|
||||
do
|
||||
if not shortcuts.is_empty then
|
||||
from
|
||||
create Result.make_from_string ("<strong>Shortcuts:</strong> | ")
|
||||
shortcuts.start
|
||||
until
|
||||
shortcuts.after
|
||||
loop
|
||||
Result.append_string ("<a href=%"#"+ shortcuts.item.anchor +"%">"+ shortcuts.item.name +"</a> | ")
|
||||
shortcuts.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_big_title (t: like big_title)
|
||||
do
|
||||
big_title := t
|
||||
end
|
||||
|
||||
feature -- Basic operation
|
||||
|
||||
compute
|
||||
local
|
||||
l_old_body: STRING
|
||||
sh, bt: detachable STRING
|
||||
do
|
||||
sh := shortcuts_to_html
|
||||
bt := big_title
|
||||
if sh /= Void or bt /= Void then
|
||||
l_old_body := body
|
||||
if bt /= Void then
|
||||
bt := "<h1>" + bt + "</h2>%N"
|
||||
if sh /= Void then
|
||||
body := bt + sh + l_old_body
|
||||
else
|
||||
body := bt + l_old_body
|
||||
end
|
||||
elseif sh /= Void then
|
||||
body := sh + l_old_body
|
||||
end
|
||||
Precursor
|
||||
body := l_old_body
|
||||
else
|
||||
Precursor
|
||||
end
|
||||
end
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,75 @@
|
||||
note
|
||||
description: "Summary description for {REST_API_DOCUMENTATION_HTML_PAGE_HEAD}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_API_DOCUMENTATION_HTML_PAGE_HEAD
|
||||
|
||||
inherit
|
||||
HTML_PAGE_HEAD
|
||||
redefine
|
||||
initialize,
|
||||
compute
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
initialize
|
||||
do
|
||||
Precursor
|
||||
style := "[
|
||||
body {margin: 0px;}
|
||||
a { text-decoration: none; }
|
||||
h1 { padding: 10px; border: solid 2px #000; background-color: #009; color: #fff;}
|
||||
div.api { padding: 5px; margin-bottom: 10px;}
|
||||
div.api .api-description { padding: 5px 5px 5px 0px; font-style: italic; color: #090;}
|
||||
div.api div.inner { padding-left: 40px;}
|
||||
div.api h2>a { color: #009; text-decoration: none;}
|
||||
div.api a.api-format { color: #009; text-decoration: none;}
|
||||
div.api a.api-format.selected { padding: 0 4px 0 4px; color: #009; text-decoration: none; border: solid 1px #99c; background-color: #eeeeff;}
|
||||
div.api>h2 { margin: 2px; padding: 2px 2px 2px 10px; display: inline-block; border: dotted 1px #cce; width: 100%; color: #009; background-color: #E7F3F8; text-decoration: none; font-weight: bold; font-size: 120%;}
|
||||
div.api span.note { font-style: italic;}
|
||||
]"
|
||||
end
|
||||
|
||||
feature {REST_API_DOCUMENTATION_HTML_PAGE} -- Access
|
||||
|
||||
style: STRING
|
||||
|
||||
feature -- Output
|
||||
|
||||
compute
|
||||
-- Compute the string output
|
||||
local
|
||||
s: detachable STRING
|
||||
p: INTEGER
|
||||
do
|
||||
Precursor
|
||||
s := internal_string
|
||||
if s /= Void then
|
||||
p := s.substring_index ("</head>", 1)
|
||||
if p > 0 then
|
||||
s.insert_string ("<style>%N" + style + "%N</style>%N", p)
|
||||
else
|
||||
s.append_string ("<style>%N" + style + "%N</style>%N")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,47 @@
|
||||
note
|
||||
description: "Summary description for REST_REQUEST_GROUP_HANDLER."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_GROUP_HANDLER [H -> REST_REQUEST_HANDLER [C], C -> REST_REQUEST_HANDLER_CONTEXT]
|
||||
|
||||
inherit
|
||||
REQUEST_ROUTING_HANDLER [H, C]
|
||||
redefine
|
||||
execute
|
||||
end
|
||||
|
||||
REST_REQUEST_HANDLER [C]
|
||||
redefine
|
||||
execute
|
||||
select
|
||||
execute_application
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- status
|
||||
|
||||
authentication_required: BOOLEAN
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
|
||||
do
|
||||
Precursor {REST_REQUEST_HANDLER} (ctx, req, res)
|
||||
end
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,56 @@
|
||||
note
|
||||
description: "Summary description for {REST_RESPONSE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_RESPONSE
|
||||
|
||||
inherit
|
||||
WSF_PAGE_RESPONSE
|
||||
rename
|
||||
header as headers,
|
||||
body as message,
|
||||
set_body as set_message,
|
||||
put_string as append_message,
|
||||
make as page_make,
|
||||
send_to as send
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_api: like api)
|
||||
do
|
||||
api := a_api
|
||||
page_make
|
||||
end
|
||||
|
||||
feature -- Recycle
|
||||
|
||||
recycle
|
||||
do
|
||||
headers.recycle
|
||||
message := Void
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
api: STRING
|
||||
-- Associated api query string.
|
||||
|
||||
invariant
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,52 @@
|
||||
note
|
||||
description: "Summary description for REST_REQUEST_AGENT_HANDLER."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_AGENT_HANDLER [C -> REST_REQUEST_HANDLER_CONTEXT]
|
||||
|
||||
inherit
|
||||
WSF_AGENT_HANDLER [C]
|
||||
rename
|
||||
execute as execute_application
|
||||
end
|
||||
|
||||
REST_REQUEST_HANDLER [C]
|
||||
select
|
||||
execute
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- status
|
||||
|
||||
authentication_required (req: WSF_REQUEST): BOOLEAN
|
||||
do
|
||||
Result := internal_authentication_required
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_authentication_required (b: like authentication_required)
|
||||
do
|
||||
internal_authentication_required := b
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
internal_authentication_required: BOOLEAN
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
332
draft/library/server/request/rest/src/rest_request_handler.e
Normal file
332
draft/library/server/request/rest/src/rest_request_handler.e
Normal file
@@ -0,0 +1,332 @@
|
||||
note
|
||||
description: "Summary description for {REST_REQUEST_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
REST_REQUEST_HANDLER [C -> REST_REQUEST_HANDLER_CONTEXT]
|
||||
|
||||
inherit
|
||||
WSF_HANDLER [C]
|
||||
|
||||
WSF_HANDLER_HELPER
|
||||
|
||||
feature -- Access
|
||||
|
||||
authentication_required (req: WSF_REQUEST): BOOLEAN
|
||||
-- Is authentication required
|
||||
-- might depend on the request environment
|
||||
-- or the associated resources
|
||||
deferred
|
||||
end
|
||||
|
||||
description: detachable STRING
|
||||
-- Optional description
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_description (s: like description)
|
||||
-- Set `description' to `s'
|
||||
do
|
||||
description := s
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
-- Execute request handler
|
||||
do
|
||||
if request_method_name_supported (req.request_method) then
|
||||
if authentication_required (req) and then not authenticated (ctx) then
|
||||
execute_unauthorized (ctx, req, res)
|
||||
else
|
||||
pre_execute (ctx, req, res)
|
||||
execute_application (ctx, req, res)
|
||||
post_execute (ctx, req, res)
|
||||
end
|
||||
else
|
||||
execute_request_method_not_allowed (req, res, supported_request_method_names)
|
||||
end
|
||||
rescue
|
||||
execute_rescue (ctx, req, res)
|
||||
end
|
||||
|
||||
execute_application (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
deferred
|
||||
end
|
||||
|
||||
pre_execute (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
end
|
||||
|
||||
post_execute (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
end
|
||||
|
||||
execute_rescue (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
post_execute (ctx, req, res)
|
||||
rescue
|
||||
--| Just in case, the rescue is raising other exceptions ...
|
||||
end
|
||||
|
||||
execute_unauthorized (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
res.put_header ({HTTP_STATUS_CODE}.unauthorized, Void)
|
||||
res.put_string ("Unauthorized")
|
||||
end
|
||||
|
||||
feature -- Auth
|
||||
|
||||
authenticated (ctx: C): BOOLEAN
|
||||
-- Is authenticated?
|
||||
do
|
||||
--| To redefine if needed
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
supported_formats: INTEGER
|
||||
-- Support request format result such as json, xml, ...
|
||||
|
||||
feature {NONE} -- Status report
|
||||
|
||||
format_id_supported (a_id: INTEGER): BOOLEAN
|
||||
do
|
||||
Result := (supported_formats & a_id) = a_id
|
||||
end
|
||||
|
||||
format_name_supported (n: STRING): BOOLEAN
|
||||
-- Is format `n' supported?
|
||||
do
|
||||
Result := format_id_supported (format_constants.format_id (n))
|
||||
end
|
||||
|
||||
format_constants: HTTP_FORMAT_CONSTANTS
|
||||
once
|
||||
create Result
|
||||
end
|
||||
|
||||
feature -- Status report
|
||||
|
||||
supported_format_names: LIST [STRING]
|
||||
-- Supported format names ...
|
||||
do
|
||||
create {LINKED_LIST [STRING]} Result.make
|
||||
if format_json_supported then
|
||||
Result.extend (format_constants.json_name)
|
||||
end
|
||||
if format_xml_supported then
|
||||
Result.extend (format_constants.xml_name)
|
||||
end
|
||||
if format_text_supported then
|
||||
Result.extend (format_constants.text_name)
|
||||
end
|
||||
if format_html_supported then
|
||||
Result.extend (format_constants.html_name)
|
||||
end
|
||||
if format_rss_supported then
|
||||
Result.extend (format_constants.rss_name)
|
||||
end
|
||||
if format_atom_supported then
|
||||
Result.extend (format_constants.atom_name)
|
||||
end
|
||||
end
|
||||
|
||||
format_json_supported: BOOLEAN
|
||||
do
|
||||
Result := format_id_supported ({HTTP_FORMAT_CONSTANTS}.json)
|
||||
end
|
||||
|
||||
format_xml_supported: BOOLEAN
|
||||
do
|
||||
Result := format_id_supported ({HTTP_FORMAT_CONSTANTS}.xml)
|
||||
end
|
||||
|
||||
format_text_supported: BOOLEAN
|
||||
do
|
||||
Result := format_id_supported ({HTTP_FORMAT_CONSTANTS}.text)
|
||||
end
|
||||
|
||||
format_html_supported: BOOLEAN
|
||||
do
|
||||
Result := format_id_supported ({HTTP_FORMAT_CONSTANTS}.html)
|
||||
end
|
||||
|
||||
format_rss_supported: BOOLEAN
|
||||
do
|
||||
Result := format_id_supported ({HTTP_FORMAT_CONSTANTS}.rss)
|
||||
end
|
||||
|
||||
format_atom_supported: BOOLEAN
|
||||
do
|
||||
Result := format_id_supported ({HTTP_FORMAT_CONSTANTS}.atom)
|
||||
end
|
||||
|
||||
feature -- Element change: formats
|
||||
|
||||
reset_supported_formats
|
||||
do
|
||||
supported_formats := 0
|
||||
end
|
||||
|
||||
enable_format_json
|
||||
do
|
||||
enable_format ({HTTP_FORMAT_CONSTANTS}.json)
|
||||
end
|
||||
|
||||
enable_format_xml
|
||||
do
|
||||
enable_format ({HTTP_FORMAT_CONSTANTS}.xml)
|
||||
end
|
||||
|
||||
enable_format_text
|
||||
do
|
||||
enable_format ({HTTP_FORMAT_CONSTANTS}.text)
|
||||
end
|
||||
|
||||
enable_format_html
|
||||
do
|
||||
enable_format ({HTTP_FORMAT_CONSTANTS}.html)
|
||||
end
|
||||
|
||||
enable_format (f: INTEGER)
|
||||
do
|
||||
supported_formats := supported_formats | f
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
supported_request_methods: INTEGER
|
||||
-- Support request method such as GET, POST, ...
|
||||
|
||||
feature {NONE} -- Status report
|
||||
|
||||
request_method_id_supported (a_id: INTEGER): BOOLEAN
|
||||
do
|
||||
Result := (supported_request_methods & a_id) = a_id
|
||||
end
|
||||
|
||||
request_method_name_supported (n: STRING): BOOLEAN
|
||||
-- Is request method `n' supported?
|
||||
do
|
||||
Result := request_method_id_supported (request_method_constants.method_id (n))
|
||||
end
|
||||
|
||||
request_method_constants: HTTP_REQUEST_METHOD_CONSTANTS
|
||||
once
|
||||
create Result
|
||||
end
|
||||
|
||||
feature -- Status report
|
||||
|
||||
supported_request_method_names: LIST [STRING]
|
||||
-- Support request method such as GET, POST, ...
|
||||
do
|
||||
create {LINKED_LIST [STRING]} Result.make
|
||||
if method_get_supported then
|
||||
Result.extend (request_method_constants.method_get)
|
||||
end
|
||||
if method_post_supported then
|
||||
Result.extend (request_method_constants.method_post)
|
||||
end
|
||||
if method_put_supported then
|
||||
Result.extend (request_method_constants.method_put)
|
||||
end
|
||||
if method_patch_supported then
|
||||
Result.extend (request_method_constants.method_patch)
|
||||
end
|
||||
if method_delete_supported then
|
||||
Result.extend (request_method_constants.method_delete)
|
||||
end
|
||||
if method_head_supported then
|
||||
Result.extend (request_method_constants.method_head)
|
||||
end
|
||||
end
|
||||
|
||||
method_get_supported: BOOLEAN
|
||||
do
|
||||
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.get)
|
||||
end
|
||||
|
||||
method_post_supported: BOOLEAN
|
||||
do
|
||||
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.post)
|
||||
end
|
||||
|
||||
method_put_supported: BOOLEAN
|
||||
do
|
||||
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.put)
|
||||
end
|
||||
|
||||
method_patch_supported: BOOLEAN
|
||||
do
|
||||
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.patch)
|
||||
end
|
||||
|
||||
method_delete_supported: BOOLEAN
|
||||
do
|
||||
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.delete)
|
||||
end
|
||||
|
||||
method_head_supported: BOOLEAN
|
||||
do
|
||||
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.head)
|
||||
end
|
||||
|
||||
feature -- Element change: request methods
|
||||
|
||||
reset_supported_request_methods
|
||||
do
|
||||
supported_request_methods := 0
|
||||
end
|
||||
|
||||
enable_request_method_get
|
||||
do
|
||||
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.get)
|
||||
end
|
||||
|
||||
enable_request_method_post
|
||||
do
|
||||
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.post)
|
||||
end
|
||||
|
||||
enable_request_method_put
|
||||
do
|
||||
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.put)
|
||||
end
|
||||
|
||||
enable_request_method_patch
|
||||
do
|
||||
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.patch)
|
||||
end
|
||||
|
||||
enable_request_method_delete
|
||||
do
|
||||
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.delete)
|
||||
end
|
||||
|
||||
enable_request_method_head
|
||||
do
|
||||
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.head)
|
||||
end
|
||||
|
||||
enable_request_method (m: INTEGER)
|
||||
do
|
||||
supported_request_methods := supported_request_methods | m
|
||||
end
|
||||
|
||||
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,131 @@
|
||||
note
|
||||
description: "Summary description for {REST_REQUEST_HANDLER_CONTEXT}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
REST_REQUEST_HANDLER_CONTEXT
|
||||
|
||||
inherit
|
||||
WSF_HANDLER_CONTEXT
|
||||
|
||||
feature -- Accept: Content-Type
|
||||
|
||||
accepted_content_type: detachable READABLE_STRING_8
|
||||
do
|
||||
if internal_accepted_content_type = Void then
|
||||
get_accepted_content_type (Void)
|
||||
end
|
||||
Result := internal_accepted_content_type
|
||||
end
|
||||
|
||||
get_accepted_content_type (a_supported_content_types: detachable ARRAY [STRING_8])
|
||||
do
|
||||
if internal_accepted_content_type = Void then
|
||||
internal_accepted_content_type := request_accepted_content_type (a_supported_content_types)
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Format name
|
||||
|
||||
accepted_format_name: detachable READABLE_STRING_8
|
||||
do
|
||||
if internal_accepted_format_name = Void then
|
||||
get_accepted_format_name (Void, Void)
|
||||
end
|
||||
Result := internal_accepted_format_name
|
||||
end
|
||||
|
||||
get_accepted_format_name (a_format_variable_name: detachable READABLE_STRING_8; a_supported_content_types: detachable ARRAY [STRING_8])
|
||||
do
|
||||
if internal_accepted_format_name = Void then
|
||||
internal_accepted_format_name := request_accepted_format (a_format_variable_name, a_supported_content_types)
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Format id
|
||||
|
||||
accepted_format_id: INTEGER
|
||||
do
|
||||
if internal_accepted_format_id = 0 then
|
||||
get_accepted_format_id (Void, Void)
|
||||
end
|
||||
Result := internal_accepted_format_id
|
||||
end
|
||||
|
||||
get_accepted_format_id (a_format_variable_name: detachable READABLE_STRING_8; a_supported_content_types: detachable ARRAY [STRING_8])
|
||||
do
|
||||
if internal_accepted_format_id = 0 then
|
||||
internal_accepted_format_id := request_accepted_format_id (a_format_variable_name, a_supported_content_types)
|
||||
end
|
||||
end
|
||||
|
||||
feature {NONE} -- Constants
|
||||
|
||||
Format_constants: HTTP_FORMAT_CONSTANTS
|
||||
once
|
||||
create Result
|
||||
end
|
||||
|
||||
feature -- Format
|
||||
|
||||
request_accepted_format (a_format_variable_name: detachable READABLE_STRING_8; a_supported_content_types: detachable ARRAY [READABLE_STRING_8]): detachable READABLE_STRING_8
|
||||
-- Format id for the request based on {HTTP_FORMAT_CONSTANTS}
|
||||
do
|
||||
if a_format_variable_name /= Void and then attached string_item (a_format_variable_name) as ctx_format then
|
||||
Result := ctx_format.as_string_8
|
||||
else
|
||||
Result := request_format_from_content_type (request_accepted_content_type (a_supported_content_types))
|
||||
end
|
||||
end
|
||||
|
||||
request_accepted_format_id (a_format_variable_name: detachable READABLE_STRING_8; a_supported_content_types: detachable ARRAY [READABLE_STRING_8]): INTEGER
|
||||
-- Format id for the request based on {HTTP_FORMAT_CONSTANTS}
|
||||
do
|
||||
if attached request_accepted_format (a_format_variable_name, a_supported_content_types) as l_format then
|
||||
Result := Format_constants.format_id (l_format)
|
||||
else
|
||||
Result := 0
|
||||
end
|
||||
end
|
||||
|
||||
feature {NONE} -- Format/Content type implementation
|
||||
|
||||
request_format_from_content_type (a_content_type: detachable READABLE_STRING_8): detachable READABLE_STRING_8
|
||||
-- `a_content_type' converted into a request format name
|
||||
do
|
||||
if a_content_type /= Void then
|
||||
if a_content_type.same_string ({HTTP_MIME_TYPES}.text_json) then
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.json_name
|
||||
elseif a_content_type.same_string ({HTTP_MIME_TYPES}.application_json) then
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.json_name
|
||||
elseif a_content_type.same_string ({HTTP_MIME_TYPES}.text_xml) then
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.xml_name
|
||||
elseif a_content_type.same_string ({HTTP_MIME_TYPES}.text_html) then
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.html_name
|
||||
elseif a_content_type.same_string ({HTTP_MIME_TYPES}.text_plain) then
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.text_name
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature {NONE} -- Internal
|
||||
|
||||
internal_accepted_content_type: like accepted_content_type
|
||||
|
||||
internal_accepted_format_id: like accepted_format_id
|
||||
|
||||
internal_accepted_format_name: like accepted_format_name
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
23
draft/library/server/request/rest/src/rest_request_router.e
Normal file
23
draft/library/server/request/rest/src/rest_request_router.e
Normal file
@@ -0,0 +1,23 @@
|
||||
note
|
||||
description: "Summary description for {REST_REQUEST_ROUTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
REST_REQUEST_ROUTER [H -> REST_REQUEST_HANDLER [C], C -> REST_REQUEST_HANDLER_CONTEXT]
|
||||
|
||||
inherit
|
||||
WSF_ROUTER [H, C]
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
23
draft/library/server/request/rest/src/rest_service.e
Normal file
23
draft/library/server/request/rest/src/rest_service.e
Normal file
@@ -0,0 +1,23 @@
|
||||
note
|
||||
description: "Summary description for {DEFAULT_REST_SERVICE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
REST_SERVICE
|
||||
|
||||
inherit
|
||||
REST_SERVICE_I [REST_REQUEST_HANDLER [REST_REQUEST_HANDLER_CONTEXT], REST_REQUEST_HANDLER_CONTEXT]
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
31
draft/library/server/request/rest/src/rest_service_i.e
Normal file
31
draft/library/server/request/rest/src/rest_service_i.e
Normal file
@@ -0,0 +1,31 @@
|
||||
note
|
||||
description: "Summary description for {REST_SERVICE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
REST_SERVICE_I [H -> REST_REQUEST_HANDLER [C], C -> REST_REQUEST_HANDLER_CONTEXT]
|
||||
|
||||
inherit
|
||||
WSF_ROUTED_SERVICE_I [H, C]
|
||||
redefine
|
||||
router
|
||||
end
|
||||
|
||||
feature -- Setup
|
||||
|
||||
router: REST_REQUEST_ROUTER [H, C]
|
||||
-- Request router
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
note
|
||||
description: "Summary description for {DEFAULT_REST_REQUEST_URI_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
REST_REQUEST_URI_HANDLER
|
||||
|
||||
inherit
|
||||
REST_REQUEST_HANDLER [REST_REQUEST_URI_HANDLER_CONTEXT]
|
||||
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,28 @@
|
||||
note
|
||||
description: "Summary description for {WSF_URI_HANDLER_CONTEXT}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_URI_HANDLER_CONTEXT
|
||||
|
||||
inherit
|
||||
WSF_URI_HANDLER_CONTEXT
|
||||
|
||||
REST_REQUEST_HANDLER_CONTEXT
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,40 @@
|
||||
note
|
||||
description: "Summary description for {DEFAULT_REST_REQUEST_URI_ROUTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_URI_ROUTER
|
||||
|
||||
inherit
|
||||
REST_REQUEST_URI_ROUTER_I [REST_REQUEST_HANDLER [REST_REQUEST_URI_HANDLER_CONTEXT], REST_REQUEST_URI_HANDLER_CONTEXT]
|
||||
redefine
|
||||
map_agent_with_request_methods
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Mapping
|
||||
|
||||
map_agent_with_request_methods (a_id: READABLE_STRING_8; a_action: PROCEDURE [ANY, TUPLE [ctx: REST_REQUEST_URI_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE]];
|
||||
rqst_methods: detachable ARRAY [READABLE_STRING_8])
|
||||
local
|
||||
h: REST_REQUEST_AGENT_HANDLER [REST_REQUEST_URI_HANDLER_CONTEXT]
|
||||
do
|
||||
create h.make (a_action)
|
||||
map_with_request_methods (a_id, h, rqst_methods)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,36 @@
|
||||
note
|
||||
description: "Summary description for {REST_REQUEST_URI_ROUTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_URI_ROUTER_I [H -> REST_REQUEST_HANDLER [C], C -> REST_REQUEST_URI_HANDLER_CONTEXT create make end]
|
||||
|
||||
inherit
|
||||
WSF_URI_ROUTER_I [H, C]
|
||||
|
||||
REST_REQUEST_ROUTER [H, C]
|
||||
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Mapping
|
||||
|
||||
-- map_agent_with_request_methods (a_id: READABLE_STRING_8; a_action: like {REST_REQUEST_AGENT_HANDLER}.action; rqst_methods: detachable ARRAY [READABLE_STRING_8])
|
||||
-- do
|
||||
-- Precursor (a_id, a_action, rqst_methods)
|
||||
-- end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,33 @@
|
||||
note
|
||||
description: "Summary description for {DEFAULT_REST_REQUEST_URI_ROUTING_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_URI_ROUTING_HANDLER
|
||||
|
||||
inherit
|
||||
REST_REQUEST_URI_ROUTING_HANDLER_I [REST_REQUEST_HANDLER [REST_REQUEST_URI_HANDLER_CONTEXT], REST_REQUEST_URI_HANDLER_CONTEXT]
|
||||
redefine
|
||||
router
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Routing
|
||||
|
||||
router: REST_REQUEST_URI_ROUTER
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,64 @@
|
||||
note
|
||||
description: "Summary description for {WSF_ROUTING_HANDLER }."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_URI_ROUTING_HANDLER_I [H -> REST_REQUEST_HANDLER [C],
|
||||
C -> REST_REQUEST_URI_HANDLER_CONTEXT create make end]
|
||||
|
||||
inherit
|
||||
WSF_URI_ROUTING_HANDLER_I [H, C]
|
||||
redefine
|
||||
router,
|
||||
execute
|
||||
end
|
||||
|
||||
REST_REQUEST_HANDLER [C]
|
||||
undefine
|
||||
execute
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Status report
|
||||
|
||||
authentication_required (req: WSF_REQUEST): BOOLEAN
|
||||
do
|
||||
Result := internal_authentication_required
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
internal_authentication_required: BOOLEAN
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
Precursor {WSF_URI_ROUTING_HANDLER_I} (ctx, req, res)
|
||||
end
|
||||
|
||||
execute_application (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
check should_not_occur: False end
|
||||
end
|
||||
|
||||
|
||||
feature {NONE} -- Routing
|
||||
|
||||
router: REST_REQUEST_URI_ROUTER_I [H, C]
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
30
draft/library/server/request/rest/src/uri/rest_uri_service.e
Normal file
30
draft/library/server/request/rest/src/uri/rest_uri_service.e
Normal file
@@ -0,0 +1,30 @@
|
||||
note
|
||||
description: "Summary description for {DEFAULT_REST_URI_SERVICE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
REST_URI_SERVICE
|
||||
|
||||
inherit
|
||||
REST_SERVICE_I [REST_REQUEST_HANDLER [REST_REQUEST_URI_HANDLER_CONTEXT], REST_REQUEST_URI_HANDLER_CONTEXT]
|
||||
redefine
|
||||
router
|
||||
end
|
||||
|
||||
feature -- Router
|
||||
|
||||
router: REST_REQUEST_URI_ROUTER
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
note
|
||||
description: "Summary description for {DEFAULT_REST_REQUEST_URI_TEMPLATE_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
REST_REQUEST_URI_TEMPLATE_HANDLER
|
||||
|
||||
inherit
|
||||
REST_REQUEST_HANDLER [REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT]
|
||||
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,28 @@
|
||||
note
|
||||
description: "Summary description for {WSF_URI_TEMPLATE_HANDLER_CONTEXT}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT
|
||||
|
||||
inherit
|
||||
WSF_URI_TEMPLATE_HANDLER_CONTEXT
|
||||
|
||||
REST_REQUEST_HANDLER_CONTEXT
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,41 @@
|
||||
note
|
||||
description: "Summary description for {DEFAULT_REST_REQUEST_URI_TEMPLATE_ROUTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_URI_TEMPLATE_ROUTER
|
||||
|
||||
inherit
|
||||
REST_REQUEST_URI_TEMPLATE_ROUTER_I [REST_REQUEST_HANDLER [REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT], REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT]
|
||||
redefine
|
||||
map_agent_with_request_methods
|
||||
end
|
||||
|
||||
create
|
||||
make,
|
||||
make_with_base_url
|
||||
|
||||
feature -- Mapping
|
||||
|
||||
map_agent_with_request_methods (a_id: READABLE_STRING_8; a_action: PROCEDURE [ANY, TUPLE [ctx: REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE]];
|
||||
rqst_methods: detachable ARRAY [READABLE_STRING_8])
|
||||
local
|
||||
h: REST_REQUEST_AGENT_HANDLER [REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT]
|
||||
do
|
||||
create h.make (a_action)
|
||||
map_with_request_methods (a_id, h, rqst_methods)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,29 @@
|
||||
note
|
||||
description: "Summary description for {REST_REQUEST_URI_TEMPLATE_ROUTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_URI_TEMPLATE_ROUTER_I [H -> REST_REQUEST_HANDLER [C], C -> REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT create make end]
|
||||
|
||||
inherit
|
||||
WSF_URI_TEMPLATE_ROUTER_I [H, C]
|
||||
|
||||
REST_REQUEST_ROUTER [H, C]
|
||||
|
||||
create
|
||||
make,
|
||||
make_with_base_url
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,34 @@
|
||||
note
|
||||
description: "Summary description for {DEFAULT_REST_REQUEST_URI_TEMPLATE_ROUTING_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_URI_TEMPLATE_ROUTING_HANDLER
|
||||
|
||||
inherit
|
||||
REST_REQUEST_URI_TEMPLATE_ROUTING_HANDLER_I [REST_REQUEST_HANDLER [REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT], REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT]
|
||||
redefine
|
||||
router
|
||||
end
|
||||
|
||||
create
|
||||
make,
|
||||
make_with_base_url
|
||||
|
||||
feature {NONE} -- Routing
|
||||
|
||||
router: REST_REQUEST_URI_TEMPLATE_ROUTER
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,66 @@
|
||||
note
|
||||
description: "Summary description for {WSF_ROUTING_HANDLER }."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_REQUEST_URI_TEMPLATE_ROUTING_HANDLER_I [H -> REST_REQUEST_HANDLER [C],
|
||||
C -> REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT create make end]
|
||||
|
||||
inherit
|
||||
WSF_URI_TEMPLATE_ROUTING_HANDLER_I [H, C]
|
||||
redefine
|
||||
router,
|
||||
execute
|
||||
end
|
||||
|
||||
REST_REQUEST_HANDLER [C]
|
||||
undefine
|
||||
execute
|
||||
end
|
||||
|
||||
create
|
||||
make,
|
||||
make_with_base_url
|
||||
|
||||
feature -- Status report
|
||||
|
||||
authentication_required (req: WSF_REQUEST): BOOLEAN
|
||||
do
|
||||
Result := internal_authentication_required
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
internal_authentication_required: BOOLEAN
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
pre_execute (ctx, req, res)
|
||||
Precursor {WSF_URI_TEMPLATE_ROUTING_HANDLER_I} (ctx, req, res)
|
||||
post_execute (ctx, req, res)
|
||||
end
|
||||
|
||||
execute_application (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
check should_not_occur: False end
|
||||
end
|
||||
|
||||
feature {NONE} -- Routing
|
||||
|
||||
router: REST_REQUEST_URI_TEMPLATE_ROUTER_I [H, C]
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2012, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,30 @@
|
||||
note
|
||||
description: "Summary description for {DEFAULT_URI_TEMPLATE_REST_SERVICE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
REST_URI_TEMPLATE_SERVICE
|
||||
|
||||
inherit
|
||||
REST_SERVICE_I [REST_REQUEST_HANDLER [REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT], REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT]
|
||||
redefine
|
||||
router
|
||||
end
|
||||
|
||||
feature -- Router
|
||||
|
||||
router: REST_REQUEST_URI_TEMPLATE_ROUTER
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
26
draft/library/server/request/rest/tests/htdocs/.htaccess
Normal file
26
draft/library/server/request/rest/tests/htdocs/.htaccess
Normal file
@@ -0,0 +1,26 @@
|
||||
Options Indexes FollowSymLinks ExecCGI
|
||||
|
||||
<IfModule mod_fcgid.c>
|
||||
AddHandler fcgid-script .eapp
|
||||
FcgidWrapper c:/_dev/Dev-Process/web-framework/library/server/request/rest/tests/htdocs/../EIFGENs/rest_sample_cgi/W_code/sample.exe .eapp
|
||||
|
||||
</IfModule>
|
||||
|
||||
Options +ExecCGI
|
||||
AddHandler cgi-script exe
|
||||
|
||||
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine on
|
||||
RewriteBase /REST
|
||||
|
||||
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_URI} !=/favicon.ico
|
||||
RewriteRule ^(.*)$ sample.eapp/$1
|
||||
|
||||
# To let CGI app knows about HTTP_AUTHORIZATION
|
||||
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
|
||||
|
||||
</IfModule>
|
||||
31
draft/library/server/request/rest/tests/htdocs/README.txt
Normal file
31
draft/library/server/request/rest/tests/htdocs/README.txt
Normal file
@@ -0,0 +1,31 @@
|
||||
= How to make this works with Apache =
|
||||
* In the apache's configuration file, be sure to add the following, or similar
|
||||
LoadModule fcgid_module modules/mod_fcgid.so
|
||||
<IfModule mod_fcgid.c>
|
||||
FcgidIdleTimeout 60
|
||||
FcgidBusyScanInterval 120
|
||||
FcgidProcessLifeTime 1600
|
||||
#7200
|
||||
FcgidMaxProcesses 5
|
||||
FcgidMaxProcessesPerClass 100
|
||||
FcgidMinProcessesPerClass 100
|
||||
FcgidConnectTimeout 8
|
||||
FcgidIOTimeout 3000
|
||||
FcgidBusyTimeout 3200
|
||||
FcgidMaxRequestLen 10000000
|
||||
FcgidPassHeader Authorization
|
||||
</IfModule>
|
||||
|
||||
|
||||
alias /REST/ "c:/_dev/Dev-Process/src/server/htdocs/"
|
||||
<directory "c:/_dev/Dev-Process/src/server/htdocs/">
|
||||
AllowOverride All
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
</directory>
|
||||
|
||||
* You can use <Location>, but then the AllowOverride All, should be somewhere else, since <Location> does not allow it.
|
||||
|
||||
* And then, check the .htaccess from this folder for additional settings (but required)
|
||||
|
||||
|
||||
24
draft/library/server/request/rest/tests/htdocs/build.eant
Normal file
24
draft/library/server/request/rest/tests/htdocs/build.eant
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<project name="update_htdocs" default="menu">
|
||||
|
||||
<target name="menu">
|
||||
<echo message="1 - update_cgi_link" />
|
||||
<echo message="2 - update_htaccess" />
|
||||
<echo message="0 - quit" />
|
||||
<input message="Your choice :" variable="answer" defaultvalue="0" validargs="1,2,0" answer_required="true" />
|
||||
<geant target="update_cgi_link" if="$answer=1" />
|
||||
<geant target="update_htaccess" if="$answer=2" />
|
||||
</target>
|
||||
|
||||
<target name="update_cgi_link">
|
||||
<echo message="Update CGI link" />
|
||||
<exec executable="junction CGI ..\EIFGENs\rest_sample_cgi\W_code" accept_errors="true" exit_code_variable="return_code" dir="$cwd" />
|
||||
</target>
|
||||
|
||||
<target name="update_htaccess">
|
||||
<replace file="htaccess" to_file=".htaccess" token="##SAMPLE-CGI-DIR##" replace="$cwd/../EIFGENs/rest_sample_cgi/W_code" flags="g" />
|
||||
<replace file=".htaccess" to_file=".htaccess" token="\" replace="/" flags="g" />
|
||||
</target>
|
||||
|
||||
</project>
|
||||
26
draft/library/server/request/rest/tests/htdocs/htaccess
Normal file
26
draft/library/server/request/rest/tests/htdocs/htaccess
Normal file
@@ -0,0 +1,26 @@
|
||||
Options Indexes FollowSymLinks ExecCGI
|
||||
|
||||
<IfModule mod_fcgid.c>
|
||||
AddHandler fcgid-script .eapp
|
||||
FcgidWrapper ##SAMPLE-CGI-DIR##/sample.exe .eapp
|
||||
|
||||
</IfModule>
|
||||
|
||||
Options +ExecCGI
|
||||
AddHandler cgi-script exe
|
||||
|
||||
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine on
|
||||
RewriteBase /REST
|
||||
|
||||
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_URI} !=/favicon.ico
|
||||
RewriteRule ^(.*)$ sample.eapp/$1
|
||||
|
||||
# To let CGI app knows about HTTP_AUTHORIZATION
|
||||
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
|
||||
|
||||
</IfModule>
|
||||
55
draft/library/server/request/rest/tests/sample.ecf
Normal file
55
draft/library/server/request/rest/tests/sample.ecf
Normal file
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="common" uuid="4E02DF53-9DF0-44B6-B8A8-7554E0B94957">
|
||||
<target name="common">
|
||||
<file_rule>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/\.git$</exclude>
|
||||
<exclude>/\.svn$</exclude>
|
||||
</file_rule>
|
||||
<option cat_call_detection="false" is_attached_by_default="true" void_safety="all" syntax="provisional">
|
||||
</option>
|
||||
<setting name="console_application" value="true"/>
|
||||
<setting name="concurrency" value="thread"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="rest" location="..\rest-safe.ecf" readonly="false"/>
|
||||
<library name="wsf" location="..\..\..\..\..\..\library\server\wsf\wsf-safe.ecf" readonly="false"/>
|
||||
<library name="http" location="..\..\..\..\..\..\library\protocol\http\http-safe.ecf" readonly="false"/>
|
||||
</target>
|
||||
<target name="sample_fcgi" extends="common">
|
||||
<root class="APP_SERVER" feature="make"/>
|
||||
<setting name="executable_name" value="sample"/>
|
||||
<library name="ewsgi_fcgi" location="..\..\..\..\..\..\library\server\ewsgi\connectors\libfcgi\libfcgi-safe.ecf" readonly="false"/>
|
||||
<cluster name="src" location=".\src\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/gateway$</exclude>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
<cluster name="gateway" location=".\src\gateway\fcgi\" recursive="true"/>
|
||||
</target>
|
||||
<target name="sample_cgi" extends="common">
|
||||
<root class="APP_SERVER" feature="make"/>
|
||||
<setting name="executable_name" value="sample"/>
|
||||
<library name="ewsgi_cgi" location="..\..\..\..\..\..\library\server\ewsgi\connectors\cgi\cgi-safe.ecf" readonly="false"/>
|
||||
<cluster name="src" location=".\src\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/gateway$</exclude>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
<cluster name="gateway" location=".\src\gateway\cgi\" recursive="true"/>
|
||||
|
||||
</target>
|
||||
<target name="sample_nino" extends="common">
|
||||
<root class="APP_SERVER" feature="make"/>
|
||||
<setting name="executable_name" value="sample"/>
|
||||
<library name="ewsgi_nino" location="..\..\..\..\..\..\library\server\ewsgi\connectors\nino\nino-safe.ecf" readonly="false"/>
|
||||
<library name="default_nino" location="..\..\..\..\..\..\library\server\wsf\default\nino-safe.ecf" readonly="false"/>
|
||||
|
||||
|
||||
<cluster name="src" location=".\src\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/gateway$</exclude>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
<cluster name="gateway" location=".\src\gateway\nino\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
@@ -0,0 +1,112 @@
|
||||
note
|
||||
description: "Summary description for {APP_ACCOUNT_VERIFY_CREDENTIAL}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
APP_ACCOUNT_VERIFY_CREDENTIAL
|
||||
|
||||
inherit
|
||||
APP_REQUEST_HANDLER
|
||||
redefine
|
||||
initialize,
|
||||
execute_unauthorized
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
description := "Verify credentials"
|
||||
initialize
|
||||
end
|
||||
|
||||
initialize
|
||||
do
|
||||
Precursor
|
||||
enable_request_method_get
|
||||
enable_format_json
|
||||
enable_format_xml
|
||||
enable_format_text
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
authentication_required (req: WSF_REQUEST): BOOLEAN
|
||||
do
|
||||
Result := True
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute_unauthorized (a_hdl_context: APP_REQUEST_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
local
|
||||
s: STRING
|
||||
lst: LIST [STRING]
|
||||
do
|
||||
res.set_status_code ({HTTP_STATUS_CODE}.unauthorized)
|
||||
res.put_header ({HTTP_STATUS_CODE}.unauthorized, <<["WWW-Authenticate", "Basic realm=%"My Silly demo auth, password must be the same as login such as foo:foo%""]>>)
|
||||
res.put_string ("Unauthorized")
|
||||
end
|
||||
|
||||
execute_application (ctx: APP_REQUEST_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
local
|
||||
l_full: BOOLEAN
|
||||
h: HTTP_HEADER
|
||||
l_login: STRING_8
|
||||
s: STRING
|
||||
content_type_supported: ARRAY [STRING]
|
||||
l_format_id: INTEGER
|
||||
do
|
||||
content_type_supported := <<{HTTP_CONSTANTS}.application_json, {HTTP_CONSTANTS}.text_xml, {HTTP_CONSTANTS}.text_plain>>
|
||||
l_format_id := ctx.request_accepted_format_id ("format", content_type_supported)
|
||||
if authenticated (ctx) then
|
||||
l_full := attached ctx.query_parameter ("details") as v and then v.is_case_insensitive_equal ("true")
|
||||
if attached authenticated_identifier (ctx) as log then
|
||||
l_login := log.as_string_8
|
||||
|
||||
create h.make
|
||||
|
||||
create s.make_empty
|
||||
inspect l_format_id
|
||||
when {HTTP_FORMAT_CONSTANTS}.json then
|
||||
h.put_content_type_text_plain
|
||||
s.append_string ("{ %"login%": %"" + l_login + "%" }%N")
|
||||
when {HTTP_FORMAT_CONSTANTS}.xml then
|
||||
h.put_content_type_text_xml
|
||||
s.append_string ("<login>" + l_login + "</login>%N")
|
||||
when {HTTP_FORMAT_CONSTANTS}.text then -- Default
|
||||
h.put_content_type_text_plain
|
||||
s.append_string ("login: " + l_login + "%N")
|
||||
else
|
||||
execute_content_type_not_allowed (req, res, content_type_supported,
|
||||
<<{HTTP_FORMAT_CONSTANTS}.json_name, {HTTP_FORMAT_CONSTANTS}.html_name, {HTTP_FORMAT_CONSTANTS}.xml_name, {HTTP_FORMAT_CONSTANTS}.text_name>>
|
||||
)
|
||||
end
|
||||
if not s.is_empty then
|
||||
res.set_status_code ({HTTP_STATUS_CODE}.ok)
|
||||
res.put_header_text (h.string)
|
||||
res.put_string (s)
|
||||
end
|
||||
else
|
||||
send_error (ctx.path, 0, "User/password unknown", Void, ctx, req, res)
|
||||
end
|
||||
else
|
||||
send_error (ctx.path, 0, "Authentication rejected", Void, ctx, req, res)
|
||||
end
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
97
draft/library/server/request/rest/tests/src/app/app_test.e
Normal file
97
draft/library/server/request/rest/tests/src/app/app_test.e
Normal file
@@ -0,0 +1,97 @@
|
||||
note
|
||||
description: "Summary description for {APP_TEST}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
APP_TEST
|
||||
|
||||
inherit
|
||||
APP_REQUEST_HANDLER
|
||||
redefine
|
||||
initialize
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
description := "Return a simple test output "
|
||||
initialize
|
||||
end
|
||||
|
||||
initialize
|
||||
do
|
||||
Precursor
|
||||
enable_request_method_get
|
||||
enable_format_text
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
authentication_required (req: WSF_REQUEST): BOOLEAN
|
||||
do
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute_application (ctx: APP_REQUEST_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
-- Execute request handler
|
||||
local
|
||||
s: STRING
|
||||
h: HTTP_HEADER
|
||||
do
|
||||
create h.make
|
||||
h.put_content_type_text_plain
|
||||
|
||||
create s.make_empty
|
||||
s.append_string ("test")
|
||||
if attached {WSF_STRING} req.meta_variable ("REQUEST_COUNT") as l_request_count_val then
|
||||
s.append_string ("(request_count="+ l_request_count_val.string +")%N")
|
||||
end
|
||||
|
||||
-- ctx.request_format_id ("format", Void)
|
||||
|
||||
if attached ctx.request_accepted_format ("format", Void) as l_format then
|
||||
s.append_string (" format=" + l_format + "%N")
|
||||
end
|
||||
|
||||
if attached ctx.string_item ("op") as l_op then
|
||||
s.append_string (" op=" + l_op)
|
||||
if l_op.same_string ("crash") then
|
||||
(create {DEVELOPER_EXCEPTION}).raise
|
||||
elseif l_op.starts_with ("env") then
|
||||
s.append_string ("%N%NAll variables:")
|
||||
s.append (wgi_value_iteration_to_string (req.items, False))
|
||||
s.append_string ("<br/>script_url(%"" + req.path_info + "%")=" + ctx.script_url (req.path_info) + "%N")
|
||||
-- if attached ctx.http_authorization_login_password as t then
|
||||
-- s.append_string ("Check login=" + t.login + "<br/>%N")
|
||||
-- end
|
||||
if authenticated (ctx) and then attached authenticated_identifier (ctx) as l_login then
|
||||
s.append_string ("Authenticated: login=" + l_login.as_string_8 + "<br/>%N")
|
||||
end
|
||||
end
|
||||
else
|
||||
s.append ("%N Try " + ctx.script_absolute_url (req.path_info + "?op=env") + " to display all variables%N")
|
||||
s.append ("%N Try " + ctx.script_absolute_url (req.path_info + "?op=crash") + " to demonstrate exception trace%N")
|
||||
end
|
||||
|
||||
res.set_status_code (200)
|
||||
res.put_header_text (h.string)
|
||||
res.put_string (s)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
149
draft/library/server/request/rest/tests/src/app_server.e
Normal file
149
draft/library/server/request/rest/tests/src/app_server.e
Normal file
@@ -0,0 +1,149 @@
|
||||
note
|
||||
description: "Summary description for {APP_SERVER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
APP_SERVER
|
||||
|
||||
inherit
|
||||
APP_SERVICE
|
||||
redefine
|
||||
execute
|
||||
end
|
||||
|
||||
REST_SERVICE_GATEWAY
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
-- Initialize `Current'.
|
||||
do
|
||||
initialize_router
|
||||
build_gateway_and_launch
|
||||
end
|
||||
|
||||
feature {NONE} -- Handlers
|
||||
|
||||
create_router
|
||||
-- Create `router'
|
||||
do
|
||||
create router.make (5)
|
||||
end
|
||||
|
||||
setup_router
|
||||
local
|
||||
h: APP_REQUEST_HANDLER
|
||||
rah: APP_REQUEST_AGENT_HANDLER
|
||||
gh: APP_REQUEST_ROUTING_HANDLER
|
||||
do
|
||||
create {APP_ACCOUNT_VERIFY_CREDENTIAL} h.make
|
||||
router.map ("/account/verify_credentials", h)
|
||||
router.map ("/account/verify_credentials.{format}", h)
|
||||
|
||||
|
||||
create {APP_TEST} h.make
|
||||
|
||||
create gh.make (4)
|
||||
router.map ("/test", gh)
|
||||
-- gh.map ("/test", h)
|
||||
gh.map ("/test/{op}", h)
|
||||
gh.map ("/test.{format}", h)
|
||||
gh.map ("/test.{format}/{op}", h)
|
||||
|
||||
|
||||
create rah.make (agent execute_exit_application)
|
||||
h := rah
|
||||
h.set_description ("tell the REST server to exit (in FCGI context, this is used to reload the FCGI server)")
|
||||
h.enable_request_method_get
|
||||
h.enable_format_text
|
||||
router.map ("/debug/exit", h)
|
||||
router.map ("/debug/exit.{format}", h)
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
do
|
||||
request_count := request_count + 1
|
||||
Precursor (req, res)
|
||||
end
|
||||
|
||||
execute_default (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
local
|
||||
rqst_uri: detachable STRING
|
||||
l_path_info: detachable STRING
|
||||
h: HTTP_HEADER
|
||||
s: STRING
|
||||
l_redir_url: STRING
|
||||
do
|
||||
create h.make
|
||||
-- h.put_refresh (ctx.script_url ("/doc"), 2)
|
||||
l_redir_url := "/doc"
|
||||
h.put_refresh (l_redir_url, 2)
|
||||
h.put_content_type_text_html
|
||||
create s.make_empty
|
||||
s := "Request [" + req.path_info + "] is not available. <br/>%N";
|
||||
s.append ("You are being redirected to <a href=%"" + l_redir_url + "%">/doc</a> in 2 seconds ...%N")
|
||||
h.put_content_length (s.count)
|
||||
res.set_status_code ({HTTP_STATUS_CODE}.temp_redirect)
|
||||
res.put_header_text (h.string)
|
||||
res.put_string (s)
|
||||
end
|
||||
|
||||
request_count: INTEGER
|
||||
|
||||
-- execute_rescue (ctx: like new_request_context)
|
||||
-- -- Execute the default rescue behavior
|
||||
-- do
|
||||
-- execute_exception_trace (ctx)
|
||||
-- end
|
||||
|
||||
feature -- Implementation
|
||||
|
||||
-- execute_exception_trace (ctx: like new_request_context)
|
||||
-- local
|
||||
-- h: HTTP_HEADER
|
||||
-- s: STRING
|
||||
-- do
|
||||
-- create h.make
|
||||
-- h.put_content_type_text_plain
|
||||
-- ctx.output.put_string (h.string)
|
||||
-- ctx.output.put_string ("Error occurred .. rq="+ request_count.out +"%N")
|
||||
|
||||
-- if attached (create {EXCEPTIONS}).exception_trace as l_trace then
|
||||
-- ctx.output.put_string ("<pre>" + l_trace + "</pre>")
|
||||
-- end
|
||||
-- h.recycle
|
||||
-- exit_with_code (-1)
|
||||
-- end
|
||||
|
||||
execute_exit_application (ctx: APP_REQUEST_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
local
|
||||
s: STRING
|
||||
do
|
||||
res.set_status_code (200)
|
||||
res.put_header (200, <<["Content-Type", "text/html"]>>)
|
||||
|
||||
create s.make_empty
|
||||
s.append_string ("Exited")
|
||||
s.append_string (" <a href=%"" + ctx.script_url ("/") + "%">start again</a>%N")
|
||||
res.put_string (s)
|
||||
exit_with_code (0)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
deferred class
|
||||
REST_SERVICE_GATEWAY
|
||||
|
||||
inherit
|
||||
WSF_SERVICE
|
||||
|
||||
feature -- Access
|
||||
|
||||
build_gateway_and_launch
|
||||
local
|
||||
cgi: WGI_CGI_CONNECTOR
|
||||
do
|
||||
create cgi.make (to_wgi_service)
|
||||
cgi.launch
|
||||
end
|
||||
|
||||
gateway_name: STRING = "CGI"
|
||||
|
||||
exit_with_code (a_code: INTEGER)
|
||||
do
|
||||
(create {EXCEPTIONS}).die (a_code)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,35 @@
|
||||
deferred class
|
||||
REST_SERVICE_GATEWAY
|
||||
|
||||
inherit
|
||||
WSF_SERVICE
|
||||
|
||||
feature -- Access
|
||||
|
||||
build_gateway_and_launch
|
||||
local
|
||||
libfcgi: WGI_LIBFCGI_CONNECTOR
|
||||
do
|
||||
create libfcgi.make (to_wgi_service)
|
||||
libfcgi.launch
|
||||
end
|
||||
|
||||
gateway_name: STRING = "libFCGI"
|
||||
|
||||
exit_with_code (a_code: INTEGER)
|
||||
do
|
||||
(create {EXCEPTIONS}).die (a_code)
|
||||
end
|
||||
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,44 @@
|
||||
deferred class
|
||||
REST_SERVICE_GATEWAY
|
||||
|
||||
inherit
|
||||
WSF_SERVICE
|
||||
|
||||
feature -- Access
|
||||
|
||||
build_gateway_and_launch
|
||||
local
|
||||
app: NINO_SERVICE
|
||||
port_number: INTEGER
|
||||
base_url: STRING
|
||||
do
|
||||
port_number := 8080
|
||||
base_url := ""
|
||||
debug ("nino")
|
||||
print ("Example: start a Nino web server on port " + port_number.out +
|
||||
", %Nand reply Hello World for any request such as http://localhost:" + port_number.out + "/" + base_url + "%N")
|
||||
end
|
||||
create app.make_custom (to_wgi_service, base_url)
|
||||
app.force_single_threaded
|
||||
|
||||
app.listen (port_number)
|
||||
end
|
||||
|
||||
gateway_name: STRING = "NINO"
|
||||
|
||||
exit_with_code (a_code: INTEGER)
|
||||
do
|
||||
(create {EXCEPTIONS}).die (a_code)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,35 @@
|
||||
note
|
||||
description: "Summary description for REST_REQUEST_AGENT_HANDLER."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
APP_REQUEST_AGENT_HANDLER
|
||||
|
||||
inherit
|
||||
APP_REQUEST_HANDLER
|
||||
undefine
|
||||
execute, pre_execute, post_execute
|
||||
end
|
||||
|
||||
REST_REQUEST_AGENT_HANDLER [APP_REQUEST_HANDLER_CONTEXT]
|
||||
undefine
|
||||
authenticated
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,85 @@
|
||||
note
|
||||
description : "Objects that ..."
|
||||
date : "$Date$"
|
||||
revision : "$Revision$"
|
||||
|
||||
deferred class
|
||||
APP_REQUEST_HANDLER
|
||||
|
||||
inherit
|
||||
REST_REQUEST_HANDLER [APP_REQUEST_HANDLER_CONTEXT]
|
||||
redefine
|
||||
authenticated
|
||||
end
|
||||
|
||||
APP_REQUEST_HELPER
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
initialize
|
||||
-- Initialize various attributes
|
||||
do
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
wgi_value_iteration_to_string (v: ITERABLE [WSF_VALUE]; using_pre: BOOLEAN): STRING_8
|
||||
do
|
||||
create Result.make (100)
|
||||
if using_pre then
|
||||
Result.append ("<pre>")
|
||||
end
|
||||
across
|
||||
v as cur
|
||||
loop
|
||||
Result.append_string (cur.item.name.as_string_8 + " = " + cur.item.string_representation.as_string_8 + "%N")
|
||||
end
|
||||
if using_pre then
|
||||
Result.append ("</pre>")
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Auth
|
||||
|
||||
authenticated (ctx: APP_REQUEST_HANDLER_CONTEXT): BOOLEAN
|
||||
-- Is authenticated?
|
||||
do
|
||||
--| To redefine if needed
|
||||
if attached ctx.request.http_authorization as l_http_authorization then
|
||||
Result := True
|
||||
end
|
||||
end
|
||||
|
||||
authenticated_identifier (ctx: APP_REQUEST_HANDLER_CONTEXT): detachable READABLE_STRING_32
|
||||
do
|
||||
if attached ctx.request.http_authorization as l_http_authorization then
|
||||
Result := "foo" -- Implement it as you want
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Helpers
|
||||
|
||||
format_id (s: detachable STRING): INTEGER
|
||||
do
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.text
|
||||
if s /= Void then
|
||||
Result := format_constants.format_id (s)
|
||||
end
|
||||
end
|
||||
|
||||
exit_with_code (a_code: INTEGER)
|
||||
do
|
||||
(create {EXCEPTIONS}).die (a_code)
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,26 @@
|
||||
note
|
||||
description : "Objects that ..."
|
||||
author : "$Author$"
|
||||
date : "$Date$"
|
||||
revision : "$Revision$"
|
||||
|
||||
class
|
||||
APP_REQUEST_HANDLER_CONTEXT
|
||||
|
||||
inherit
|
||||
REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,101 @@
|
||||
note
|
||||
description: "Summary description for {APP_REQUEST_HELPER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
APP_REQUEST_HELPER
|
||||
|
||||
feature -- Helpers
|
||||
|
||||
send_error (a_path: STRING; a_error_id: INTEGER; a_error_name: STRING; a_error_message: detachable STRING; ctx: APP_REQUEST_HANDLER_CONTEXT; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
local
|
||||
s: STRING
|
||||
i,nb: INTEGER
|
||||
rep_data: REST_RESPONSE
|
||||
do
|
||||
res.set_status_code ({HTTP_STATUS_CODE}.expectation_failed)
|
||||
create rep_data.make (a_path)
|
||||
rep_data.headers.put_content_type_text_plain
|
||||
|
||||
create s.make_empty
|
||||
inspect ctx.accepted_format_id
|
||||
when {HTTP_FORMAT_CONSTANTS}.json then
|
||||
rep_data.headers.put_content_type_text_plain
|
||||
s := "{%"application%": %"" + a_path + "%""
|
||||
s.append_string (", %"error%": {")
|
||||
s.append_string ("%"id%": " + a_error_id.out)
|
||||
s.append_string (",%"name%": %"" + a_error_name + "%"")
|
||||
if a_error_message /= Void then
|
||||
s.append_string (",%"message%": %"")
|
||||
|
||||
if a_error_message.has ('%N') then
|
||||
from
|
||||
i := s.count
|
||||
s.append_string (a_error_message)
|
||||
nb := s.count
|
||||
until
|
||||
i > nb
|
||||
loop
|
||||
inspect s[i]
|
||||
when '%R' then
|
||||
if s.valid_index (i+1) and then s[i+1] = '%N' then
|
||||
s[i] := '\'
|
||||
s[i+1] := 'n'
|
||||
i := i + 1
|
||||
end
|
||||
when '%N' then
|
||||
s.insert_character ('\', i)
|
||||
s[i] := 'n'
|
||||
else
|
||||
end
|
||||
i := i + 1
|
||||
end
|
||||
else
|
||||
s.append_string (a_error_message)
|
||||
end
|
||||
s.append_string ("%"")
|
||||
end
|
||||
|
||||
s.append_string ("}") -- end error
|
||||
s.append_string ("}") -- end global object
|
||||
rep_data.set_message (s)
|
||||
when {HTTP_FORMAT_CONSTANTS}.xml then
|
||||
rep_data.headers.put_content_type_text_xml
|
||||
s := "<application path=%"" + a_path + "%"><error id=%"" + a_error_id.out + "%" name=%""+ a_error_name +"%">"
|
||||
if a_error_message /= Void then
|
||||
s.append_string (a_error_message)
|
||||
end
|
||||
s.append_string ("</error></application>")
|
||||
rep_data.set_message (s)
|
||||
when {HTTP_FORMAT_CONSTANTS}.html then
|
||||
rep_data.headers.put_content_type_text_html
|
||||
s := "<strong>application</strong>: " + a_path + "<br/>%N<strong>Error</strong> (" + a_error_id.out + ") %"" + a_error_name + "%"<br/>%N"
|
||||
if a_error_message /= Void then
|
||||
s.append_string ("<blockquote>" + a_error_message + "</blockquote>")
|
||||
end
|
||||
rep_data.set_message (s)
|
||||
when {HTTP_FORMAT_CONSTANTS}.text then -- Default
|
||||
s := "Application: " + a_path + "<br/>%N"
|
||||
s.append_string ("Error (" + a_error_id.out + ") %"" + a_error_name + "%"%N")
|
||||
if a_error_message /= Void then
|
||||
s.append_string ("%T" + a_error_message + "%N")
|
||||
end
|
||||
rep_data.set_message (s)
|
||||
end
|
||||
res.send (rep_data)
|
||||
rep_data.recycle
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,27 @@
|
||||
note
|
||||
description: "Summary description for {REST_REQUEST_URI_TEMPLATE_ROUTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
APP_REQUEST_ROUTER
|
||||
|
||||
inherit
|
||||
REST_REQUEST_URI_TEMPLATE_ROUTER_I [APP_REQUEST_HANDLER, APP_REQUEST_HANDLER_CONTEXT]
|
||||
|
||||
create
|
||||
make,
|
||||
make_with_base_url
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,42 @@
|
||||
note
|
||||
description: "Summary description for {APP_REQUEST_ROUTING_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
APP_REQUEST_ROUTING_HANDLER
|
||||
|
||||
inherit
|
||||
APP_REQUEST_HANDLER
|
||||
undefine
|
||||
execute
|
||||
end
|
||||
|
||||
REST_REQUEST_URI_TEMPLATE_ROUTING_HANDLER_I [APP_REQUEST_HANDLER, APP_REQUEST_HANDLER_CONTEXT]
|
||||
undefine
|
||||
authenticated,
|
||||
pre_execute,
|
||||
post_execute
|
||||
redefine
|
||||
router
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Routing
|
||||
|
||||
router: APP_REQUEST_ROUTER
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,30 @@
|
||||
note
|
||||
description: "Summary description for {APP_SERVICE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
APP_SERVICE
|
||||
|
||||
inherit
|
||||
REST_SERVICE_I [APP_REQUEST_HANDLER, APP_REQUEST_HANDLER_CONTEXT]
|
||||
redefine
|
||||
router
|
||||
end
|
||||
|
||||
feature {NONE} -- Router
|
||||
|
||||
router: APP_REQUEST_ROUTER
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
7
draft/library/text/filter/README.md
Normal file
7
draft/library/text/filter/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
Support for various text filters such as
|
||||
|
||||
* [wikitext](http://en.wikipedia.org/wiki/Wiki_markup)
|
||||
* [Markdown](http://en.wikipedia.org/wiki/Markdown)
|
||||
* ...
|
||||
|
||||
Anyone wanting to contribute is welcome
|
||||
7
draft/library/text/template/README.md
Normal file
7
draft/library/text/template/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
We could add libraries for template engines such as
|
||||
|
||||
* [Velocity](http://en.wikipedia.org/wiki/Apache_Velocity)
|
||||
* [Smarty](http://en.wikipedia.org/wiki/Smarty)
|
||||
* ...
|
||||
|
||||
Anyone wanting to contribute is welcome
|
||||
11
examples/restbucksCRUD/client/README.txt
Normal file
11
examples/restbucksCRUD/client/README.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Make sure to have the Clib generated in the related cURL library
|
||||
|
||||
- if you use EiffelStudio >= 7.0
|
||||
check %ISE_LIBRARY%\library\cURL\spec\%ISE_C_COMPILER%\$ISE_PLATFORM
|
||||
or $ISE_LIBRARY/library/cURL/spec/$ISE_PLATFORM
|
||||
|
||||
- otherwise if you use earlier version
|
||||
check under ext/ise_library/curl/spec/...
|
||||
|
||||
And on Windows, be sure to get the libcurl.dll from %ISE_LIBRARY%\studio\spec\%ISE_PLATFORM%\bin\libcurl.dll
|
||||
|
||||
19
examples/restbucksCRUD/client/client-safe.ecf
Normal file
19
examples/restbucksCRUD/client/client-safe.ecf
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-9-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-9-0 http://www.eiffel.com/developers/xml/configuration-1-9-0.xsd" name="client" uuid="D0059CEB-5F5C-4D21-8C71-842BD0F88468">
|
||||
<target name="client">
|
||||
<root class="RESTBUCK_CLIENT" feature="make"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all" syntax="standard">
|
||||
</option>
|
||||
<setting name="concurrency" value="thread"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="http_client" location="..\..\..\library\client\http_client\http_client-safe.ecf" readonly="false"/>
|
||||
<library name="json" location="..\..\..\contrib\library\text\parser\json\library\json-safe.ecf" readonly="false"/>
|
||||
<library name="thread" location="$ISE_LIBRARY\library\thread\thread-safe.ecf"/>
|
||||
<cluster name="src" location=".\src\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
19
examples/restbucksCRUD/client/client.ecf
Normal file
19
examples/restbucksCRUD/client/client.ecf
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-8-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-8-0 http://www.eiffel.com/developers/xml/configuration-1-8-0.xsd" name="client" uuid="D0059CEB-5F5C-4D21-8C71-842BD0F88468">
|
||||
<target name="client">
|
||||
<root class="RESTBUCK_CLIENT" feature="make"/>
|
||||
<file_rule>
|
||||
<exclude>/.git$</exclude>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" void_safety="none" syntax="standard">
|
||||
</option>
|
||||
<setting name="concurrency" value="thread"/>
|
||||
<library name="http_client" location="..\..\..\library\client\http_client\http_client.ecf"/>
|
||||
<library name="json" location="..\..\..\contrib\library\text\parser\json\library\json.ecf" readonly="false"/>
|
||||
<library name="base" location="$ISE_LIBRARY/library/base/base.ecf"/>
|
||||
<library name="thread" location="$ISE_LIBRARY/library/thread/thread.ecf"/>
|
||||
<cluster name="src" location="./src" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
152
examples/restbucksCRUD/client/src/restbuck_client.e
Normal file
152
examples/restbucksCRUD/client/src/restbuck_client.e
Normal file
@@ -0,0 +1,152 @@
|
||||
note
|
||||
description : "Objects that ..."
|
||||
author : "$Author$"
|
||||
date : "$Date$"
|
||||
revision : "$Revision$"
|
||||
|
||||
class
|
||||
RESTBUCK_CLIENT
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
-- Initialize `Current'.
|
||||
local
|
||||
h: LIBCURL_HTTP_CLIENT
|
||||
sess: HTTP_CLIENT_SESSION
|
||||
resp : HTTP_CLIENT_RESPONSE
|
||||
l_location : detachable READABLE_STRING_8
|
||||
body : STRING
|
||||
do
|
||||
create h.make
|
||||
sess := h.new_session ("http://127.0.0.1:9090")
|
||||
|
||||
-- Create Order
|
||||
print ("%N Create Order %N")
|
||||
resp := create_order (sess)
|
||||
|
||||
|
||||
-- Read the Order
|
||||
print ("%N Read Order %N")
|
||||
l_location := resp.header ("Location")
|
||||
resp := read_order (sess, l_location)
|
||||
|
||||
|
||||
-- Update the Order
|
||||
if attached resp.body as l_body then
|
||||
body := l_body.as_string_8
|
||||
body.replace_substring_all ("takeAway", "in Shop")
|
||||
print ("%N Update Order %N")
|
||||
resp := update_order (sess, l_location, body)
|
||||
end
|
||||
end
|
||||
|
||||
update_order ( sess: HTTP_CLIENT_SESSION; uri : detachable READABLE_STRING_8; a_body : STRING) : HTTP_CLIENT_RESPONSE
|
||||
local
|
||||
context : HTTP_CLIENT_REQUEST_CONTEXT
|
||||
do
|
||||
create Result.make
|
||||
if attached uri as l_uri then
|
||||
sess.set_base_url (l_uri)
|
||||
create context.make
|
||||
context.headers.put ("application/json", "Content-Type")
|
||||
Result := sess.put ("", context, a_body )
|
||||
-- Show headers
|
||||
across
|
||||
Result.headers as l_headers
|
||||
loop
|
||||
print (l_headers.item.name)
|
||||
print (":")
|
||||
print (l_headers.item.value)
|
||||
io.put_new_line
|
||||
end
|
||||
|
||||
-- Show body
|
||||
print (Result.body)
|
||||
io.put_new_line
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
read_order ( sess: HTTP_CLIENT_SESSION; uri : detachable READABLE_STRING_8) : HTTP_CLIENT_RESPONSE
|
||||
do
|
||||
create Result.make
|
||||
if attached uri as l_uri then
|
||||
sess.set_base_url (l_uri)
|
||||
Result := sess.get ("", Void)
|
||||
-- Show headers
|
||||
across
|
||||
Result.headers as l_headers
|
||||
loop
|
||||
print (l_headers.item.name)
|
||||
print (":")
|
||||
print (l_headers.item.value)
|
||||
io.put_new_line
|
||||
end
|
||||
|
||||
-- Show body
|
||||
print (Result.body)
|
||||
io.put_new_line
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
create_order (sess: HTTP_CLIENT_SESSION) : HTTP_CLIENT_RESPONSE
|
||||
local
|
||||
s: READABLE_STRING_8
|
||||
j: JSON_PARSER
|
||||
id: detachable STRING
|
||||
context : HTTP_CLIENT_REQUEST_CONTEXT
|
||||
do
|
||||
s := "[
|
||||
{
|
||||
"location":"takeAway",
|
||||
"items":[
|
||||
{
|
||||
"name":"Late",
|
||||
"option":"skim",
|
||||
"size":"Small",
|
||||
"quantity":1
|
||||
}
|
||||
]
|
||||
}
|
||||
]"
|
||||
|
||||
create context.make
|
||||
context.headers.put ("application/json", "Content-Type")
|
||||
Result := sess.post ("/order", context, s)
|
||||
-- Show the Headers
|
||||
across
|
||||
Result.headers as l_headers
|
||||
loop
|
||||
print (l_headers.item.name)
|
||||
print (":")
|
||||
print (l_headers.item.value)
|
||||
io.put_new_line
|
||||
end
|
||||
|
||||
|
||||
-- Show the Response body
|
||||
if attached Result.body as m then
|
||||
create j.make_parser (m)
|
||||
if j.is_parsed and attached j.parse_object as j_o then
|
||||
if attached {JSON_STRING} j_o.item ("id") as l_id then
|
||||
id := l_id.item
|
||||
end
|
||||
print (m)
|
||||
io.put_new_line
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
invariant
|
||||
-- invariant_clause: True
|
||||
|
||||
end
|
||||
4
examples/restbucksCRUD/license.lic
Normal file
4
examples/restbucksCRUD/license.lic
Normal file
@@ -0,0 +1,4 @@
|
||||
${NOTE_KEYWORD}
|
||||
copyright: "2011-${YEAR}, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
|
||||
293
examples/restbucksCRUD/readme.md
Normal file
293
examples/restbucksCRUD/readme.md
Normal file
@@ -0,0 +1,293 @@
|
||||
Restbuck Eiffel Implementation based on the book of REST in Practice
|
||||
====================================================================
|
||||
This is an implementation of CRUD pattern for manipulate resources, this is the first step to use
|
||||
the HTTP protocol as an application protocol instead of a transport protocol.
|
||||
|
||||
Restbuck Protocol
|
||||
-----------------
|
||||
|
||||
<table>
|
||||
<TR><TH>Verb</TH> <TH>URI or template</TH> <TH>Use</TH></TR>
|
||||
<TR><TD>POST</TD> <TD>/order</TD> <TD>Create a new order, and upon success, receive a Locationheader specifying the new order's URI.</TD></TR>
|
||||
<TR><TD>GET</TD> <TD>/order/{orderId}</TD> <TD>Request the current state of the order specified by the URI.</TD></TR>
|
||||
<TR><TD>PUT</TD> <TD>/order/{orderId}</TD> <TD>Update an order at the given URI with new information, providing the full representation.</TD></TR>
|
||||
<TR><TD>DELETE</TD> <TD>/order/{orderId}</TD> <TD>Logically remove the order identified by the given URI.</TD></TR>
|
||||
</table>
|
||||
|
||||
Resource Represenation
|
||||
----------------------
|
||||
The previous tables shows a contrat, the URI or URI template, allows us to indentify resources, now we will chose a
|
||||
representacion, for this particular case we will use JSON.
|
||||
|
||||
Note: <br/>
|
||||
1. *A resource can have multiple URIs*.<br/>
|
||||
2. *A resource can have multiple Representations*.<br/>
|
||||
|
||||
RESTBUCKS_SERVER
|
||||
----------------
|
||||
This class implement the main entry of our REST CRUD service, we are using a default connector (Nino Connector,
|
||||
using a WebServer written in Eiffel).
|
||||
We are inheriting from URI_TEMPLATE_ROUTED_SERVICE, this allows us to map our service contrat, as is shown in the previous
|
||||
table, the mapping is defined in the feature setup_router, this also show that the class ORDER_HANDLER will be encharge
|
||||
of to handle different type of request to the ORDER resource.
|
||||
|
||||
|
||||
class
|
||||
RESTBUCKS_SERVER
|
||||
|
||||
inherit
|
||||
ANY
|
||||
|
||||
URI_TEMPLATE_ROUTED_SERVICE
|
||||
|
||||
DEFAULT_SERVICE
|
||||
-- Here we are using a default connector using the default Nino Connector,
|
||||
-- but it's possible to use other connector (CGI or FCGI).
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
-- Initialize the router (this will have the request handler and
|
||||
-- their context).
|
||||
do
|
||||
initialize_router
|
||||
make_and_launch
|
||||
end
|
||||
|
||||
create_router
|
||||
do
|
||||
create router.make (2)
|
||||
end
|
||||
|
||||
setup_router
|
||||
local
|
||||
order_handler: ORDER_HANDLER [REQUEST_URI_TEMPLATE_HANDLER_CONTEXT]
|
||||
do
|
||||
create order_handler
|
||||
router.map_with_request_methods ("/order", order_handler, <<"POST">>)
|
||||
router.map_with_request_methods ("/order/{orderid}", order_handler, <<"GET", "DELETE", "PUT">>)
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute_default (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
-- I'm using this method to handle the method not allowed response
|
||||
-- in the case that the given uri does not have a corresponding http method
|
||||
-- to handle it.
|
||||
local
|
||||
h : HTTP_HEADER
|
||||
l_description : STRING
|
||||
l_api_doc : STRING
|
||||
do
|
||||
if req.content_length_value > 0 then
|
||||
req.input.read_string (req.content_length_value.as_integer_32)
|
||||
end
|
||||
create h.make
|
||||
h.put_status ({HTTP_STATUS_CODE}.method_not_allowed)
|
||||
h.put_content_type_text_plain
|
||||
l_api_doc := "%NPlease check the API%NURI:/order METHOD: POST%NURI:/order/{orderid} METHOD: GET, PUT, DELETE%N"
|
||||
l_description := req.request_method + req.request_uri + " is not allowed" + "%N" + l_api_doc
|
||||
h.put_content_length (l_description.count)
|
||||
h.put_current_date
|
||||
res.set_status_code ({HTTP_STATUS_CODE}.method_not_allowed)
|
||||
res.write_header_text (h.string)
|
||||
res.write_string (l_description)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
How to Create an order with POST
|
||||
--------------------------------
|
||||
|
||||
Here is the convention that we are using:
|
||||
POST is used for creation and the server determines the URI of the created resource.
|
||||
If the request POST is SUCCESS, the server will create the order and will response with
|
||||
201 CREATED, the Location header will contains the newly created order's URI,
|
||||
if the request POST is not SUCCESS, the server will response with
|
||||
400 BAD REQUEST, the client send a bad request or
|
||||
500 INTERNAL_SERVER_ERROR, when the server can deliver the request.
|
||||
|
||||
POST /order HTTP/1.1
|
||||
Host: 127.0.0.1:8080
|
||||
Connection: keep-alive
|
||||
Content-Length: 196
|
||||
Origin: chrome-extension://fhjcajmcbmldlhcimfajhfbgofnpcjmb
|
||||
Content-Type: application/json
|
||||
Accept: */*
|
||||
Accept-Encoding: gzip,deflate,sdch
|
||||
Accept-Language: es-419,es;q=0.8,en;q=0.6
|
||||
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
|
||||
|
||||
{
|
||||
"location":"takeAway",
|
||||
"items":[
|
||||
{
|
||||
"name":"Late",
|
||||
"option":"skim",
|
||||
"size":"Small",
|
||||
"quantity":1
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Response success
|
||||
|
||||
HTTP/1.1 201 Created
|
||||
Status 201 Created
|
||||
Content-Type application/json
|
||||
Content-Length 123
|
||||
Location http://localhost:8080/order/1
|
||||
Date FRI,09 DEC 2011 20:34:20.00 GMT
|
||||
|
||||
{
|
||||
"location" : "takeAway",
|
||||
"status" : "submitted",
|
||||
"items" : [ {
|
||||
"name" : "late",
|
||||
"size" : "small",
|
||||
"quantity" : 1,
|
||||
"option" : "skim"
|
||||
} ]
|
||||
}
|
||||
|
||||
|
||||
How to Read an order with GET
|
||||
-----------------------------
|
||||
Using GET to retrieve resource information.
|
||||
If the GET request is SUCCESS, we response with 200 OK, and a representation of the order
|
||||
If the GET request is not SUCCESS, we response with 404 Resource not found
|
||||
If is a Conditional GET and the resource does not change we send a 304, Resource not modifed
|
||||
|
||||
GET /order/1 HTTP/1.1
|
||||
Host: 127.0.0.1:8080
|
||||
Connection: keep-alive
|
||||
Accept: */*
|
||||
Accept-Encoding: gzip,deflate,sdch
|
||||
Accept-Language: es-419,es;q=0.8,en;q=0.6
|
||||
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
|
||||
If-None-Match: 6542EF270D91D3EAF39CFB382E4CEBA7
|
||||
|
||||
Response
|
||||
HTTP/1.1 200 OK
|
||||
|
||||
Status 200 OK
|
||||
Content-Type application/json
|
||||
Content-Length 123
|
||||
Date FRI,09 DEC 2011 20:53:46.00 GMT
|
||||
etag 2ED3A40954A95D766FC155682DC8BB52
|
||||
|
||||
{
|
||||
"location" : "takeAway",
|
||||
"status" : "submitted",
|
||||
"items" : [ {
|
||||
"name" : "late",
|
||||
"size" : "small",
|
||||
"quantity" : 1,
|
||||
"option" : "skim"
|
||||
} ]
|
||||
}
|
||||
|
||||
|
||||
|
||||
How to Update an order with PUT
|
||||
-------------------------------
|
||||
A successful PUT request will not create a new resource, instead it will change the state of the resource identified by the current uri.
|
||||
If success we response with 200 and the updated order.
|
||||
404 if the order is not found
|
||||
400 in case of a bad request
|
||||
500 internal server error
|
||||
If the request is a Conditional PUT, and it does not mat we response 415, precondition failed.
|
||||
|
||||
Suposse that we had created an Order with the values shown in the _How to create an order with POST_
|
||||
But we change our decision and we want to stay in the shop.
|
||||
|
||||
|
||||
|
||||
PUT /order/1 HTTP/1.1
|
||||
Content-Length: 122
|
||||
Content-Type: application/json; charset=UTF-8
|
||||
Host: localhost:8080
|
||||
Connection: Keep-Alive
|
||||
Expect: 100-Continue
|
||||
|
||||
{
|
||||
"location" : "in shop",
|
||||
"status" : "submitted",
|
||||
"items" : [ {
|
||||
"name" : "late",
|
||||
"size" : "small",
|
||||
"quantity" : 1,
|
||||
"option" : "skim"
|
||||
} ]
|
||||
}
|
||||
|
||||
|
||||
Response success
|
||||
|
||||
HTTP/1.1 200 OK
|
||||
Status 200 OK
|
||||
Content-Type application/json
|
||||
Date FRI,09 DEC 2011 21:06:26.00 GMT
|
||||
etag 8767F900674B843E1F3F70BCF3E62403
|
||||
Content-Length 122
|
||||
|
||||
{
|
||||
"location" : "in shop",
|
||||
"status" : "submitted",
|
||||
"items" : [ {
|
||||
"name" : "late",
|
||||
"size" : "small",
|
||||
"quantity" : 1,
|
||||
"option" : "skim"
|
||||
} ]
|
||||
}
|
||||
|
||||
How to Delete an order with DELETE
|
||||
----------------------------------
|
||||
Here we use DELETE to cancel an order, if that order is in state where it can still be canceled.
|
||||
204 if is ok
|
||||
404 Resource not found
|
||||
405 if consumer and service's view of the resouce state is inconsisent
|
||||
500 if we have an internal server error
|
||||
|
||||
|
||||
DELETE /order/1 HTTP/1.1
|
||||
Host: localhost:8080
|
||||
Connection: Keep-Alive
|
||||
|
||||
Response success
|
||||
|
||||
HTTP/1.1 204 No Content
|
||||
|
||||
Status 204 No Content
|
||||
Content-Type application/json
|
||||
Date FRI,09 DEC 2011 21:10:51.00 GMT
|
||||
|
||||
If we want to check that the resource does not exist anymore we can try to retrieve a GET /order/1 and we will receive a
|
||||
404 No Found
|
||||
|
||||
GET /order/1 HTTP/1.1
|
||||
Host: localhost:8080
|
||||
Connection: Keep-Alive
|
||||
|
||||
Response
|
||||
|
||||
HTTP/1.1 404 Not Found
|
||||
|
||||
Status 404 Not Found
|
||||
Content-Type application/json
|
||||
Content-Length 44
|
||||
Date FRI,09 DEC 2011 21:14:17.79 GMT
|
||||
|
||||
The following resource/order/1 is not found
|
||||
|
||||
|
||||
References
|
||||
----------
|
||||
1. [How to get a cup of coffe](http://www.infoq.com/articles/webber-rest-workflow)
|
||||
2. [Rest in Practice] (http://restinpractice.com/default.aspx)
|
||||
0
examples/restbucksCRUD/readme.txt
Normal file
0
examples/restbucksCRUD/readme.txt
Normal file
31
examples/restbucksCRUD/restbucks-safe.ecf
Normal file
31
examples/restbucksCRUD/restbucks-safe.ecf
Normal file
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-9-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-9-0 http://www.eiffel.com/developers/xml/configuration-1-9-0.xsd" name="restbucks" uuid="7C9887BD-4AE4-47F2-A0AA-4BBB6736D433">
|
||||
<target name="restbucks">
|
||||
<root class="RESTBUCKS_SERVER" feature="make"/>
|
||||
<file_rule>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/\.git$</exclude>
|
||||
<exclude>/\.svn$</exclude>
|
||||
</file_rule>
|
||||
<option debug="true" warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all" syntax="provisional">
|
||||
<debug name="nino" enabled="true"/>
|
||||
<assertions precondition="true" postcondition="true" invariant="true" supplier_precondition="true"/>
|
||||
</option>
|
||||
<setting name="concurrency" value="thread"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="connector_nino" location="..\..\library\server\ewsgi\connectors\nino\nino-safe.ecf" readonly="false">
|
||||
<option debug="true">
|
||||
<debug name="nino" enabled="true"/>
|
||||
</option>
|
||||
</library>
|
||||
<library name="default_nino" location="..\..\library\server\wsf\default\nino-safe.ecf" readonly="false"/>
|
||||
<library name="eel" location="..\..\library\crypto\eel\eel-safe.ecf" readonly="false"/>
|
||||
<library name="encoder" location="..\..\library\text\encoder\encoder-safe.ecf" readonly="false"/>
|
||||
<library name="http" location="..\..\library\protocol\http\http-safe.ecf" readonly="false"/>
|
||||
<library name="json" location="..\..\contrib\library\text\parser\json\library\json-safe.ecf" readonly="false"/>
|
||||
<library name="uri_template" location="..\..\library\protocol\uri_template\uri_template-safe.ecf" readonly="false"/>
|
||||
<library name="wsf" location="..\..\library\server\wsf\wsf-safe.ecf" readonly="false"/>
|
||||
<library name="wsf_extension" location="..\..\library\server\wsf_extension\wsf_extension-safe.ecf" readonly="false"/>
|
||||
<cluster name="src" location="src\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
1
examples/restbucksCRUD/restbucks.rc
Normal file
1
examples/restbucksCRUD/restbucks.rc
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
26
examples/restbucksCRUD/src/database/database_api.e
Normal file
26
examples/restbucksCRUD/src/database/database_api.e
Normal file
@@ -0,0 +1,26 @@
|
||||
note
|
||||
description: "Summary description for {DATABASE_API}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
DATABASE_API
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Initialization
|
||||
|
||||
make
|
||||
do
|
||||
create orders.make (10)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
orders: HASH_TABLE [ORDER, STRING]
|
||||
|
||||
;note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
19
examples/restbucksCRUD/src/database/shared_database_api.e
Normal file
19
examples/restbucksCRUD/src/database/shared_database_api.e
Normal file
@@ -0,0 +1,19 @@
|
||||
note
|
||||
description: "Summary description for {SHARED_DATABASE_API}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
SHARED_DATABASE_API
|
||||
|
||||
feature -- Access
|
||||
|
||||
db_access: DATABASE_API
|
||||
once
|
||||
create Result.make
|
||||
end
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
90
examples/restbucksCRUD/src/domain/item.e
Normal file
90
examples/restbucksCRUD/src/domain/item.e
Normal file
@@ -0,0 +1,90 @@
|
||||
note
|
||||
description: "Summary description for {ITEM}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
ITEM
|
||||
inherit
|
||||
ITEM_CONSTANTS
|
||||
create
|
||||
make
|
||||
feature -- Initialization
|
||||
make ( a_name : STRING_32 ; a_size:STRING_32; a_option: STRING_32; a_quantity:INTEGER_8)
|
||||
do
|
||||
set_name (a_name)
|
||||
set_size (a_size)
|
||||
set_option (a_option)
|
||||
set_quantity (a_quantity)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
name : STRING
|
||||
-- product name type of Coffee(Late, Cappuccino, Expresso)
|
||||
|
||||
option : STRING
|
||||
-- customization option Milk (skim, semi, whole)
|
||||
|
||||
size : STRING
|
||||
-- small, mediumm large
|
||||
|
||||
quantity :INTEGER
|
||||
|
||||
|
||||
|
||||
|
||||
feature -- Element Change
|
||||
set_name (a_name: STRING)
|
||||
require
|
||||
valid_name: is_valid_coffee_type (a_name)
|
||||
do
|
||||
name := a_name
|
||||
ensure
|
||||
name_assigned : name.same_string(a_name)
|
||||
end
|
||||
|
||||
set_size (a_size: STRING)
|
||||
require
|
||||
valid_size : is_valid_size_option (a_size)
|
||||
do
|
||||
size := a_size
|
||||
ensure
|
||||
size_assigned : size.same_string(a_size)
|
||||
end
|
||||
|
||||
set_option (an_option: STRING)
|
||||
require
|
||||
valid_option : is_valid_milk_type (an_option)
|
||||
do
|
||||
option := an_option
|
||||
ensure
|
||||
option_assigned : option.same_string (an_option)
|
||||
end
|
||||
|
||||
set_quantity (a_quantity: INTEGER)
|
||||
require
|
||||
valid_quantity : a_quantity > 0
|
||||
do
|
||||
quantity := a_quantity
|
||||
ensure
|
||||
quantity_assigned : quantity = a_quantity
|
||||
end
|
||||
|
||||
feature -- Report
|
||||
hash_code: INTEGER
|
||||
--Hash code value
|
||||
do
|
||||
Result := option.hash_code + name.hash_code + size.hash_code + quantity.hash_code
|
||||
end
|
||||
|
||||
|
||||
invariant
|
||||
valid_size : is_valid_size_option (size)
|
||||
valid_coffe : is_valid_coffee_type (name)
|
||||
valid_customization : is_valid_milk_type (option)
|
||||
valid_quantity : quantity > 0
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
54
examples/restbucksCRUD/src/domain/item_constants.e
Normal file
54
examples/restbucksCRUD/src/domain/item_constants.e
Normal file
@@ -0,0 +1,54 @@
|
||||
note
|
||||
description: "Summary description for {ITEM_CONSTANTS}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
ITEM_CONSTANTS
|
||||
feature -- Access
|
||||
is_valid_coffee_type (a_type: STRING) : BOOLEAN
|
||||
--is `a_type' a valid coffee type
|
||||
do
|
||||
a_type.to_lower
|
||||
coffe_types.compare_objects
|
||||
Result := coffe_types.has (a_type)
|
||||
end
|
||||
|
||||
Coffe_types : ARRAY[STRING]
|
||||
-- List of valid Coffee types
|
||||
once
|
||||
Result := <<"late","cappuccino", "expresso">>
|
||||
end
|
||||
|
||||
is_valid_milk_type (a_type: STRING) : BOOLEAN
|
||||
--is `a_type' a valid milk type
|
||||
do
|
||||
a_type.to_lower
|
||||
milk_types.compare_objects
|
||||
Result := milk_types.has (a_type)
|
||||
end
|
||||
|
||||
Milk_types : ARRAY[STRING]
|
||||
-- List of valid Milk types
|
||||
once
|
||||
Result := <<"skim","semi", "whole">>
|
||||
end
|
||||
|
||||
is_valid_size_option (an_option: STRING) : BOOLEAN
|
||||
--is `an_option' a valid size option
|
||||
do
|
||||
an_option.to_lower
|
||||
size_options.compare_objects
|
||||
Result := size_options.has (an_option)
|
||||
end
|
||||
|
||||
Size_options : ARRAY[STRING]
|
||||
-- List of valid Size_options
|
||||
once
|
||||
Result := <<"small","mediumn", "large">>
|
||||
end
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
170
examples/restbucksCRUD/src/domain/json_order_converter.e
Normal file
170
examples/restbucksCRUD/src/domain/json_order_converter.e
Normal file
@@ -0,0 +1,170 @@
|
||||
note
|
||||
description: "Summary description for {JSON_ORDER_CONVERTER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
JSON_ORDER_CONVERTER
|
||||
inherit
|
||||
JSON_CONVERTER
|
||||
create
|
||||
make
|
||||
feature -- Initialization
|
||||
make
|
||||
do
|
||||
create object.make ("","","")
|
||||
end
|
||||
feature -- Access
|
||||
object : ORDER
|
||||
|
||||
|
||||
value : detachable JSON_OBJECT
|
||||
feature -- Conversion
|
||||
|
||||
from_json (j: attached like value): detachable like object
|
||||
-- Convert from JSON value. Returns Void if unable to convert
|
||||
local
|
||||
s_id, s_location, s_status: detachable STRING_32
|
||||
q: INTEGER_8
|
||||
o: ORDER
|
||||
i : ITEM
|
||||
l_array : detachable ARRAYED_LIST [JSON_VALUE]
|
||||
is_valid_from_json : BOOLEAN
|
||||
do
|
||||
is_valid_from_json := True
|
||||
|
||||
s_id ?= json.object (j.item (id_key), Void)
|
||||
s_location ?= json.object (j.item (location_key), Void)
|
||||
s_status ?= json.object (j.item (status_key), Void)
|
||||
|
||||
create o.make ("", s_location, s_status)
|
||||
|
||||
if attached {JSON_ARRAY} j.item (items_key) as l_val then
|
||||
l_array := l_val.array_representation
|
||||
from
|
||||
l_array.start
|
||||
until
|
||||
l_array.after
|
||||
loop
|
||||
if attached {JSON_OBJECT} l_array.item_for_iteration as jv then
|
||||
if attached {INTEGER_8} json.object (jv.item (quantity_key), Void) as l_integer then
|
||||
q := l_integer
|
||||
else
|
||||
q := 0
|
||||
end
|
||||
if
|
||||
attached {STRING_32} json.object (jv.item (name_key), Void) as s_name and then
|
||||
attached {STRING_32} json.object (jv.item (size_key), Void) as s_key and then
|
||||
attached {STRING_32} json.object (jv.item (option_key), Void) as s_option
|
||||
then
|
||||
if is_valid_item_customization (s_name, s_key, s_option,q) then
|
||||
create i.make (s_name, s_key, s_option, q)
|
||||
o.add_item (i)
|
||||
else
|
||||
is_valid_from_json := False
|
||||
end
|
||||
else
|
||||
is_valid_from_json := False
|
||||
end
|
||||
end
|
||||
|
||||
l_array.forth
|
||||
end
|
||||
end
|
||||
if not is_valid_from_json or o.items.is_empty then
|
||||
Result := Void
|
||||
else
|
||||
Result := o
|
||||
end
|
||||
end
|
||||
|
||||
to_json (o: like object): like value
|
||||
-- Convert to JSON value
|
||||
local
|
||||
ja : JSON_ARRAY
|
||||
i : ITEM
|
||||
jv: JSON_OBJECT
|
||||
do
|
||||
create Result.make
|
||||
-- Result.put (json.value (o.id), id_key)
|
||||
Result.put (json.value (o.location), location_key)
|
||||
Result.put (json.value (o.status), status_key)
|
||||
from
|
||||
create ja.make_array
|
||||
o.items.start
|
||||
until
|
||||
o.items.after
|
||||
loop
|
||||
i := o.items.item_for_iteration
|
||||
create jv.make
|
||||
jv.put (json.value (i.name), name_key)
|
||||
jv.put (json.value (i.size),size_key)
|
||||
jv.put (json.value (i.quantity), quantity_key)
|
||||
jv.put (json.value (i.option), option_key)
|
||||
ja.add (jv)
|
||||
o.items.forth
|
||||
end
|
||||
Result.put (ja, items_key)
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
id_key: JSON_STRING
|
||||
once
|
||||
create Result.make_json ("id")
|
||||
end
|
||||
|
||||
location_key: JSON_STRING
|
||||
once
|
||||
create Result.make_json ("location")
|
||||
end
|
||||
|
||||
status_key: JSON_STRING
|
||||
once
|
||||
create Result.make_json ("status")
|
||||
end
|
||||
|
||||
items_key : JSON_STRING
|
||||
once
|
||||
create Result.make_json ("items")
|
||||
end
|
||||
|
||||
|
||||
name_key : JSON_STRING
|
||||
|
||||
once
|
||||
create Result.make_json ("name")
|
||||
end
|
||||
|
||||
size_key : JSON_STRING
|
||||
|
||||
once
|
||||
create Result.make_json ("size")
|
||||
end
|
||||
|
||||
quantity_key : JSON_STRING
|
||||
|
||||
once
|
||||
create Result.make_json ("quantity")
|
||||
end
|
||||
|
||||
|
||||
option_key : JSON_STRING
|
||||
|
||||
once
|
||||
create Result.make_json ("option")
|
||||
end
|
||||
feature -- Validation
|
||||
|
||||
is_valid_item_customization ( name : STRING_32; size: STRING_32; option : STRING_32; quantity : INTEGER_8 ) : BOOLEAN
|
||||
local
|
||||
ic : ITEM_CONSTANTS
|
||||
do
|
||||
create ic
|
||||
Result := ic.is_valid_coffee_type (name) and ic.is_valid_milk_type (option) and ic.is_valid_size_option (size) and quantity > 0
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2011, Javier Velilla and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user