Class: Rack::Response

Inherits:
Object
  • Object
show all
Includes:
Helpers
Defined in:
lib/rack/response.rb

Overview

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.

Defined Under Namespace

Modules: Helpers

Instance Attribute Summary collapse

Attributes included from Helpers

#original_headers

Instance Method Summary collapse

Methods included from Helpers

#client_error?, #content_length, #content_type, #forbidden?, #include?, #informational?, #invalid?, #location, #not_found?, #ok?, #redirect?, #redirection?, #server_error?, #successful?

Constructor Details

#initialize(body = [], status = 200, header = {}) {|_self| ... } ⇒ Response

Returns a new instance of Response.

Yields:

  • (_self)

Yield Parameters:



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/rack/response.rb', line 19

def initialize(body=[], status=200, header={}, &block)
  @status = status
  @header = Utils::HeaderHash.new({"Content-Type" => "text/html"}.
                                  merge(header))

  @writer = lambda { |x| @body << x }
  @block = nil

  @body = []

  if body.respond_to? :to_str
    write body.to_str
  elsif body.respond_to?(:each)
    body.each { |part|
      write part.to_s
    }
  else
    raise TypeError, "stringable or iterable required"
  end

  yield self  if block_given?
end

Instance Attribute Details

#bodyObject

Returns the value of attribute body.



43
44
45
# File 'lib/rack/response.rb', line 43

def body
  @body
end

#headerObject (readonly) Also known as: headers

Returns the value of attribute header.



42
43
44
# File 'lib/rack/response.rb', line 42

def header
  @header
end

#statusObject

Returns the value of attribute status.



43
44
45
# File 'lib/rack/response.rb', line 43

def status
  @status
end

Instance Method Details

#[](key) ⇒ Object



45
46
47
# File 'lib/rack/response.rb', line 45

def [](key)
  header[key]
end

#[]=(key, value) ⇒ Object



49
50
51
# File 'lib/rack/response.rb', line 49

def []=(key, value)
  header[key] = value
end

#closeObject



117
118
119
# File 'lib/rack/response.rb', line 117

def close
  body.close if body.respond_to?(:close)
end


79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/rack/response.rb', line 79

def delete_cookie(key, value={})
  unless Array === self["Set-Cookie"]
    self["Set-Cookie"] = [self["Set-Cookie"]].compact
  end

  self["Set-Cookie"].reject! { |cookie|
    cookie =~ /\A#{Utils.escape(key)}=/
  }

  set_cookie(key,
             {:value => '', :path => nil, :domain => nil,
               :expires => Time.at(0) }.merge(value))
end

#each(&callback) ⇒ Object



106
107
108
109
110
# File 'lib/rack/response.rb', line 106

def each(&callback)
  @body.each(&callback)
  @writer = callback
  @block.call(self)  if @block
end

#empty?Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/rack/response.rb', line 121

def empty?
  @block == nil && @body.empty?
end

#finish(&block) ⇒ Object Also known as: to_a



94
95
96
97
98
99
100
101
102
103
# File 'lib/rack/response.rb', line 94

def finish(&block)
  @block = block

  if [204, 304].include?(status.to_i)
    header.delete "Content-Type"
    [status.to_i, header.to_hash, []]
  else
    [status.to_i, header.to_hash, self]
  end
end


53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/rack/response.rb', line 53

def set_cookie(key, value)
  case value
  when Hash
    domain  = "; domain="  + value[:domain]    if value[:domain]
    path    = "; path="    + value[:path]      if value[:path]
    # According to RFC 2109, we need dashes here.
    # N.B.: cgi.rb uses spaces...
    expires = "; expires=" + value[:expires].clone.gmtime.
      strftime("%a, %d-%b-%Y %H:%M:%S GMT")    if value[:expires]
    value = value[:value]
  end
  value = [value]  unless Array === value
  cookie = Utils.escape(key) + "=" +
    value.map { |v| Utils.escape v }.join("&") +
    "#{domain}#{path}#{expires}"

  case self["Set-Cookie"]
  when Array
    self["Set-Cookie"] << cookie
  when String
    self["Set-Cookie"] = [self["Set-Cookie"], cookie]
  when nil
    self["Set-Cookie"] = cookie
  end
end

#write(str) ⇒ Object



112
113
114
115
# File 'lib/rack/response.rb', line 112

def write(str)
  @writer.call str.to_s
  str
end