| Class | Rack::Response |
| In: |
lib/rack/response.rb
|
| Parent: | Object |
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.
| header | -> | headers |
| body | [RW] | |
| header | [R] | |
| status | [RW] |
# File lib/rack/response.rb, line 19
19: def initialize(body=[], status=200, header={}, &block)
20: @status = status
21: @header = Utils::HeaderHash.new({"Content-Type" => "text/html"}.
22: merge(header))
23:
24: @writer = lambda { |x| @body << x }
25: @block = nil
26:
27: @body = []
28:
29: if body.respond_to? :to_str
30: write body.to_str
31: elsif body.respond_to?(:each)
32: body.each { |part|
33: write part.to_s
34: }
35: else
36: raise TypeError, "stringable or iterable required"
37: end
38:
39: yield self if block_given?
40: end
# File lib/rack/response.rb, line 117
117: def close
118: body.close if body.respond_to?(:close)
119: end
# File lib/rack/response.rb, line 79
79: def delete_cookie(key, value={})
80: unless Array === self["Set-Cookie"]
81: self["Set-Cookie"] = [self["Set-Cookie"]].compact
82: end
83:
84: self["Set-Cookie"].reject! { |cookie|
85: cookie =~ /\A#{Utils.escape(key)}=/
86: }
87:
88: set_cookie(key,
89: {:value => '', :path => nil, :domain => nil,
90: :expires => Time.at(0) }.merge(value))
91: end
# File lib/rack/response.rb, line 106
106: def each(&callback)
107: @body.each(&callback)
108: @writer = callback
109: @block.call(self) if @block
110: end
# File lib/rack/response.rb, line 94
94: def finish(&block)
95: @block = block
96:
97: if [204, 304].include?(status.to_i)
98: header.delete "Content-Type"
99: [status.to_i, header.to_hash, []]
100: else
101: [status.to_i, header.to_hash, self]
102: end
103: end
# File lib/rack/response.rb, line 53
53: def set_cookie(key, value)
54: case value
55: when Hash
56: domain = "; domain=" + value[:domain] if value[:domain]
57: path = "; path=" + value[:path] if value[:path]
58: # According to RFC 2109, we need dashes here.
59: # N.B.: cgi.rb uses spaces...
60: expires = "; expires=" + value[:expires].clone.gmtime.
61: strftime("%a, %d-%b-%Y %H:%M:%S GMT") if value[:expires]
62: value = value[:value]
63: end
64: value = [value] unless Array === value
65: cookie = Utils.escape(key) + "=" +
66: value.map { |v| Utils.escape v }.join("&") +
67: "#{domain}#{path}#{expires}"
68:
69: case self["Set-Cookie"]
70: when Array
71: self["Set-Cookie"] << cookie
72: when String
73: self["Set-Cookie"] = [self["Set-Cookie"], cookie]
74: when nil
75: self["Set-Cookie"] = cookie
76: end
77: end