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