adding routing handler

few renaming
This commit is contained in:
Jocelyn Fiat
2011-09-13 16:49:45 +02:00
parent 32197d0513
commit f0c6eec23d
8 changed files with 233 additions and 34 deletions

View File

@@ -15,11 +15,6 @@ inherit
{NONE} all
end
HTTP_FORMAT_CONSTANTS
export
{NONE} all
end
feature -- Access
request: WGI_REQUEST
@@ -28,9 +23,17 @@ feature -- Access
path: READABLE_STRING_8
-- Associated path
request_format (a_format_variable_name: detachable STRING; content_type_supported: detachable ARRAY [STRING]): detachable READABLE_STRING_8
feature {NONE} -- Constants
Format_constants: HTTP_FORMAT_CONSTANTS
once
create Result
end
feature -- Query
request_format (a_format_variable_name: detachable READABLE_STRING_GENERAL; content_type_supported: detachable ARRAY [READABLE_STRING_8]): detachable READABLE_STRING_8
-- Format id for the request based on {HTTP_FORMAT_CONSTANTS}
local
do
if a_format_variable_name /= Void and then attached parameter (a_format_variable_name) as ctx_format then
Result := ctx_format.as_string_8
@@ -38,13 +41,12 @@ feature -- Access
Result := content_type_to_request_format (request_content_type (content_type_supported))
end
end
request_format_id (a_format_variable_name: detachable STRING; content_type_supported: detachable ARRAY [STRING]): INTEGER
request_format_id (a_format_variable_name: detachable READABLE_STRING_GENERAL; content_type_supported: detachable ARRAY [READABLE_STRING_8]): INTEGER
-- Format id for the request based on {HTTP_FORMAT_CONSTANTS}
do
if attached request_format (a_format_variable_name, content_type_supported) as l_format then
Result := format_id (l_format)
Result := Format_constants.format_id (l_format)
else
Result := 0
end
@@ -68,7 +70,7 @@ feature -- Access
end
end
request_content_type (content_type_supported: detachable ARRAY [STRING]): detachable READABLE_STRING_8
request_content_type (content_type_supported: detachable ARRAY [READABLE_STRING_8]): detachable READABLE_STRING_8
local
s: detachable READABLE_STRING_32
i,n: INTEGER

View File

@@ -0,0 +1,33 @@
note
description: "Summary description for {DEFAULT_REQUEST_URI_TEMPLATE_ROUTING_HANDLER}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
DEFAULT_REQUEST_URI_TEMPLATE_ROUTING_HANDLER
inherit
REQUEST_URI_TEMPLATE_ROUTING_HANDLER [REQUEST_HANDLER [REQUEST_URI_TEMPLATE_HANDLER_CONTEXT], REQUEST_URI_TEMPLATE_HANDLER_CONTEXT]
redefine
router
end
create
make
feature {NONE} -- Routing
router: DEFAULT_REQUEST_URI_TEMPLATE_ROUTER
;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

View File

