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 syncronous with the Rack response.
Your application’s call should end returning Response#finish.
# File lib/rack/response.rb, line 22
22: def initialize(body=[], status=200, header={}, &block)
23: @status = status.to_i
24: @header = Utils::HeaderHash.new({"Content-Type" => "text/html"}.
25: merge(header))
26:
27: @writer = lambda { |x| @body << x }
28: @block = nil
29: @length = 0
30:
31: @body = []
32:
33: if body.respond_to? :to_str
34: write body.to_str
35: elsif body.respond_to?(:each)
36: body.each { |part|
37: write part.to_s
38: }
39: else
40: raise TypeError, "stringable or iterable required"
41: end
42:
43: yield self if block_given?
44: end
# File lib/rack/response.rb, line 49
49: def [](key)
50: header[key]
51: end
# File lib/rack/response.rb, line 53
53: def []=(key, value)
54: header[key] = value
55: end
# File lib/rack/response.rb, line 101
101: def close
102: body.close if body.respond_to?(:close)
103: end
# File lib/rack/response.rb, line 82
82: def each(&callback)
83: @body.each(&callback)
84: @writer = callback
85: @block.call(self) if @block
86: end
# File lib/rack/response.rb, line 105
105: def empty?
106: @block == nil && @body.empty?
107: end
# File lib/rack/response.rb, line 70
70: def finish(&block)
71: @block = block
72:
73: if [204, 304].include?(status.to_i)
74: header.delete "Content-Type"
75: [status.to_i, header, []]
76: else
77: [status.to_i, header, self]
78: end
79: end
# File lib/rack/response.rb, line 65
65: def redirect(target, status=302)
66: self.status = status
67: self["Location"] = target
68: end
Append to body and update Content-Length.
NOTE: Do not mix # and direct # access!
# File lib/rack/response.rb, line 92
92: def write(str)
93: s = str.to_s
94: @length += Rack::Utils.bytesize(s)
95: @writer.call s
96:
97: header["Content-Length"] = @length.to_s
98: str
99: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.