Class Rack::Response
In: lib/rack/response.rb
Parent: Object

Rack::Request 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 Request#write to iteratively generate your response, but note that this is buffered by Rack::Request 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 Request#finish.

Methods

[]   []=   delete_cookie   each   finish   new   set_cookie   to_a   write  

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: 
26:       @body = []
27: 
28:       if body.kind_of?(String)
29:         write body
30:       elsif body.respond_to?(:each)
31:         body.each { |part|
32:           write part.to_s
33:         }
34:       else
35:         raise TypeError, "String or iterable required"
36:       end
37: 
38:       yield self  if block_given?
39:     end

Public Instance methods

[Source]

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

[Source]

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

[Source]

    # File lib/rack/response.rb, line 76
76:     def delete_cookie(key, value={})
77:       unless Array === self["Set-Cookie"]
78:         self["Set-Cookie"] = [self["Set-Cookie"]]
79:       end
80: 
81:       self["Set-Cookie"].reject! { |cookie|
82:         cookie =~ /\A#{Utils.escape(key)}=/
83:       }
84: 
85:       set_cookie(key,
86:                  {:value => '', :path => nil, :domain => nil,
87:                    :expires => Time.at(0) }.merge(value))
88:     end

[Source]

     # File lib/rack/response.rb, line 103
103:     def each(&callback)
104:       @body.each(&callback)
105:       @writer = callback
106:       @block.call(self)  if @block
107:     end

[Source]

     # File lib/rack/response.rb, line 91
 91:     def finish(&block)
 92:       @block = block
 93: 
 94:       if [201, 204, 304].include?(status.to_i)
 95:         header.delete "Content-Type"
 96:         [status.to_i, header.to_hash, []]
 97:       else
 98:         [status.to_i, header.to_hash, self]
 99:       end
100:     end

[Source]

    # File lib/rack/response.rb, line 52
52:     def set_cookie(key, value)
53:       case value
54:       when Hash
55:         domain  = "; domain="  + value[:domain]    if value[:domain]
56:         path    = "; path="    + value[:path]      if value[:path]
57:         expires = "; expires=" + value[:expires].clone.gmtime.
58:           strftime("%a, %d %b %Y %H:%M:%S GMT")    if value[:expires]
59:         value = value[:value]
60:       end
61:       value = [value]  unless Array === value
62:       cookie = Utils.escape(key) + "=" +
63:         value.map { |v| Utils.escape v }.join("&") +
64:         "#{domain}#{path}#{expires}"
65: 
66:       case self["Set-Cookie"]
67:       when Array
68:         self["Set-Cookie"] << cookie
69:       when String
70:         self["Set-Cookie"] = [self["Set-Cookie"], cookie]
71:       when nil
72:         self["Set-Cookie"] = cookie
73:       end
74:     end
to_a(&block)

Alias for finish

[Source]

     # File lib/rack/response.rb, line 109
109:     def write(str)
110:       @writer.call str
111:       str
112:     end

[Validate]