diff --git a/examples/restbucksCRUD/src/resource/order_handler.e b/examples/restbucksCRUD/src/resource/order_handler.e index 16fba5bd..62287810 100644 --- a/examples/restbucksCRUD/src/resource/order_handler.e +++ b/examples/restbucksCRUD/src/resource/order_handler.e @@ -23,7 +23,7 @@ inherit WSF_RESOURCE_HANDLER_HELPER redefine - do_get, + do_get_head, do_post, do_put, do_delete @@ -53,27 +53,21 @@ feature -- API DOC feature -- HTTP Methods - do_get (req: WSF_REQUEST; res: WSF_RESPONSE) - -- 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 Condition GET and the resource does not change we send a - -- 304, Resource not modifed + do_get_head (a_req: WSF_REQUEST; a_res: WSF_RESPONSE; a_is_get: BOOLEAN) + -- local - id : STRING + id: STRING do - if attached req.orig_path_info as orig_path then + if attached a_req.orig_path_info as orig_path then id := get_order_id_from_path (orig_path) if attached retrieve_order (id) as l_order then - if is_conditional_get (req, l_order) then - handle_resource_not_modified_response ("The resource" + orig_path + "does not change", req, res) + if is_conditional_get (a_req, l_order) then + handle_resource_not_modified_response ("The resource" + orig_path + "does not change", a_req, a_res) else - compute_response_get (req, res, l_order) + compute_response_get_head (a_req, a_res, l_order, a_is_get) end else - handle_resource_not_found_response ("The following resource" + orig_path + " is not found ", req, res) + handle_resource_not_found_response ("The following resource" + orig_path + " is not found ", a_req, a_res) end end end @@ -93,7 +87,7 @@ feature -- HTTP Methods end end - compute_response_get (req: WSF_REQUEST; res: WSF_RESPONSE; l_order : ORDER) + compute_response_get_head (a_req: WSF_REQUEST; a_res: WSF_RESPONSE; l_order: ORDER; a_is_get: BOOLEAN) local h: HTTP_HEADER l_msg : STRING @@ -105,13 +99,15 @@ feature -- HTTP Methods if attached {JSON_VALUE} json.value (l_order) as jv then l_msg := jv.representation h.put_content_length (l_msg.count) - if attached req.request_time as time then + if attached a_req.request_time as time then h.add_header ("Date:" + time.formatted_out ("ddd,[0]dd mmm yyyy [0]hh:[0]mi:[0]ss.ff2") + " GMT") end h.add_header ("etag:" + etag_utils.md5_digest (l_order.out)) - res.set_status_code ({HTTP_STATUS_CODE}.ok) - res.put_header_text (h.string) - res.put_string (l_msg) + a_res.set_status_code ({HTTP_STATUS_CODE}.ok) + a_res.put_header_text (h.string) + if a_is_get then + a_res.put_string (l_msg) + end end end diff --git a/library/server/wsf/extension/wsf_method_handler.e b/library/server/wsf/extension/wsf_method_handler.e new file mode 100644 index 00000000..8176ebef --- /dev/null +++ b/library/server/wsf/extension/wsf_method_handler.e @@ -0,0 +1,24 @@ +note + + description: "Conforming handler for any HTTP 1.1 standard method" + + author: "Colin Adams" + date: "$Date$" + revision: "$Revision$" + +deferred class WSF_METHOD_HANDLER + +feature -- Method + + do_method (a_req: WSF_REQUEST; a_res: WSF_RESPONSE) + -- Respond to `a_req' using `a_res'. + require + a_req_not_void: a_req /= Void + a_res_not_void: a_res /= Void + deferred + ensure + + end + +end + diff --git a/library/server/wsf/extension/wsf_method_handlers.e b/library/server/wsf/extension/wsf_method_handlers.e new file mode 100644 index 00000000..4552279d --- /dev/null +++ b/library/server/wsf/extension/wsf_method_handlers.e @@ -0,0 +1,55 @@ +note + + description: "Conforming handlers for HTTP 1.1 standard methods" + + author: "Colin Adams" + date: "$Date$" + revision: "$Revision$" + +deferred class WSF_METHOD_HANDLERS + +inherit + + WSF_METHOD_HANDLER + rename + do_method as do_get + select + do_get + end + + WSF_METHOD_HANDLER + rename + do_method as do_put + end + + WSF_METHOD_HANDLER + rename + do_method as do_put + end + + WSF_METHOD_HANDLER + rename + do_method as do_connect + end + + WSF_METHOD_HANDLER + rename + do_method as do_head + end + + WSF_METHOD_HANDLER + rename + do_method as do_options + end + + WSF_METHOD_HANDLER + rename + do_method as do_trace + end + +feature -- Method + + +end + + diff --git a/library/server/wsf/extension/wsf_resource_handler_helper.e b/library/server/wsf/extension/wsf_resource_handler_helper.e index 0f1f0732..6c432b05 100644 --- a/library/server/wsf/extension/wsf_resource_handler_helper.e +++ b/library/server/wsf/extension/wsf_resource_handler_helper.e @@ -4,13 +4,16 @@ note date: "$Date$" revision: "$Revision$" -class - WSF_RESOURCE_HANDLER_HELPER +class WSF_RESOURCE_HANDLER_HELPER + +inherit + + WSF_METHOD_HANDLERS feature -- Execute template execute_methods (req: WSF_REQUEST; res: WSF_RESPONSE) - -- Execute request and dispatch according to the request method + -- Execute request and dispatch according to the request method. local m: READABLE_STRING_8 do @@ -44,16 +47,31 @@ feature -- Method Get do_get (req, res) end - do_get (req: WSF_REQUEST; res: WSF_RESPONSE) + frozen do_get (req: WSF_REQUEST; res: WSF_RESPONSE) -- Using GET to retrieve resource information. - -- If the GET request is SUCCESS, we response with - -- 200 OK, and a representation of the person + -- If the GET request is SUCCESS, we respond with + -- 200 OK, and a representation of the resource. -- If the GET request is not SUCCESS, we response with -- 404 Resource not found -- If is a Condition GET and the resource does not change we send a -- 304, Resource not modifed do - handle_not_implemented ("Method GET not implemented", req, res) + do_get_head (req, res, True) + end + + do_get_head (a_req: WSF_REQUEST; a_res: WSF_RESPONSE; a_is_get: BOOLEAN) + -- Using GET or HEAD to retrieve resource information. + -- If the GET or HEAD request is SUCCESS, we respond with + -- 200 OK, and WITH/WITHOUT (for GET/HEAD respectively) a representation of the resource + -- If the GET or HEAD request is not SUCCESS, we respond with + -- 404 Resource not found. + -- If Conditional GET or HEAD and the resource does not change we send a + -- 304, Resource not modifed. + do + handle_not_implemented ("Methods GET and HEAD not implemented", a_req, a_res) + ensure + all_postconditions_for_do_get: a_is_get implies True + all_postconditions_for_do_head: not a_is_get implies True end feature -- Method Post @@ -139,16 +157,16 @@ feature -- Method HEAD do_head (req, res) end - do_head (req: WSF_REQUEST; res: WSF_RESPONSE) + frozen do_head (req: WSF_REQUEST; res: WSF_RESPONSE) -- Using HEAD to retrieve resource information. - -- If the HEAD request is SUCCESS, we response with - -- 200 OK, and WITHOUT a representation of the person - -- If the HEAD request is not SUCCESS, we response with - -- 404 Resource not found - -- If is a Condition HEAD and the resource does not change we send a - -- 304, Resource not modifed + -- If the HEAD request is SUCCESS, we respond with + -- 200 OK, and WITHOUT a representation of the resource. + -- If the HEAD request is not SUCCESS, we respond with + -- 404 Resource not found. + -- If Conditional HEAD and the resource does not change we send a + -- 304, Resource not modifed. do - handle_not_implemented ("Method HEAD not implemented", req, res) + do_get_head (req, res, False) end feature -- Method OPTIONS @@ -172,6 +190,7 @@ feature -- Method TRACE do_trace (req: WSF_REQUEST; res: WSF_RESPONSE) do + -- TODO - implement frozen, as there is only one permitted semantic. handle_not_implemented ("Method TRACE not implemented", req, res) end