Skip to content

HTTP::StateError: body has already been consumed #340

@petecheslock

Description

@petecheslock

When running the latest AppMap gem on the Mastodon project, a handful of rspec tests will fail when APPMAP=true and will pass when APPMAP=false.

My Appmap yaml

---
name: mastodon
language: ruby
appmap_dir: tmp/appmap
packages:
- path: app
- path: lib
exclude:
- Request::ClientLimit#body_with_limit
- Request::ClientLimit#truncated_body
- ActivityPub::FetchRepliesWorker#perform
Stack Trace of Error
 1) ActivityPub::FetchRepliesWorker perform performs a request if the collection URI is from the same host
     Failure/Error: while (chunk = readpartial)
     
     HTTP::StateError:
       body has already been consumed
     # ./.bundle/ruby/3.0.0/gems/http-5.1.1/lib/http/response/body.rb:67:in `stream!'
     # ./.bundle/ruby/3.0.0/gems/http-5.1.1/lib/http/response/body.rb:29:in `readpartial'
     # ./app/lib/request.rb:170:in `truncated_body'
     # ./app/lib/request.rb:183:in `body_with_limit'
     # ./app/helpers/jsonld_helper.rb:179:in `block in fetch_resource_without_id_validation'
     # ./app/lib/request.rb:73:in `perform'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/hook/method/ruby3.rb:40:in `bind_call'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/hook/method/ruby3.rb:40:in `do_call'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/hook/method/ruby3.rb:49:in `trace_call'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/hook/method/ruby3.rb:16:in `call'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/hook/method/ruby3.rb:63:in `block in hook_method_def'
     # ./app/helpers/jsonld_helper.rb:176:in `fetch_resource_without_id_validation'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/hook/method/ruby3.rb:40:in `bind_call'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/hook/method/ruby3.rb:40:in `do_call'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/hook/method/ruby3.rb:49:in `trace_call'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/hook/method/ruby3.rb:16:in `call'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/hook/method/ruby3.rb:63:in `block in hook_method_def'
     # ./app/services/activitypub/fetch_replies_service.rb:39:in `fetch_collection'
     # ./app/services/activitypub/fetch_replies_service.rb:21:in `collection_items'
     # ./app/services/activitypub/fetch_replies_service.rb:10:in `call'
     # ./app/workers/activitypub/fetch_replies_worker.rb:10:in `perform'
     # ./spec/workers/activitypub/fetch_replies_worker_spec.rb:25:in `block (3 levels) in <top (required)>'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/rspec.rb:251:in `instance_exec'
     # ./.bundle/ruby/3.0.0/gems/appmap-0.100.0/lib/appmap/rspec.rb:251:in `block in wrap_example_block'
     # ./.bundle/ruby/3.0.0/gems/webmock-3.18.1/lib/webmock/rspec.rb:37:in `block (2 levels) in <top (required)>'

To recreate:
Clone the forked version of Mastodon
Start docker and run

$ docker-compose up -d db redis 

Source the rspec env vars

$ source .env-rspec      

Setup the DB

bundle exec rails db:setup

Run one of the tests that will fail:

RAILS_ENV=test DISABLE_SPRING=true bundle exec rspec ./spec/workers/activitypub/fetch_replies_worker_spec.rb

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions