lib/grape/middleware/formatter.rb in grape-2.0.0 vs lib/grape/middleware/formatter.rb in grape-2.1.0

- old
+ new

@@ -1,13 +1,12 @@ # frozen_string_literal: true -require 'grape/middleware/base' - module Grape module Middleware class Formatter < Base CHUNKED = 'chunked' + FORMAT = 'format' def default_options { default_format: :txt, formatters: {}, @@ -24,11 +23,11 @@ return unless @app_response status, headers, bodies = *@app_response if Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include?(status) - @app_response + [status, headers, []] else build_formatted_response(status, headers, bodies) end end @@ -80,18 +79,18 @@ (request.post? || request.put? || request.patch? || request.delete?) && (!request.form_data? || !request.media_type) && !request.parseable_data? && (request.content_length.to_i.positive? || request.env[Grape::Http::Headers::HTTP_TRANSFER_ENCODING] == CHUNKED) - return unless (input = env[Grape::Env::RACK_INPUT]) + return unless (input = env[Rack::RACK_INPUT]) - input.rewind + rewind_input input body = env[Grape::Env::API_REQUEST_INPUT] = input.read begin read_rack_input(body) if body && !body.empty? ensure - input.rewind + rewind_input input end end # store parsed input in env['api.request.body'] def read_rack_input(body) @@ -101,16 +100,16 @@ parser = Grape::Parser.parser_for fmt, **options if parser begin body = (env[Grape::Env::API_REQUEST_BODY] = parser.call(body, env)) if body.is_a?(Hash) - env[Grape::Env::RACK_REQUEST_FORM_HASH] = if env.key?(Grape::Env::RACK_REQUEST_FORM_HASH) - env[Grape::Env::RACK_REQUEST_FORM_HASH].merge(body) - else - body - end - env[Grape::Env::RACK_REQUEST_FORM_INPUT] = env[Grape::Env::RACK_INPUT] + env[Rack::RACK_REQUEST_FORM_HASH] = if env.key?(Rack::RACK_REQUEST_FORM_HASH) + env[Rack::RACK_REQUEST_FORM_HASH].merge(body) + else + body + end + env[Rack::RACK_REQUEST_FORM_INPUT] = env[Rack::RACK_INPUT] end rescue Grape::Exceptions::Base => e raise e rescue StandardError => e throw :error, status: 400, message: e.message, backtrace: e.backtrace, original_exception: e @@ -139,11 +138,11 @@ end nil end def format_from_params - fmt = Rack::Utils.parse_nested_query(env[Grape::Http::Headers::QUERY_STRING])[Grape::Http::Headers::FORMAT] + fmt = Rack::Utils.parse_nested_query(env[Rack::QUERY_STRING])[FORMAT] # avoid symbol memory leak on an unknown format return fmt.to_sym if content_type_for(fmt) fmt end @@ -171,9 +170,13 @@ vendor_prefix_pattern = /vnd\.[^+]+\+/ accept.scan(accept_into_mime_and_quality) .sort_by { |_, quality_preference| -(quality_preference ? quality_preference.to_f : 1.0) } .flat_map { |mime, _| [mime, mime.sub(vendor_prefix_pattern, '')] } + end + + def rewind_input(input) + input.rewind if input.respond_to?(:rewind) end end end end