lib/grape/middleware/formatter.rb in grape-0.2.0 vs lib/grape/middleware/formatter.rb in grape-0.2.1

- old
+ new

@@ -11,15 +11,15 @@ :formatters => {}, :content_types => {}, :parsers => {} } end - + def headers - env.dup.inject({}){|h,(k,v)| h[k.downcase[5..-1]] = v if k.downcase.start_with?('http_'); h} + env.dup.inject({}){|h,(k,v)| h[k.to_s.downcase[5..-1]] = v if k.to_s.downcase.start_with?('http_'); h} end - + def before fmt = format_from_extension || options[:format] || format_from_header || options[:default_format] if content_types.key?(fmt) if !env['rack.input'].nil? and (body = env['rack.input'].read).strip.length != 0 parser = parser_for fmt @@ -37,45 +37,44 @@ env['api.format'] = fmt else throw :error, :status => 406, :message => 'The requested format is not supported.' end end - + def format_from_extension parts = request.path.split('.') - hit = parts.last.to_sym - - if parts.size <= 1 - nil - else - hit + extension = parts.last.to_sym + + if parts.size > 1 && content_types.key?(extension) + return extension end + nil end - + def format_from_header mime_array.each do |t| if mime_types.key?(t) return mime_types[t] end end nil end - + def mime_array accept = headers['accept'] or return [] accept.gsub(/\b/,'').scan(%r((\w+/[\w+.-]+)(?:(?:;[^,]*?)?;\s*q=([\d.]+))?)).sort_by { |_, q| -q.to_f }.map {|mime, _| mime.sub(%r(vnd\.[^+]+\+), '') } end - + def after status, headers, bodies = *@app_response formatter = formatter_for env['api.format'] bodymap = bodies.collect do |body| formatter.call(body) end - headers['Content-Type'] = content_types[env['api.format']] + headers['Content-Type'] = content_types[env['api.format']] unless headers['Content-Type'] Rack::Response.new(bodymap, status, headers).to_a end end end end