In a project using actionpack-xml_parser
, and implementing a modified version of Catching Invalid JSON Parse Errors with Rack Middleware to also handle XML errors, an upgrade to Rails 6 broke the handling of the ParseError
. Interestingly enough, JSON was being handled as expected.
TL;DR: The short answer to this is that config/initializers/wrap_parameters.rb
only had json
mentioned as a format. This can be remedied in the initializer or on a per controller basis. The entire app fix was just adding :xml
to the initializer:
ActiveSupport.on_load(:action_controller) do
wrap_parameters format: [:json, :xml]
end
In looking through the stack traces/call stack for where the parse error occurs (ActionDispatch::Http::Parameters#parse_formatted_parameters
) using the caller
array in the gem source and backtrace in the rescue
, I was able to catch that ActionController::Metal::ParamsWrapper#_wrapper_enabled?
was called for JSON, but not for XML. Ultimately, I was able to track down the difference to ActionController::Metal::ParamsWrapper#_wrapper_formats?
, which was only returning [:json]
, which led to the wrap_parameters
functionality in Rails.