def call(env)
@mutex.synchronize do
build_site
path = Rack::Utils::unescape(env['PATH_INFO'])
reps = site.items.map { |i| i.reps }.flatten
rep = reps.find do |r|
r.path == path ||
r.raw_path == site.config[:output_dir] + path
end
site.compile if rep
if path =~ /\/$/
possible_paths = site.config[:index_filenames].map { |f| path + f }
else
possible_paths = [ path ]
end
modified_path = possible_paths.find { |f| File.file?(site.config[:output_dir] + f) }
modified_path ||= path
puts "*** serving file #{modified_path}"
res = file_server.call(env.merge('PATH_INFO' => modified_path))
puts "*** done serving file #{modified_path}"
res
end
rescue StandardError, ScriptError => e
env['nanoc.stack'] = []
stack.reverse.each do |obj|
if obj.is_a?(Nanoc::ItemRep)
env['nanoc.stack'] << "[item] #{obj.item.identifier} (rep #{obj.name})"
else
env['nanoc.stack'] << "[layout] #{obj.identifier}"
end
end
raise e
end