@@ -37,7 +37,7 @@ feature -- Status report
feature -- Execution
execute (a_hdl_context: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Execute request handler
require
is_valid_context: is_valid_context (req)
@@ -46,42 +46,42 @@ feature -- Execution
do
if not rescued then
if request_method_name_supported (req.request_method) then
pre_execute (req)
execute_application (a_hdl_context, req, res)
post_execute (req, res)
pre_execute (ctx, req, res)
execute_application (ctx, req, res)
post_execute (ctx, req, res)
else
execute_request_method_not_allowed (req, res, supported_request_method_names)
end
else
rescue_execute (req, res)
rescue_execute (ctx, req, res)
end
rescue
rescued := True
retry
end
execute_application (a_hdl_context: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
execute_application (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Execute request handler
deferred
end
pre_execute (req: WGI_REQUEST)
pre_execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Operation processed before `execute'
do
--| To be redefined if needed
end
post_execute (req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
post_execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Operation processed after `execute'
do
--| To be redefined if needed
end
rescue_execute (req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
rescue_execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Operation processed after a rescue
do
--| To be redefined if needed
post_execute (req, res)
post_execute (ctx, req, res)
end
feature -- Execution: report

View File

@@ -0,0 +1,73 @@
note
description: "Summary description for {REQUEST_ROUTING_HANDLER}."
author: ""
date: "$Date$"
revision: "$Revision$"
deferred class
REQUEST_ROUTING_HANDLER [H -> REQUEST_HANDLER [C],
C -> REQUEST_HANDLER_CONTEXT]
inherit
REQUEST_HANDLER [C]
feature -- Execution
execute_application (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Execute request handler
local
hdl: detachable H
do
hdl := router.dispatch_and_return_handler (req, res)
end
feature {NONE} -- Routing
router: REQUEST_ROUTER [H, C]
deferred
end
feature -- Mapping
map_default (h: detachable H)
-- Map default handler
-- If no route/handler is found,
-- then use `default_handler' as default if not Void
do
router.map_default (h)
end
map (a_resource: READABLE_STRING_8; h: H)
-- Map handler `h' with `a_resource'
do
router.map (a_resource, h)
end
map_with_request_methods (a_resource: READABLE_STRING_8; h: H; rqst_methods: detachable ARRAY [READABLE_STRING_8])
-- Map handler `h' with `a_resource' and `rqst_methods'
do
router.map_with_request_methods (a_resource, h, rqst_methods)
end
map_agent (a_resource: READABLE_STRING_8; a_action: PROCEDURE [ANY, TUPLE [ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER]])
do
router.map_agent (a_resource, a_action)
end
map_agent_with_request_methods (a_resource: READABLE_STRING_8; a_action: PROCEDURE [ANY, TUPLE [ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER]];
rqst_methods: detachable ARRAY [READABLE_STRING_8])
do
router.map_agent_with_request_methods (a_resource, a_action, rqst_methods)
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

View File

@@ -0,0 +1,38 @@
note
description: "Summary description for {REQUEST_ROUTING_HANDLER}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
REQUEST_URI_ROUTING_HANDLER [H -> REQUEST_HANDLER [C],
C -> REQUEST_URI_HANDLER_CONTEXT create make end]
inherit
REQUEST_ROUTING_HANDLER [H, C]
create
make
feature {NONE} -- Initialization
make (n: INTEGER)
do
create router.make (n)
end
feature {NONE} -- Routing
router: REQUEST_URI_ROUTER [H, C]
;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

View File

@@ -0,0 +1,38 @@
note
description: "Summary description for {REQUEST_ROUTING_HANDLER}."
author: ""
date: "$Date$"
revision: "$Revision$"
class
REQUEST_URI_TEMPLATE_ROUTING_HANDLER [H -> REQUEST_HANDLER [C],
C -> REQUEST_URI_TEMPLATE_HANDLER_CONTEXT create make end]
inherit
REQUEST_ROUTING_HANDLER [H, C]
create
make
feature {NONE} -- Initialization
make (n: INTEGER)
do
create router.make (n)
end
feature {NONE} -- Routing
router: REQUEST_URI_TEMPLATE_ROUTER [H, C]
;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

View File

@@ -9,38 +9,44 @@ deferred class
feature -- Mapping
map_default (r: like default_handler)
map_default (h: like default_handler)
-- Map default handler
-- If no route/handler is found,
-- then use `default_handler' as default if not Void
do
set_default_handler (r)
set_default_handler (h)
end
map (a_id: READABLE_STRING_8; h: H)
-- Map handler `h' with `a_id'
map (a_resource: READABLE_STRING_8; h: H)
-- Map handler `h' with `a_resource'
do
map_with_request_methods (a_id, h, Void)
map_with_request_methods (a_resource, h, Void)
end
map_with_request_methods (a_id: READABLE_STRING_8; h: H; rqst_methods: detachable ARRAY [READABLE_STRING_8])
-- Map handler `h' with `a_id' and `rqst_methods'
map_routing (a_resource: READABLE_STRING_8; h: H)
-- Map handler `h' with `a_resource'
do
map (a_resource, h)
end
map_with_request_methods (a_resource: READABLE_STRING_8; h: H; rqst_methods: detachable ARRAY [READABLE_STRING_8])
-- Map handler `h' with `a_resource' and `rqst_methods'
deferred
end
map_agent (a_id: READABLE_STRING_8; a_action: PROCEDURE [ANY, TUPLE [ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER]])
map_agent (a_resource: READABLE_STRING_8; a_action: PROCEDURE [ANY, TUPLE [ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER]])
do
map_agent_with_request_methods (a_id, a_action, Void)
map_agent_with_request_methods (a_resource, a_action, Void)
end
map_agent_with_request_methods (a_id: READABLE_STRING_8; a_action: PROCEDURE [ANY, TUPLE [ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER]];
map_agent_with_request_methods (a_resource: READABLE_STRING_8; a_action: PROCEDURE [ANY, TUPLE [ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER]];
rqst_methods: detachable ARRAY [READABLE_STRING_8])
local
rah: REQUEST_AGENT_HANDLER [C]
do
create rah.make (a_action)
if attached {H} rah as h then
map_with_request_methods (a_id, h, rqst_methods)
map_with_request_methods (a_resource, h, rqst_methods)
else
check valid_agent_handler: False end
end

View File

@@ -42,7 +42,7 @@ feature -- Registration
create uri.make (tpl)
map_with_uri_template_and_request_methods (uri, h, rqst_methods)
end
feature {NONE} -- Access: Implementation
handler (req: WGI_REQUEST): detachable TUPLE [handler: attached like default_handler; context: like default_handler_context]
@@ -51,6 +51,7 @@ feature {NONE} -- Access: Implementation
t: STRING
p: STRING
l_req_method: READABLE_STRING_GENERAL
l_res: URI_TEMPLATE_MATCH_RESULT
do
p := req.request_uri
from
@@ -63,7 +64,15 @@ feature {NONE} -- Access: Implementation
if attached l_handlers.item as l_info then
if is_matching_request_methods (l_req_method, l_info.request_methods) then
t := l_info.resource
if attached templates.item (t) as tpl and then
if
attached {REQUEST_ROUTING_HANDLER [H, C]} l_info.handler as rah and then
p.starts_with (t)
then
create l_res.make_empty
l_res.path_variables.force (p.substring (t.count, p.count), "path")
Result := [l_info.handler, handler_context (p, req, create {URI_TEMPLATE}.make (t), l_res)]
elseif attached templates.item (t) as tpl and then
attached tpl.match (p) as res
then
Result := [l_info.handler, handler_context (p, req, tpl, res)]