From f0c6eec23d9ea3a4260b04a194b358748b60ec59 Mon Sep 17 00:00:00 2001 From: Jocelyn Fiat Date: Tue, 13 Sep 2011 16:49:45 +0200 Subject: [PATCH] adding routing handler few renaming --- .../src/context/request_handler_context.e | 24 +++--- ...ult_request_uri_template_routing_handler.e | 33 +++++++++ .../router/src/handler/request_handler.e | 20 ++--- .../src/handler/request_routing_handler.e | 73 +++++++++++++++++++ .../src/handler/request_uri_routing_handler.e | 38 ++++++++++ .../request_uri_template_routing_handler.e | 38 ++++++++++ .../router/src/router/request_router.e | 28 ++++--- .../src/router/request_uri_template_router.e | 13 +++- 8 files changed, 233 insertions(+), 34 deletions(-) create mode 100644 library/server/request/router/src/default/default_request_uri_template_routing_handler.e create mode 100644 library/server/request/router/src/handler/request_routing_handler.e create mode 100644 library/server/request/router/src/handler/request_uri_routing_handler.e create mode 100644 library/server/request/router/src/handler/request_uri_template_routing_handler.e diff --git a/library/server/request/router/src/context/request_handler_context.e b/library/server/request/router/src/context/request_handler_context.e index 666ff7ca..92dcf745 100644 --- a/library/server/request/router/src/context/request_handler_context.e +++ b/library/server/request/router/src/context/request_handler_context.e @@ -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 diff --git a/library/server/request/router/src/default/default_request_uri_template_routing_handler.e b/library/server/request/router/src/default/default_request_uri_template_routing_handler.e new file mode 100644 index 00000000..f042fa00 --- /dev/null +++ b/library/server/request/router/src/default/default_request_uri_template_routing_handler.e @@ -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 diff --git a/library/server/request/router/src/handler/request_handler.e b/library/server/request/router/src/handler/request_handler.e index c87056ce..a9908338 100644 --- a/library/server/request/router/src/handler/request_handler.e +++ b/library/server/request/router/src/handler/request_handler.e @@ -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 diff --git a/library/server/request/router/src/handler/request_routing_handler.e b/library/server/request/router/src/handler/request_routing_handler.e new file mode 100644 index 00000000..117dba77 --- /dev/null +++ b/library/server/request/router/src/handler/request_routing_handler.e @@ -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 diff --git a/library/server/request/router/src/handler/request_uri_routing_handler.e b/library/server/request/router/src/handler/request_uri_routing_handler.e new file mode 100644 index 00000000..ff522762 --- /dev/null +++ b/library/server/request/router/src/handler/request_uri_routing_handler.e @@ -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 diff --git a/library/server/request/router/src/handler/request_uri_template_routing_handler.e b/library/server/request/router/src/handler/request_uri_template_routing_handler.e new file mode 100644 index 00000000..dac329c4 --- /dev/null +++ b/library/server/request/router/src/handler/request_uri_template_routing_handler.e @@ -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 diff --git a/library/server/request/router/src/router/request_router.e b/library/server/request/router/src/router/request_router.e index 8177478d..5f6ee322 100644 --- a/library/server/request/router/src/router/request_router.e +++ b/library/server/request/router/src/router/request_router.e @@ -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 diff --git a/library/server/request/router/src/router/request_uri_template_router.e b/library/server/request/router/src/router/request_uri_template_router.e index 4183b329..adba8c02 100644 --- a/library/server/request/router/src/router/request_uri_template_router.e +++ b/library/server/request/router/src/router/request_uri_template_router.e @@ -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)]