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