Search code examples
ruby-on-railsrackrack-middleware

Alter response.body in Rack Middleware


I'm trying to write some Rack Middleware for a Rails 4.2 app that alters the response body using the gsub method. I found older examples that use a pattern like this:

class MyMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)
    # do some stuff
    [status, headers, response]
  end
end

What I'm finding is that there is no setter method for response.body. Is there another pattern I can start with to go about modifying the body?


Solution

  • The problem was that it expects an Array for the 3rd argument in the call method. This pattern got me working again.

    # not real code, just a pattern to follow
    class MyMiddleware
      def initialize(app)
        @app = app
      end
    
      def call(env)
        status, headers, response = @app.call(env)
        new_response = make_new_response(response.body)
        # also must reset the Content-Length header if changing body
        headers['Content-Length'] = new_response.bytesize.to_s
        [status, headers, [new_response]]
      end
    end