Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 717
rb- Avatar asked Apr 10 '15 15:04

rb-


1 Answers

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
like image 78
rb- Avatar answered Sep 30 '22 02:09

rb-