class Rack::BodyProxy

Proxy for response bodies allowing calling a block when the response body is closed (after the response has been fully sent to the client).

Public Class Methods

Set the response body to wrap, and the block to call when the response has been fully sent.

# File lib/rack/body_proxy.rb, line 10
def initialize(body, &block)
  @body = body
  @block = block
  @closed = false
end

Public Instance Methods

If not already closed, close the wrapped body and then call the block the proxy was initialized with.

# File lib/rack/body_proxy.rb, line 28
def close
  return if @closed
  @closed = true
  begin
    @body.close if @body.respond_to?(:close)
  ensure
    @block.call
  end
end

Whether the proxy is closed. The proxy starts as not closed, and becomes closed on the first call to close.

# File lib/rack/body_proxy.rb, line 40
def closed?
  @closed
end

Delegate missing methods to the wrapped body.

Calls superclass method
# File lib/rack/body_proxy.rb, line 45
def method_missing(method_name, *args, &block)
  case method_name
  when :to_str
    super
  when :to_ary
    begin
      @body.__send__(method_name, *args, &block)
    ensure
      close
    end
  else
    @body.__send__(method_name, *args, &block)
  end
end

Return whether the wrapped body responds to the method.

Calls superclass method
# File lib/rack/body_proxy.rb, line 17
def respond_to_missing?(method_name, include_all = false)
  case method_name
  when :to_str
    false
  else
    super or @body.respond_to?(method_name, include_all)
  end
end