class Camping::Server

Public Class Methods

logging_middleware() click to toggle source
# File lib/camping/server.rb, line 113
def logging_middleware
  lambda { |server|
    /CGI/.match?(server.server.name) || server.options[:quiet] ?  nil : [Camping::Firewatch, $stderr]
  }
end
new(*) click to toggle source
Calls superclass method
# File lib/camping/server.rb, line 88
def initialize(*)
  super
  @reloader = Camping::Reloader.new(options[:script]) do |app|
    if !app.options.has_key?(:dynamic_templates)
                  app.options[:dynamic_templates] = true
          end
  end
end

Public Instance Methods

app() click to toggle source

add the public directory as a Rack app serving files first, then the current value of self, which is our camping apps, as an app.

# File lib/camping/server.rb, line 179
def app
  Rack::Cascade.new([Rack::Files.new(public_dir), self], [405, 404, 403])
end
call(env) click to toggle source

call(env) res

How routing works

The first app added using Camping.goes is set at the root, we walk through the defined routes of the first app to see if there is a match. With no match we then walk through every other defined app. When we reach a matching route we call that app and Camping’s router handles the rest.

Mounting apps at different directories is now explicit by setting the url_prefix option:

camping.goes :Nuts          # Mounts Nuts at /
module Auth
   set :url_prefix, "auth/"
end
camping.goes :Auth          # Mounts Auth at /auth/
camping.goes :Blog          # Mounts Blog at /

Note that routes that you set explicitly with R are not prefixed. This us explicit control over routes:

module Auth::Controllers
   class Whatever < R '/thing/' # Mounts at /thing/
      def get
         render :some_view
      end
   end
end
# File lib/camping/server.rb, line 229
def call(env)
  if ENV['environment'] == 'development'
    @reloader.reload
  end

  # our switch statement iterates through possible app outcomes, no apps
  # loaded, one app loaded, or multiple apps loaded.
  case @reloader.apps.length
  when 0
    [200, {'content-type' => 'text/html'}, ["I'm sorry but no apps were found."]]
  when 1
    @reloader.apps.values.first.call(env) # When we have one
  else
    # 2 and up get special treatment
    @reloader.apps.each do |name, app|
      app.routes.each do |r|
        if (path_matches?(env['PATH_INFO'], r))
          return app.call(env)
          next
        end
      end
    end

    # Just return the first app if we didn't find a match.
    @reloader.apps.values.first.call(env)
  end
end
default_options() click to toggle source
Calls superclass method
# File lib/camping/server.rb, line 105
def default_options
  super.merge({
    :Port => 3301
  })
end
loader() click to toggle source
# File lib/camping/server.rb, line 97
def loader
  @reloader || nil
end
middleware() click to toggle source
Calls superclass method
# File lib/camping/server.rb, line 120
def middleware
  h = super
  h["development"] << [XSendfile]
  h["deployment"] << [XSendfile]
  h
end
opt_parser() click to toggle source
# File lib/camping/server.rb, line 101
def opt_parser
  Options.new
end
path_matches?(path, *reg) click to toggle source

path_matches? accepts a regular expression string in our case our apps and controllers

# File lib/camping/server.rb, line 186
def path_matches?(path, *reg)
  p = T.(path)
  reg.each do |r|
    return true if Regexp.new(T.(r)).match?(p) && p == T.(r)
  end
  false
end
public_dir() click to toggle source

defines the public directory to be /public

# File lib/camping/server.rb, line 173
def public_dir
  File.expand_path('../public', @reloader.file)
end
start(file = nil) click to toggle source

Starts the Camping Server. Camping server inherits from Rack::Server so referencing their documentation would be a good idea. @file: String, file location for a camp.rb file.

Calls superclass method
# File lib/camping/server.rb, line 130
def start(file = nil)
  commands = ARGV

  # Parse commands
  case commands[0]
  when "new"
    Camping::Commands.new_cmd(commands[1])
    exit
  end

  if options[:version] == true
    puts "Camping v#{Camping::VERSION}"
    exit
  end

  Dir['kindling/*.rb'].each do |kindling|
    require_relative File.expand_path(kindling)
  end

  @reloader.reload!
  r = @reloader

  if options[:routes] == true
    eval("self", TOPLEVEL_BINDING).meta_def(:reload!) { r.reload!; nil }
    ARGV.clear
    Camping::Commands.routes
    exit
  end

  if options[:server] == "console"
    puts "** Starting console"
    eval("self", TOPLEVEL_BINDING).meta_def(:reload!) { r.reload!; nil }
    ARGV.clear
    IRB.start
    exit
  else
    name = server.name[/\w+$/]
    puts "** Starting #{name} on #{options[:Host]}:#{options[:Port]}"
    super()
  end
end