require 'rack' module CassetteRack class Engine def call(env) controller(env) end class << self def prototype @prototype ||= new end def call(env) prototype.call(env) end end private def controller(env) request = Rack::Request.new(env) params = Hash[URI.decode_www_form(request.query_string)] body = Hash[URI.decode_www_form(request.body.read)] drawer = CassetteRack::Drawer.new(request.path_info) case body['_method'] when 'delete' request_method = body['_method'].upcase else request_method = request.request_method end case request_method when 'DELETE' drawer.delete end case params['response'] when 'preview' template = Liquid::Template.parse(CassetteRack::Configure.preview_template) body = template.render('body' => drawer.http.response.body) else tree = CassetteRack::Tree.create(CassetteRack::Configure.source_path) cassettes_tag = render_branch(tree, request.script_name, request.path_info) cassette_tag = render_leaf(drawer, request.script_name + request.path_info) template = Liquid::Template.parse(CassetteRack::Configure.application_template) body = template.render('cassettes_tag' => cassettes_tag, 'cassette_tag' => cassette_tag) end status = 200 headers = {'Content-Type' => 'text/html'} [status, headers, [body]] end def render_branch(node, script_name, path_info) raw = "