Methods

Sinatra::RespondTo

Constants

Version

Public Class Methods

registered(app) click to toggle source
# File lib/sinatra/respond_to.rb, line 10
def self.registered(app)
  app.helpers RespondTo::Helpers

  app.set :default_content, :html
  app.set :assume_xhr_is_js, true

  # We remove the trailing extension so routes
  # don't have to be of the style
  #
  #   get '/resouce.:format'
  #
  # They can instead be of the style
  #
  #   get '/resource'
  #
  # and the format will automatically be available in <tt>format</tt>
  app.before do
    # Let through sinatra image urls in development
    next if self.class.development? && request.path_info =~ %{/__sinatra__/.*?.png}

    unless settings.static? && settings.public_folder? && (request.get? || request.head?) && static_file?(request.path_info)
      if request.params.has_key? 'format'
        format params['format']

        # Rewrite the accept header with the determined format to allow
        # downstream middleware to make use the the mime type
        env['HTTP_ACCEPT'] = ::Sinatra::Base.mime_type(format)
        request.accept.replace [env['HTTP_ACCEPT']]
      else
        # Consider first Accept type as default, otherwise
        # fall back to settings.default_content
        default_content = Rack::Mime::MIME_TYPES.invert[request.accept.first]
        default_content = default_content ? default_content[1..-1] : settings.default_content
        
        # Special case, as the specified default_content may use a different symbol than that
        # found through lookup based on Content-Type
        default_content = settings.default_content if
          default_content != settings.default_content &&
          ::Sinatra::Base.mime_type(default_content) == ::Sinatra::Base.mime_type(settings.default_content)

        ext = $1 if request.path_info.match(%{\.([^\./]+)$})
        if ext
          # Sinatra relies on a side-effect from path_info= to determine
          # its routes. A direct string change (e.g., sub!) would bypass
          # that and fail to have the effect we're looking for.
          request.path_info = request.path_info[0..-(ext.length+2)]

          format ext

          # Rewrite the accept header with the determined format to allow
          # downstream middleware to make use the the mime type
          env['HTTP_ACCEPT'] = ::Sinatra::Base.mime_type(format)
          request.accept.replace [env['HTTP_ACCEPT']]
        else
          format(request.xhr? && settings.assume_xhr_is_js? ? :js : default_content)
        end
      end
    end
  end

  app.configure :development do |dev|
    dev.error UnhandledFormat do
      content_type :html, :charset => 'utf-8'

      (          <!DOCTYPE html>          <html>          <head>            <style type="text/css">            body { text-align:center;font-family:helvetica,arial;font-size:22px;              color:#888;margin:20px}            #c {margin:0 auto;width:500px;text-align:left}            </style>          </head>          <body>            <h2>Sinatra doesn't know this ditty.</h2>            <img src='/__sinatra__/404.png'>            <div id="c">              Try this:              <pre>#{request.request_method.downcase} '#{request.path_info}' do\n  respond_to do |wants|\n    wants.#{format} { "Hello World" }\n  end\nend</pre>            </div>          </body>          </html>).gsub(/^ {10}/, '')
    end

    dev.error MissingTemplate do
      content_type :html, :charset => 'utf-8'
      response.status = 500

      engine = request.env['sinatra.error'].message.split('.').last
      engine = 'haml' unless ['haml', 'builder', 'erb'].include? engine

      path = File.basename(request.path_info)
      path = "root" if path.nil? || path.empty?

      format = engine == 'builder' ? 'xml' : 'html'

      layout = case engine
               when 'haml' then "!!!\n%html\n  %body= yield"
               when 'erb' then "<html>\n  <body>\n    <%= yield %>\n  </body>\n</html>"
               when 'builder' then "xml << yield"
               end

      layout = "<small>app.#{format}.#{engine}</small>\n<pre>#{escape_html(layout)}</pre>"

      (          <!DOCTYPE html>          <html>          <head>            <style type="text/css">            body { text-align:center;font-family:helvetica,arial;font-size:22px;              color:#888;margin:20px}            #c {margin:0 auto;width:500px;text-align:left;}            small {float:right;clear:both;}            pre {clear:both;}            </style>          </head>          <body>            <h2>Sinatra can't find #{request.env['sinatra.error'].message}</h2>            <img src='/__sinatra__/500.png'>            <div id="c">              Try this:<br />              #{layout}              <small>#{path}.#{format}.#{engine}</small>              <pre>Hello World!</pre>              <small>application.rb</small>              <pre>#{request.request_method.downcase} '#{request.path_info}' do\n  respond_to do |wants|\n    wants.#{engine == 'builder' ? 'xml' : 'html'} { #{engine} :#{path}#{",\n#{' '*32}layout => :app" if layout} }\n  end\nend</pre>            </div>          </body>          </html>).gsub(/^ {10}/, '')
    end
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.