Simplified interface of "router" library classes

This commit is contained in:
Jocelyn Fiat
2011-09-14 16:48:27 +02:00
parent 8b6e9273fa
commit 22fd7490fe
11 changed files with 219 additions and 198 deletions

View File

@@ -20,7 +20,6 @@ feature {NONE} -- Initialization
router := a_router router := a_router
base_doc_url := a_base_doc_url base_doc_url := a_base_doc_url
description := "Technical documention for the API" description := "Technical documention for the API"
initialize
end end
feature {NONE} -- Access: Implementation feature {NONE} -- Access: Implementation
@@ -31,7 +30,9 @@ feature {NONE} -- Access: Implementation
feature -- Access feature -- Access
authentication_required: BOOLEAN = False authentication_required (req: WGI_REQUEST): BOOLEAN
do
end
feature -- Execution feature -- Execution
@@ -187,7 +188,7 @@ feature -- Execution
end end
s.append_string ("</strong></div>") s.append_string ("</strong></div>")
end end
s.append_string ("<div class=%"api-auth%">Authentication required: <strong>" + rq.authentication_required.out + "</strong></div>") 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 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) 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 if attached l_uri_tpl.query_variable_names as l_query_variable_names and then not l_query_variable_names.is_empty then

View File

@@ -22,26 +22,33 @@ create
feature -- status feature -- status
authentication_required: BOOLEAN authentication_required (req: WGI_REQUEST): BOOLEAN
do
Result := internal_authentication_required
end
feature -- Element change feature -- Element change
set_authentication_required (b: like authentication_required) set_authentication_required (b: like authentication_required)
do do
authentication_required := b internal_authentication_required := b
end end
feature {NONE} -- Implementation
internal_authentication_required: BOOLEAN
feature -- Execution feature -- Execution
execute (a_hdl_context: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER) execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
do do
Precursor {REST_REQUEST_HANDLER} (a_hdl_context, req, res) Precursor {REST_REQUEST_HANDLER} (ctx, req, res)
end end
-- execute_application (ctx: REST_REQUEST_HANDLER_CONTEXT; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER) execute_application (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- do do
-- action.call ([ctx, req, res]) check should_not_occur: False end
-- end end
;note ;note
copyright: "Copyright (c) 1984-2011, Eiffel Software and others" copyright: "Copyright (c) 1984-2011, Eiffel Software and others"

View File

@@ -15,32 +15,74 @@ inherit
feature -- Access feature -- Access
authentication_required: BOOLEAN authentication_required (req: WGI_REQUEST): BOOLEAN
-- Is authentication required -- Is authentication required
-- might depend on the request environment -- might depend on the request environment
-- or the associated resources -- or the associated resources
deferred deferred
end end
description: detachable STRING
-- Optional descriptiong
feature -- Element change
set_description (s: like description)
-- Set `description' to `s'
do
description := s
end
feature -- Execution 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 -- Execute request handler
local
rescued: BOOLEAN
do do
if authentication_required and then not a_hdl_context.authenticated then if not rescued then
execute_unauthorized (a_hdl_context, req, res) if request_method_name_supported (req.request_method) then
if authentication_required (req) and then not ctx.authenticated 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
else else
Precursor (a_hdl_context, req, res) rescue_execute (ctx, req, res)
end end
rescue
rescued := True
retry
end end
execute_unauthorized (a_hdl_context: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER) execute_application (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
deferred
end
pre_execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
do
end
post_execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
do
end
rescue_execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
do
post_execute (ctx, req, res)
end
execute_unauthorized (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
do do
res.set_status_code ({HTTP_STATUS_CODE}.unauthorized) res.set_status_code ({HTTP_STATUS_CODE}.unauthorized)
res.write_header ({HTTP_STATUS_CODE}.unauthorized, <<["WWW-Authenticate", "Basic realm=%"Eiffel auth%""]>>) res.write_header ({HTTP_STATUS_CODE}.unauthorized, Void)
res.write_string ("Unauthorized") res.write_string ("Unauthorized")
end end
feature {NONE} -- Implementation feature {NONE} -- Implementation
supported_formats: INTEGER supported_formats: INTEGER
@@ -152,6 +194,116 @@ feature -- Element change: formats
supported_formats := supported_formats | f supported_formats := supported_formats | f
end 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_name)
end
if method_post_supported then
Result.extend (request_method_constants.method_post_name)
end
if method_put_supported then
Result.extend (request_method_constants.method_put_name)
end
if method_delete_supported then
Result.extend (request_method_constants.method_delete_name)
end
if method_head_supported then
Result.extend (request_method_constants.method_head_name)
end
end
method_get_supported: BOOLEAN
do
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.method_get)
end
method_post_supported: BOOLEAN
do
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.method_post)
end
method_put_supported: BOOLEAN
do
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.method_put)
end
method_delete_supported: BOOLEAN
do
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.method_delete)
end
method_head_supported: BOOLEAN
do
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.method_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}.method_get)
end
enable_request_method_post
do
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.method_post)
end
enable_request_method_put
do
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.method_put)
end
enable_request_method_delete
do
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.method_delete)
end
enable_request_method_head
do
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.method_head)
end
enable_request_method (m: INTEGER)
do
supported_request_methods := supported_request_methods | m
end
note note
copyright: "Copyright (c) 1984-2011, Eiffel Software and others" copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"

View File

