added hello_routed_world example
few changes on new `router' library (still in-progress)
This commit is contained in:
@@ -11,6 +11,7 @@
|
||||
<assertions precondition="true"/>
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="base_extension" location="$ISE_LIBRARY\library\base_extension\base_extension-safe.ecf"/>
|
||||
<library name="ewsgi_spec" location="..\..\ewsgi\ewsgi_specification-safe.ecf" readonly="false"/>
|
||||
<library name="http" location="..\..\..\protocol\http\http-safe.ecf"/>
|
||||
<library name="uri_template" location="..\..\..\protocol\uri_template\uri_template-safe.ecf" readonly="false"/>
|
||||
|
||||
@@ -7,14 +7,15 @@
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all">
|
||||
<option warning="true" full_class_checking="true">
|
||||
<assertions precondition="true"/>
|
||||
</option>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="ewsgi_spec" location="..\..\ewsgi\ewsgi_specification-safe.ecf" readonly="false"/>
|
||||
<library name="http" location="..\..\..\protocol\http\http-safe.ecf"/>
|
||||
<library name="uri_template" location="..\..\..\protocol\uri_template\uri_template-safe.ecf" readonly="false"/>
|
||||
<library name="time" location="$ISE_LIBRARY\library\time\time-safe.ecf"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
|
||||
<library name="base_extension" location="$ISE_LIBRARY\library\base_extension\base_extension.ecf"/>
|
||||
<library name="ewsgi_spec" location="..\..\ewsgi\ewsgi_specification.ecf" readonly="false"/>
|
||||
<library name="http" location="..\..\..\protocol\http\http.ecf"/>
|
||||
<library name="uri_template" location="..\..\..\protocol\uri_template\uri_template.ecf" readonly="false"/>
|
||||
<library name="time" location="$ISE_LIBRARY\library\time\time.ecf"/>
|
||||
<cluster name="src" location="src\" recursive="true"/>
|
||||
</target>
|
||||
</system>
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
note
|
||||
description: "Summary description for {ROUTED_APPLICATION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
ROUTED_APPLICATION
|
||||
|
||||
feature -- Setup
|
||||
|
||||
initialize_router
|
||||
-- Initialize `router'
|
||||
do
|
||||
create_router
|
||||
setup_router
|
||||
end
|
||||
|
||||
create_router
|
||||
-- Create `router'
|
||||
deferred
|
||||
ensure
|
||||
router_created: router /= Void
|
||||
end
|
||||
|
||||
setup_router
|
||||
-- Setup `router'
|
||||
require
|
||||
router_created: router /= Void
|
||||
deferred
|
||||
end
|
||||
|
||||
router: REQUEST_ROUTER
|
||||
-- Request router
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute (req: EWSGI_REQUEST; res: EWSGI_RESPONSE_STREAM)
|
||||
do
|
||||
if attached router.dispatch (req, res) as r then
|
||||
--| done
|
||||
else
|
||||
execute_default (req, res)
|
||||
end
|
||||
end
|
||||
|
||||
execute_default (req: EWSGI_REQUEST; res: EWSGI_RESPONSE_STREAM)
|
||||
deferred
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-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,6 +7,14 @@ note
|
||||
deferred class
|
||||
REQUEST_HANDLER_CONTEXT
|
||||
|
||||
inherit
|
||||
ANY
|
||||
|
||||
REQUEST_FORMAT_UTILITY
|
||||
export
|
||||
{NONE} all
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
request: EWSGI_REQUEST
|
||||
@@ -15,23 +23,39 @@ feature -- Access
|
||||
path: STRING
|
||||
-- ???
|
||||
|
||||
request_format: detachable STRING
|
||||
-- Request format based on `Content-Type'.
|
||||
request_content_type (content_type_supported: detachable ARRAY [STRING]): detachable STRING
|
||||
local
|
||||
s: detachable STRING
|
||||
i,n: INTEGER
|
||||
do
|
||||
s := request.environment.content_type
|
||||
if s = Void then
|
||||
elseif s.same_string ({HTTP_CONSTANTS}.json_text) then
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.json_name
|
||||
elseif s.same_string ({HTTP_CONSTANTS}.json_app) then
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.json_name
|
||||
elseif s.same_string ({HTTP_CONSTANTS}.xml_text) then
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.xml_name
|
||||
elseif s.same_string ({HTTP_CONSTANTS}.html_text) then
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.html_name
|
||||
elseif s.same_string ({HTTP_CONSTANTS}.plain_text) then
|
||||
Result := {HTTP_FORMAT_CONSTANTS}.text_name
|
||||
Result := request.environment.content_type
|
||||
if Result = Void then
|
||||
s := request.environment.http_accept
|
||||
if s /= Void then
|
||||
if attached accepted_content_types (request) as l_accept_lst then
|
||||
from
|
||||
l_accept_lst.start
|
||||
until
|
||||
l_accept_lst.after or Result /= Void
|
||||
loop
|
||||
s := l_accept_lst.item
|
||||
if content_type_supported /= Void then
|
||||
from
|
||||
i := content_type_supported.lower
|
||||
n := content_type_supported.upper
|
||||
until
|
||||
i > n or Result /= Void
|
||||
loop
|
||||
if content_type_supported[i].same_string (s) then
|
||||
Result := s
|
||||
end
|
||||
i := i + 1
|
||||
end
|
||||
end
|
||||
l_accept_lst.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
note
|
||||
description: "Summary description for {REQUEST_FORMAT_UTILITY}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REQUEST_FORMAT_UTILITY
|
||||
|
||||
feature -- Access
|
||||
|
||||
accepted_content_types (req: EWSGI_REQUEST): detachable ARRAYED_LIST [STRING]
|
||||
local
|
||||
l_accept: detachable STRING
|
||||
s,q: STRING
|
||||
p: INTEGER
|
||||
lst: LIST [STRING]
|
||||
qs: QUICK_SORTER [STRING]
|
||||
do
|
||||
l_accept := req.environment.http_accept
|
||||
--TEST l_accept := "text/html,application/xhtml+xml;q=0.6,application/xml;q=0.2,text/plain;q=0.5,*/*;q=0.8"
|
||||
|
||||
if l_accept /= Void then
|
||||
lst := l_accept.split (',')
|
||||
create Result.make (lst.count)
|
||||
from
|
||||
lst.start
|
||||
until
|
||||
lst.after
|
||||
loop
|
||||
s := lst.item
|
||||
p := s.substring_index (";q=", 1)
|
||||
if p > 0 then
|
||||
q := s.substring (p + 3, s.count)
|
||||
s := s.substring (1, p - 1)
|
||||
else
|
||||
q := "1.0"
|
||||
end
|
||||
Result.force (q + ":" + s)
|
||||
|
||||
lst.forth
|
||||
end
|
||||
create qs.make (create {COMPARABLE_COMPARATOR [STRING]})
|
||||
qs.reverse_sort (Result)
|
||||
from
|
||||
Result.start
|
||||
until
|
||||
Result.after
|
||||
loop
|
||||
s := Result.item
|
||||
p := s.index_of (':', 1)
|
||||
if p > 0 then
|
||||
s.remove_head (p)
|
||||
else
|
||||
check should_have_colon: False end
|
||||
end
|
||||
Result.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation
|
||||
|
||||
string_in_array (arr: ARRAY [STRING]; s: STRING): BOOLEAN
|
||||
local
|
||||
i,n: INTEGER
|
||||
do
|
||||
from
|
||||
i := arr.lower
|
||||
n := arr.upper
|
||||
until
|
||||
i > n or Result
|
||||
loop
|
||||
Result := s.same_string (arr[i])
|
||||
i := i + 1
|
||||
end
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-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
|
||||
Reference in New Issue
Block a user