class Webmachine::Decision::FSM
Implements the finite-state machine described by the Webmachine
sequence diagram.
Attributes
metadata[R]
request[R]
resource[R]
response[R]
Public Class Methods
new(resource, request, response)
click to toggle source
Calls superclass method
Webmachine::Trace::FSM::new
# File lib/webmachine/decision/fsm.rb, line 19 def initialize(resource, request, response) @resource, @request, @response = resource, request, response @metadata = {} super end
Public Instance Methods
run()
click to toggle source
Processes the request, iteratively invoking the decision methods in {Flow}.
# File lib/webmachine/decision/fsm.rb, line 26 def run state = Flow::START trace_request(request) loop do trace_decision(state) result = handle_exceptions { send(state) } case result when Integer # Response code respond(result) break when Symbol # Next state state = result else # You bwoke it raise InvalidResource, t('fsm_broke', state: state, result: result.inspect) end end rescue => e Webmachine.render_error(500, request, response, message: e.message) ensure trace_response(response) end
Private Instance Methods
handle_exceptions() { || ... }
click to toggle source
# File lib/webmachine/decision/fsm.rb, line 50 def handle_exceptions yield rescue Webmachine::RescuableException => e resource.handle_exception(e) 500 rescue MalformedRequest => e Webmachine.render_error(400, request, response, message: e.message) 400 end
respond(code, headers = {})
click to toggle source
# File lib/webmachine/decision/fsm.rb, line 60 def respond(code, headers = {}) response.code = code response.headers.merge!(headers) case code when 404 Webmachine.render_error(code, request, response) when 304 response.headers.delete(CONTENT_TYPE) add_caching_headers end response.code = handle_exceptions do resource.finish_request response.code end ensure_content_length(response) ensure_date_header(response) end