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.