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.

Methods

[]   []=   close   delete_cookie   each   empty?   finish   new   set_cookie   to_a   write  

Included Modules

Helpers

Classes and Modules

Module Rack::Response::Helpers

External Aliases

header -> headers

Attributes

body  [RW] 
header  [R] 
status  [RW] 

Public Class methods

[Source]

    # 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

Public Instance methods

[Source]

    # File lib/rack/response.rb, line 45
45:     def [](key)
46:       header[key]
47:     end

[Source]

    # File lib/rack/response.rb, line 49
49:     def []=(key, value)
50:       header[key] = value
51:     end

[Source]

     # File lib/rack/response.rb, line 117
117:     def close
118:       body.close if body.respond_to?(:close)
119:     end

[Source]

    # 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

[Source]

     # 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

[Source]

     # File lib/rack/response.rb, line 121
121:     def empty?
122:       @block == nil && @body.empty?
123:     end

[Source]

     # 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

[Source]

    # 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
to_a(&block)

Alias for finish

[Source]

     # File lib/rack/response.rb, line 112
112:     def write(str)
113:       @writer.call str.to_s
114:       str
115:     end

[Validate]