class Fuse::Server
Public Class Methods
new(options)
click to toggle source
# File lib/fuse/server.rb, line 5 def initialize(options) @options = options Fuse.log "Starting Fuse Server v#{Fuse::VERSION}", :success end
Public Instance Methods
call(env)
click to toggle source
# File lib/fuse/server.rb, line 10 def call(env) request = Rack::Request.new(env) result = nil status = 200 call_options = @options.merge Hash[request.GET.map{ |k, v| [k.to_sym, v] }] if @root && (asset = Fuse::Document::Asset.for(request.path)) log env, "Serve asset #{asset.path}" return asset.call(env) end begin doc = Fuse::Document.new(call_options) @root = doc.root result = doc.to_s log env, "Using #{doc.xsl_path} for transformation" if doc.xsl_path log env, "Rendered #{doc.source_path} (#{result.length} bytes)", :success rescue Fuse::Exception::SourceUnknown::TooManySources result = render_list($!.options, $!.option_name, request) log env, 'Multiple source document options', :notice rescue Fuse::Exception if $!.message result = render_error($!.message) log env, $!.message, :notice else raise end end if request.path == '/' if result.nil? log env, 'Not found', :error status = 404 result = render_error('Not found') end [status, {'Content-Type' => 'text/html'}, [result]] end
Private Instance Methods
log(env, message, *args)
click to toggle source
# File lib/fuse/server.rb, line 56 def log(env, message, *args) Fuse.log_file.write "#{Time.now.strftime '%Y-%m-%d %H:%M:%S'} [#{env['REMOTE_ADDR']}] GET #{env['REQUEST_PATH']} " Fuse.log message, *args end
render_body() { |h| ... }
click to toggle source
# File lib/fuse/server.rb, line 82 def render_body Nokogiri::HTML::Builder.new do |h| h.html { h.head { h.title { h.text 'Fuse' } } h.body { yield h } } end.to_html end
render_error(text)
click to toggle source
# File lib/fuse/server.rb, line 61 def render_error(text) render_body do |h| h.p { h.text text } end end
render_list(assets, key, request)
click to toggle source
# File lib/fuse/server.rb, line 67 def render_list(assets, key, request) render_body do |h| h.h3 { h.text "Choose #{key}:" } h.ul { assets.each do |asset| h.li { h.a(href: '?' + Rack::Utils.build_query(request.GET.merge(key.to_s => asset))) { h.text asset } } end } end end