Sha256: 87328379b0d07454d62441752ef755e28612df9d9714481458146df6ca7568ba
Contents?: true
Size: 1.81 KB
Versions: 4
Compression:
Stored size: 1.81 KB
Contents
require 'rack' require 'listen' require 'better_errors' module Flutterby class Server def initialize(root) @root = root end def run!(port: 4004) # Set up listener listener = Listen.to(@root.fs_path) do |modified, added, removed| # puts "modified absolute path: #{modified}" # puts "added absolute path: #{added}" # puts "removed absolute path: #{removed}" Flutterby.logger.info "Change detected, reloading everything!" @root.reload! @root.stage! end # Set up Rack app BetterErrors.application_root = __dir__ this = self app = Rack::Builder.app do |app| app.use BetterErrors::Middleware app.run this end # Set up server server = Rack::Handler::WEBrick # Make sure we handle interrupts correctly trap('INT') do listener.stop server.shutdown end # Go! listener.start server.run app, Port: port, Logger: Flutterby.logger end def call(env) req = Rack::Request.new(env) res = Rack::Response.new([], 200, {}) # Look for target node in path registry if node = find_node_for_path(req.path) # Determine MIME type mime_type = MIME::Types.type_for(node.ext) || "text/plain" # Build response res.headers["Content-Type"] = mime_type res.body = [node.render(layout: true)] else res.status = 404 res.headers["Content-Type"] = "text/html" res.body = ["404"] end res end def find_node_for_path(path) if node = @root.find(path, public_only: true) # If the node is a folder, try and find its "index" node. # Otherwise, use the node directly. node.folder? ? node.find('index') : node end end end end
Version data entries
4 entries across 4 versions & 1 rubygems
Version | Path |
---|---|
flutterby-0.6.0 | lib/flutterby/server.rb |
flutterby-0.5.2 | lib/flutterby/server.rb |
flutterby-0.5.1 | lib/flutterby/server.rb |
flutterby-0.5.0 | lib/flutterby/server.rb |