@@ -29,11 +29,17 @@ feature -- Status report
feature -- Execution feature -- Execution
execute (a_hdl_context: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER) execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
do do
Precursor {REST_REQUEST_HANDLER} (a_hdl_context, req, res) Precursor {REST_REQUEST_HANDLER} (ctx, req, res)
end end
execute_application (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
do
check should_not_occur: False end
end
feature {NONE} -- Routing feature {NONE} -- Routing
router: REST_REQUEST_URI_ROUTER_I [H, C] router: REST_REQUEST_URI_ROUTER_I [H, C]

View File

@@ -25,13 +25,25 @@ create
feature -- Status report feature -- Status report
authentication_required: BOOLEAN authentication_required (req: WGI_REQUEST): BOOLEAN
do
Result := internal_authentication_required
end
feature {NONE} -- Implementation
internal_authentication_required: BOOLEAN
feature -- Execution feature -- Execution
execute (a_hdl_context: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER) execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
do do
Precursor {REST_REQUEST_HANDLER} (a_hdl_context, req, res) Precursor {REST_REQUEST_HANDLER} (ctx, req, res)
end
execute_application (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
do
check should_not_occur: False end
end end
feature {NONE} -- Routing feature {NONE} -- Routing

View File

@@ -35,7 +35,10 @@ feature {NONE} -- Initialization
feature -- Access feature -- Access
authentication_required: BOOLEAN = True authentication_required (req: WGI_REQUEST): BOOLEAN
do
Result := True
end
feature -- Execution feature -- Execution

View File

@@ -32,7 +32,9 @@ feature {NONE} -- Initialization
feature -- Access feature -- Access
authentication_required: BOOLEAN = False authentication_required (req: WGI_REQUEST): BOOLEAN
do
end
feature -- Execution feature -- Execution

View File

@@ -11,6 +11,13 @@ inherit
APP_REQUEST_HELPER APP_REQUEST_HELPER
feature {NONE} -- Initialization
initialize
-- Initialize various attributes
do
end
feature {NONE} -- Implementation feature {NONE} -- Implementation
wgi_value_iteration_to_string (cur: ITERATION_CURSOR [WGI_VALUE]; using_pre: BOOLEAN): STRING_8 wgi_value_iteration_to_string (cur: ITERATION_CURSOR [WGI_VALUE]; using_pre: BOOLEAN): STRING_8

View File

@@ -18,7 +18,6 @@ feature -- Initialization
make (act: like action) make (act: like action)
do do
action := act action := act
initialize
end end
feature -- Access feature -- Access
@@ -27,7 +26,7 @@ feature -- Access
feature -- Execution feature -- Execution
execute_application (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER) execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
do do
action.call ([ctx, req, res]) action.call ([ctx, req, res])
end end

View File

@@ -15,24 +15,12 @@ inherit
{NONE} all {NONE} all
end end
feature {NONE} -- Initialization
initialize
-- Initialize various attributes
do
end
feature -- Access
description: detachable STRING
-- Optional descriptiong
feature -- Status report feature -- Status report
is_valid_context (req: WGI_REQUEST): BOOLEAN is_valid_context (req: WGI_REQUEST): BOOLEAN
-- Is `req' valid context for current handler? -- Is `req' valid context for current handler?
do do
Result := request_method_name_supported (req.request_method) Result := True
end end
feature -- Execution feature -- Execution
@@ -41,49 +29,9 @@ feature -- Execution
-- Execute request handler -- Execute request handler
require require
is_valid_context: is_valid_context (req) is_valid_context: is_valid_context (req)
local
rescued: BOOLEAN
do
if not rescued then
if request_method_name_supported (req.request_method) then
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 (ctx, req, res)
end
rescue
rescued := True
retry
end
execute_application (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Execute request handler
deferred deferred
end end
pre_execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Operation processed before `execute'
do
--| To be redefined if needed
end
post_execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Operation processed after `execute'
do
--| To be redefined if needed
end
rescue_execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Operation processed after a rescue
do
--| To be redefined if needed
post_execute (ctx, req, res)
end
feature -- Execution: report feature -- Execution: report
url (req: WGI_REQUEST; a_base: detachable READABLE_STRING_8; args: detachable STRING; abs: BOOLEAN): STRING url (req: WGI_REQUEST; a_base: detachable READABLE_STRING_8; args: detachable STRING; abs: BOOLEAN): STRING
@@ -117,122 +65,6 @@ feature -- Execution: report
result_attached: Result /= Void result_attached: Result /= Void
end end
feature -- Element change
set_description (s: like description)
-- Set `description' to `s'
do
description := s
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_name)
end
if method_post_supported then
Result.extend (request_method_constants.method_post_name)
end
if method_put_supported then
Result.extend (request_method_constants.method_put_name)
end
if method_delete_supported then
Result.extend (request_method_constants.method_delete_name)
end
if method_head_supported then
Result.extend (request_method_constants.method_head_name)
end
end
method_get_supported: BOOLEAN
do
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.method_get)
end
method_post_supported: BOOLEAN
do
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.method_post)
end
method_put_supported: BOOLEAN
do
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.method_put)
end
method_delete_supported: BOOLEAN
do
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.method_delete)
end
method_head_supported: BOOLEAN
do
Result := request_method_id_supported ({HTTP_REQUEST_METHOD_CONSTANTS}.method_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}.method_get)
end
enable_request_method_post
do
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.method_post)
end
enable_request_method_put
do
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.method_put)
end
enable_request_method_delete
do
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.method_delete)
end
enable_request_method_head
do
enable_request_method ({HTTP_REQUEST_METHOD_CONSTANTS}.method_head)
end
enable_request_method (m: INTEGER)
do
supported_request_methods := supported_request_methods | m
end
note note
copyright: "2011-2011, Eiffel Software and others" copyright: "2011-2011, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"

View File

@@ -13,7 +13,7 @@ inherit
feature -- Execution feature -- Execution
execute_application (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER) execute (ctx: C; req: WGI_REQUEST; res: WGI_RESPONSE_BUFFER)
-- Execute request handler -- Execute request handler
local local
hdl: detachable H hdl: detachable H