Parent

Namespace

Included Modules

Rack::Response

Rack::Response provides a convenient interface to create a Rack response.

It allows setting of headers and cookies, and provides useful defaults (a OK response containing HTML).

You can use Response#write to iteratively generate your response, but note that this is buffered by Rack::Response until you call finish. finish however can take a block inside which calls to write are synchronous with the Rack response.

Your application’s call should end returning Response#finish.

Attributes

body[RW]
header[R]
headers[R]
length[RW]
status[RW]

Public Class Methods

new(body=[], status=200, header={}) click to toggle source
# File lib/rack/response.rb, line 22
def initialize(body=[], status=200, header={})
  @status = status.to_i
  @header = Utils::HeaderHash.new.merge(header)

  @chunked = "chunked" == @header['Transfer-Encoding']
  @writer  = lambda { |x| @body << x }
  @block   = nil
  @length  = 0

  @body = []

  if body.respond_to? :to_str
    write body.to_str
  elsif body.respond_to?(:each)
    body.each { |part|
      write part.to_s
    }
  else
    raise TypeError, "stringable or iterable required"
  end

  yield self  if block_given?
end

Public Instance Methods

[](key) click to toggle source
# File lib/rack/response.rb, line 49
def [](key)
  header[key]
end
[]=(key, value) click to toggle source
# File lib/rack/response.rb, line 53
def []=(key, value)
  header[key] = value
end
close() click to toggle source
# File lib/rack/response.rb, line 104
def close
  body.close if body.respond_to?(:close)
end
each(&callback) click to toggle source
# File lib/rack/response.rb, line 85
def each(&callback)
  @body.each(&callback)
  @writer = callback
  @block.call(self)  if @block
end
empty?() click to toggle source
# File lib/rack/response.rb, line 108
def empty?
  @block == nil && @body.empty?
end
finish(&block) click to toggle source
# File lib/rack/response.rb, line 70
def finish(&block)
  @block = block

  if [204, 205, 304].include?(status.to_i)
    header.delete "Content-Type"
    header.delete "Content-Length"
    close
    [status.to_i, header, []]
  else
    [status.to_i, header, BodyProxy.new(self){}]
  end
end
Also aliased as: to_a, to_ary
redirect(target, status=302) click to toggle source
# File lib/rack/response.rb, line 65
def redirect(target, status=302)
  self.status = status
  self["Location"] = target
end
to_a(&block) click to toggle source
Alias for: finish
to_ary(&block) click to toggle source
Alias for: finish
write(str) click to toggle source

Append to body and update Content-Length.

NOTE: Do not mix write and direct body access!

# File lib/rack/response.rb, line 95
def write(str)
  s = str.to_s
  @length += Rack::Utils.bytesize(s) unless @chunked
  @writer.call s

  header["Content-Length"] = @length.to_s unless @chunked
  str
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.