Sha256: e05bd9a17a3be380c281e0ce877685ef67a22002a3740404031209e3f9a62c36

Contents?: true

Size: 1.38 KB

Versions: 2

Compression:

Stored size: 1.38 KB

Contents

module G5K
  module Rack
    #
    # A Rack middleware for automatically adding a <tt>format</tt> token at the end of the request path
    # when there is none. It can detect formats passed in the HTTP_ACCEPT header to populate this token.
    # 
    # e.g.:
    #   GET /some/resource HTTP/1.1
    #   Accept: application/json
    # -> 
    #   GET /some/resource.json HTTP/1.1
    #   Accept: application/json
    # 
    # You can add custom types with this kind of function (taken from sinatra):
    #   def mime(ext, type)
    #     ext = ".#{ext}" unless ext.to_s[0] == ?.
    #     Rack::Mime::MIME_TYPES[ext.to_s] = type
    #   end
    # and then:
    #   mime :json, 'application/json'
    #
    # Note: it does not take into account multiple media types in the Accept header.
    # The first media type takes precedence over all the others.
    #
    # MIT-License - Cyril Rohr
    #
    class AcceptFormat
      # Constants
      DEFAULT_EXTENSION = ".html"

      def initialize(app)
        @app = app
      end
    
      def call(env)
        req = Rack::Request.new(env)
        unless req.path_info =~ /(.*)\.(.+)/
          accept = env['HTTP_ACCEPT'].scan(/[^;,\s]*\/[^;,\s]*/)[0] rescue ""
          extension =  Rack::Mime::MIME_TYPES.invert[accept] || DEFAULT_EXTENSION
          req.path_info = req.path_info+"#{extension}"
        end
        @app.call(env)
      end    
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
cryx-g5k-0.1.0 lib/g5k/rack/accept_format.rb
cryx-g5k-0.2.0 lib/g5k/rack/accept_format.rb