class WebConsole::Middleware

Constants

DEFAULT_OPTIONS
TEMPLATES_PATH
UNACCEPTABLE_REQUEST_MESSAGE
UNAVAILABLE_SESSION_MESSAGE

Public Class Methods

new(app, options = {}) click to toggle source
# File lib/web_console/middleware.rb, line 24
def initialize(app, options = {})
  @app     = app
  @options = DEFAULT_OPTIONS.merge(options)
end

Public Instance Methods

call(env) click to toggle source
# File lib/web_console/middleware.rb, line 29
def call(env)
  request = create_regular_or_whiny_request(env)
  return @app.call(env) unless request.from_whitelited_ip?

  if id = id_for_repl_session_update(request)
    return update_repl_session(id, request)
  elsif id = id_for_repl_session_stack_frame_change(request)
    return change_stack_trace(id, request)
  end

  status, headers, body = @app.call(env)

  if exception = env['web_console.exception']
    session = Session.from_exception(exception)
  elsif binding = env['web_console.binding']
    session = Session.from_binding(binding)
  end

  if session && request.acceptable_content_type?
    headers["X-Web-Console-Session-Id"] = session.id
    response = Rack::Response.new(body, status, headers)
    template = Template.new(env, session)

    response.write(template.render('index'))
    response.finish
  else
    [ status, headers, body ]
  end
end

Private Instance Methods

binding_change_re() click to toggle source
# File lib/web_console/middleware.rb, line 92
def binding_change_re
  @options[:binding_change_re]
end
change_stack_trace(id, request) click to toggle source
# File lib/web_console/middleware.rb, line 114
def change_stack_trace(id, request)
  json_response_with_session(id, request) do |session|
    session.switch_binding_to(request.params[:frame_id])

    { ok: true }
  end
end
create_regular_or_whiny_request(env) click to toggle source
# File lib/web_console/middleware.rb, line 83
def create_regular_or_whiny_request(env)
  request = Request.new(env)
  whiny_requests ? WhinyRequest.new(request) : request
end
id_for_repl_session_stack_frame_change(request) click to toggle source
# File lib/web_console/middleware.rb, line 102
def id_for_repl_session_stack_frame_change(request)
  if request.xhr? && request.post?
    binding_change_re.match(request.path_info) { |m| m[:id] }
  end
end
id_for_repl_session_update(request) click to toggle source
# File lib/web_console/middleware.rb, line 96
def id_for_repl_session_update(request)
  if request.xhr? && request.put?
    update_re.match(request.path_info) { |m| m[:id] }
  end
end
json_response(opts = {}) { || ... } click to toggle source
# File lib/web_console/middleware.rb, line 61
def json_response(opts = {})
  status  = opts.fetch(:status, 200)
  headers = { 'Content-Type' => 'application/json; charset = utf-8' }
  body    = yield.to_json

  Rack::Response.new(body, status, headers).finish
end
json_response_with_session(id, request, opts = {}) { |session| ... } click to toggle source
# File lib/web_console/middleware.rb, line 69
def json_response_with_session(id, request, opts = {})
  json_response(opts) do
    unless request.acceptable?
      return respond_with_unacceptable_request
    end

    unless session = Session.find(id)
      return respond_with_unavailable_session(id)
    end

    yield session
  end
end
respond_with_unacceptable_request() click to toggle source
# File lib/web_console/middleware.rb, line 128
def respond_with_unacceptable_request
  json_response(status: 406) do
    { error: UNACCEPTABLE_REQUEST_MESSAGE }
  end
end
respond_with_unavailable_session(id) click to toggle source
# File lib/web_console/middleware.rb, line 122
def respond_with_unavailable_session(id)
  json_response(status: 404) do
    { output: format(UNAVAILABLE_SESSION_MESSAGE, id: id)}
  end
end
update_re() click to toggle source
# File lib/web_console/middleware.rb, line 88
def update_re
  @options[:update_re]
end
update_repl_session(id, request) click to toggle source
# File lib/web_console/middleware.rb, line 108
def update_repl_session(id, request)
  json_response_with_session(id, request) do |session|
    { output: session.eval(request.params[:input]) }
  end
end