Falcon 'disappears' the request body
I have a Rails 8 application running a Grape API via the routes.rb method. When an API request is made with a JSON body the body doesn't make it to the Grape API in any form whatsoever. (It'll show up with Puma).
Is there a method I need to call to get the request body from Falcon?
Edit: This doesn't affect post params. It is specifically if you send a json body:
curl -k -X POST http://api.localhost.local:3000/api/auxilium/tickets \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{ "data": { "type": "ticket", "attributes": { "subject": "Test Ticket", "body": "This is a test", "ide_version": "1.0.0", "tag": "support-request" }, "relationships": { "uploads": { "data": [ { "id": "s2ds12q", "type": "upload" } ] } } } }'
edit2: Stock Rails application I can duplicate the error on a Rails controller that just renders a happy: true json response and we get back a bigger error:
`Information for cause: TypeError (no implicit conversion of nil into String):
json (2.12.2) lib/json/common.rb:338:in 'JSON::Ext::Parser.parse' json (2.12.2) lib/json/common.rb:338:in 'JSON.parse' activesupport (8.0.1) lib/active_support/json/decoding.rb:23:in 'ActiveSupport::JSON.decode' actionpack (8.0.1) lib/action_dispatch/http/parameters.rb:14:in 'block in module:Parameters' actionpack (8.0.1) lib/action_dispatch/http/parameters.rb:95:in 'ActionDispatch::Http::Parameters#parse_formatted_parameters' actionpack (8.0.1) lib/action_dispatch/http/request.rb:412:in 'block in ActionDispatch::Request#POST' rack (3.1.16) lib/rack/request.rb:107:in 'Hash#fetch' rack (3.1.16) lib/rack/request.rb:107:in 'Rack::Request::Env#fetch_header' actionpack (8.0.1) lib/action_dispatch/http/request.rb:408:in 'ActionDispatch::Request#POST' actionpack (8.0.1) lib/action_dispatch/http/parameters.rb:57:in 'ActionDispatch::Http::Parameters#parameters' actionpack (8.0.1) lib/action_controller/metal/strong_parameters.rb:1522:in 'ActionController::StrongParameters#params' actionpack (8.0.1) lib/action_controller/metal/request_forgery_protection.rb:606:in 'ActionController::RequestForgeryProtection#form_authenticity_param' actionpack (8.0.1) lib/action_controller/metal/request_forgery_protection.rb:475:in 'ActionController::RequestForgeryProtection#request_authenticity_tokens' actionpack (8.0.1) lib/action_controller/metal/request_forgery_protection.rb:468:in 'ActionController::RequestForgeryProtection#any_authenticity_token_valid?' actionpack (8.0.1) lib/action_controller/metal/request_forgery_protection.rb:463:in 'ActionController::RequestForgeryProtection#verified_request?' actionpack (8.0.1) lib/action_controller/metal/request_forgery_protection.rb:392:in 'ActionController::RequestForgeryProtection#verify_authenticity_token' activesupport (8.0.1) lib/active_support/callbacks.rb:361:in 'block in ActiveSupport::Callbacks::CallTemplate::MethodCall#make_lambda' activesupport (8.0.1) lib/active_support/callbacks.rb:178:in 'block in ActiveSupport::Callbacks::Filters::Before#call' actionpack (8.0.1) lib/abstract_controller/callbacks.rb:34:in 'block (2 levels) in module:Callbacks' activesupport (8.0.1) lib/active_support/callbacks.rb:179:in 'ActiveSupport::Callbacks::Filters::Before#call' activesupport (8.0.1) lib/active_support/callbacks.rb:558:in 'block in ActiveSupport::Callbacks::CallbackSequence#invoke_before' activesupport (8.0.1) lib/active_support/callbacks.rb:558:in 'Array#each' activesupport (8.0.1) lib/active_support/callbacks.rb:558:in 'ActiveSupport::Callbacks::CallbackSequence#invoke_before' activesupport (8.0.1) lib/active_support/callbacks.rb:118:in 'block in ActiveSupport::Callbacks#run_callbacks' turbo-rails (2.0.16) lib/turbo-rails.rb:24:in 'Turbo.with_request_id' turbo-rails (2.0.16) app/controllers/concerns/turbo/request_id_tracking.rb:10:in 'Turbo::RequestIdTracking#turbo_tracking_request_id' activesupport (8.0.1) lib/active_support/callbacks.rb:129:in 'block in ActiveSupport::Callbacks#run_callbacks' actiontext (8.0.1) lib/action_text/rendering.rb:25:in 'ActionText::Rendering::ClassMethods#with_renderer' actiontext (8.0.1) lib/action_text/engine.rb:71:in 'block (4 levels) in class:Engine' activesupport (8.0.1) lib/active_support/callbacks.rb:129:in 'BasicObject#instance_exec' activesupport (8.0.1) lib/active_support/callbacks.rb:129:in 'block in ActiveSupport::Callbacks#run_callbacks' activesupport (8.0.1) lib/active_support/callbacks.rb:140:in 'ActiveSupport::Callbacks#run_callbacks' actionpack (8.0.1) lib/abstract_controller/callbacks.rb:260:in 'AbstractController::Callbacks#process_action' actionpack (8.0.1) lib/action_controller/metal/rescue.rb:27:in 'ActionController::Rescue#process_action' actionpack (8.0.1) lib/action_controller/metal/instrumentation.rb:76:in 'block in ActionController::Instrumentation#process_action' activesupport (8.0.1) lib/active_support/notifications.rb:210:in 'block in ActiveSupport::Notifications.instrument' activesupport (8.0.1) lib/active_support/notifications/instrumenter.rb:58:in 'ActiveSupport::Notifications::Instrumenter#instrument' activesupport (8.0.1) lib/active_support/notifications.rb:210:in 'ActiveSupport::Notifications.instrument' actionpack (8.0.1) lib/action_controller/metal/instrumentation.rb:75:in 'ActionController::Instrumentation#process_action' actionpack (8.0.1) lib/action_controller/metal/params_wrapper.rb:259:in 'ActionController::ParamsWrapper#process_action' activerecord (8.0.1) lib/active_record/railties/controller_runtime.rb:39:in 'ActiveRecord::Railties::ControllerRuntime#process_action' actionpack (8.0.1) lib/abstract_controller/base.rb:163:in 'AbstractController::Base#process' actionview (8.0.1) lib/action_view/rendering.rb:40:in 'ActionView::Rendering#process' actionpack (8.0.1) lib/action_controller/metal.rb:252:in 'ActionController::Metal#dispatch' actionpack (8.0.1) lib/action_controller/metal.rb:335:in 'ActionController::Metal.dispatch' actionpack (8.0.1) lib/action_dispatch/routing/route_set.rb:67:in 'ActionDispatch::Routing::RouteSet::Dispatcher#dispatch' actionpack (8.0.1) lib/action_dispatch/routing/route_set.rb:50:in 'ActionDispatch::Routing::RouteSet::Dispatcher#serve' actionpack (8.0.1) lib/action_dispatch/journey/router.rb:53:in 'block in ActionDispatch::Journey::Router#serve' actionpack (8.0.1) lib/action_dispatch/journey/router.rb:133:in 'block in ActionDispatch::Journey::Router#find_routes' actionpack (8.0.1) lib/action_dispatch/journey/router.rb:126:in 'Array#each' actionpack (8.0.1) lib/action_dispatch/journey/router.rb:126:in 'ActionDispatch::Journey::Router#find_routes' actionpack (8.0.1) lib/action_dispatch/journey/router.rb:34:in 'ActionDispatch::Journey::Router#serve' actionpack (8.0.1) lib/action_dispatch/routing/route_set.rb:908:in 'ActionDispatch::Routing::RouteSet#call' omniauth (2.1.3) lib/omniauth/strategy.rb:202:in 'OmniAuth::Strategy#call!' omniauth (2.1.3) lib/omniauth/strategy.rb:169:in 'OmniAuth::Strategy#call' actionpack (8.0.1) lib/action_dispatch/middleware/static.rb:27:in 'ActionDispatch::Static#call' omniauth (2.1.3) lib/omniauth/strategy.rb:202:in 'OmniAuth::Strategy#call!' omniauth (2.1.3) lib/omniauth/strategy.rb:169:in 'OmniAuth::Strategy#call' omniauth (2.1.3) lib/omniauth/strategy.rb:202:in 'OmniAuth::Strategy#call!' omniauth (2.1.3) lib/omniauth/strategy.rb:169:in 'OmniAuth::Strategy#call' omniauth (2.1.3) lib/omniauth/strategy.rb:202:in 'OmniAuth::Strategy#call!' omniauth (2.1.3) lib/omniauth/strategy.rb:169:in 'OmniAuth::Strategy#call' omniauth (2.1.3) lib/omniauth/strategy.rb:202:in 'OmniAuth::Strategy#call!' omniauth (2.1.3) lib/omniauth/strategy.rb:169:in 'OmniAuth::Strategy#call' omniauth (2.1.3) lib/omniauth/strategy.rb:202:in 'OmniAuth::Strategy#call!' omniauth (2.1.3) lib/omniauth/strategy.rb:169:in 'OmniAuth::Strategy#call' omniauth (2.1.3) lib/omniauth/strategy.rb:202:in 'OmniAuth::Strategy#call!' omniauth (2.1.3) lib/omniauth/strategy.rb:169:in 'OmniAuth::Strategy#call' omniauth (2.1.3) lib/omniauth/builder.rb:44:in 'OmniAuth::Builder#call' rack-attack (6.7.0) lib/rack/attack.rb:103:in 'Rack::Attack#call' scout_apm (5.6.4) lib/scout_apm/instant/middleware.rb:55:in 'ScoutApm::Instant::Middleware#call' scout_apm (5.6.4) lib/scout_apm/middleware.rb:20:in 'ScoutApm::Middleware#call' warden (1.2.9) lib/warden/manager.rb:36:in 'block in Warden::Manager#call' warden (1.2.9) lib/warden/manager.rb:34:in 'Kernel#catch' warden (1.2.9) lib/warden/manager.rb:34:in 'Warden::Manager#call' rack (3.1.16) lib/rack/tempfile_reaper.rb:20:in 'Rack::TempfileReaper#call' rack (3.1.16) lib/rack/etag.rb:29:in 'Rack::ETag#call' rack (3.1.16) lib/rack/conditional_get.rb:43:in 'Rack::ConditionalGet#call' rack (3.1.16) lib/rack/head.rb:15:in 'Rack::Head#call' actionpack (8.0.1) lib/action_dispatch/http/permissions_policy.rb:38:in 'ActionDispatch::PermissionsPolicy::Middleware#call' actionpack (8.0.1) lib/action_dispatch/http/content_security_policy.rb:38:in 'ActionDispatch::ContentSecurityPolicy::Middleware#call' rack-session (2.1.1) lib/rack/session/abstract/id.rb:274:in 'Rack::Session::Abstract::Persisted#context' rack-session (2.1.1) lib/rack/session/abstract/id.rb:268:in 'Rack::Session::Abstract::Persisted#call' actionpack (8.0.1) lib/action_dispatch/middleware/cookies.rb:706:in 'ActionDispatch::Cookies#call' activerecord (8.0.1) lib/active_record/migration.rb:671:in 'ActiveRecord::Migration::CheckPending#call' actionpack (8.0.1) lib/action_dispatch/middleware/callbacks.rb:31:in 'block in ActionDispatch::Callbacks#call' activesupport (8.0.1) lib/active_support/callbacks.rb:100:in 'ActiveSupport::Callbacks#run_callbacks' actionpack (8.0.1) lib/action_dispatch/middleware/callbacks.rb:30:in 'ActionDispatch::Callbacks#call' actionpack (8.0.1) lib/action_dispatch/middleware/executor.rb:16:in 'ActionDispatch::Executor#call' actionpack (8.0.1) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in 'ActionDispatch::ActionableExceptions#call' airbrake (13.0.5) lib/airbrake/rack/middleware.rb:34:in 'Airbrake::Rack::Middleware#call!' airbrake (13.0.5) lib/airbrake/rack/middleware.rb:23:in 'Airbrake::Rack::Middleware#call' actionpack (8.0.1) lib/action_dispatch/middleware/debug_exceptions.rb:31:in 'ActionDispatch::DebugExceptions#call' web-console (4.2.1) lib/web_console/middleware.rb:132:in 'WebConsole::Middleware#call_app' web-console (4.2.1) lib/web_console/middleware.rb:28:in 'block in WebConsole::Middleware#call' web-console (4.2.1) lib/web_console/middleware.rb:17:in 'Kernel#catch' web-console (4.2.1) lib/web_console/middleware.rb:17:in 'WebConsole::Middleware#call' actionpack (8.0.1) lib/action_dispatch/middleware/show_exceptions.rb:32:in 'ActionDispatch::ShowExceptions#call' lograge (0.14.0) lib/lograge/rails_ext/rack/logger.rb:18:in 'Rails::Rack::Logger#call_app' railties (8.0.1) lib/rails/rack/logger.rb:29:in 'Rails::Rack::Logger#call' actionpack (8.0.1) lib/action_dispatch/middleware/remote_ip.rb:96:in 'ActionDispatch::RemoteIp#call' request_store (1.7.0) lib/request_store/middleware.rb:19:in 'RequestStore::Middleware#call' actionpack (8.0.1) lib/action_dispatch/middleware/request_id.rb:34:in 'ActionDispatch::RequestId#call' rack (3.1.16) lib/rack/method_override.rb:28:in 'Rack::MethodOverride#call' rack (3.1.16) lib/rack/runtime.rb:24:in 'Rack::Runtime#call' actionpack (8.0.1) lib/action_dispatch/middleware/server_timing.rb:61:in 'block in ActionDispatch::ServerTiming#call' actionpack (8.0.1) lib/action_dispatch/middleware/server_timing.rb:26:in 'ActionDispatch::ServerTiming::Subscriber#collect_events' actionpack (8.0.1) lib/action_dispatch/middleware/server_timing.rb:60:in 'ActionDispatch::ServerTiming#call' actionpack (8.0.1) lib/action_dispatch/middleware/executor.rb:16:in 'ActionDispatch::Executor#call' actionpack (8.0.1) lib/action_dispatch/middleware/static.rb:27:in 'ActionDispatch::Static#call' rack (3.1.16) lib/rack/sendfile.rb:114:in 'Rack::Sendfile#call' actionpack (8.0.1) lib/action_dispatch/middleware/host_authorization.rb:143:in 'ActionDispatch::HostAuthorization#call' utf8-cleaner (1.0.0) lib/utf8-cleaner/middleware.rb:21:in 'UTF8Cleaner::Middleware#call' rack-mini-profiler (4.0.0) lib/mini_profiler.rb:334:in 'Rack::MiniProfiler#call' rack-cors (3.0.0) lib/rack/cors.rb:102:in 'Rack::Cors#call' railties (8.0.1) lib/rails/engine.rb:535:in 'Rails::Engine#call' protocol-rack (0.14.0) lib/protocol/rack/adapter/generic.rb:146:in 'Protocol::Rack::Adapter::Generic#call' protocol-http (0.50.1) lib/protocol/http/middleware.rb:53:in 'Protocol::HTTP::Middleware#call' falcon (0.51.1) lib/falcon/server.rb:66:in 'Falcon::Server#call' async-http (0.89.0) lib/async/http/server.rb:58:in 'block in Async::HTTP::Server#accept' async-http (0.89.0) lib/async/http/protocol/http1/server.rb:72:in 'Async::HTTP::Protocol::HTTP1::Server#each' async-http (0.89.0) lib/async/http/server.rb:50:in 'Async::HTTP::Server#accept' falcon (0.51.1) lib/falcon/server.rb:57:in 'Falcon::Server#accept' io-endpoint (0.15.2) lib/io/endpoint/wrapper.rb:216:in 'block (2 levels) in IO::Endpoint::Wrapper#accept' async (2.25.0) lib/async/task.rb:201:in 'block in Async::Task#run' async (2.25.0) lib/async/task.rb:439:in 'block in Async::Task#schedule' `