Class: Rack::Response

Inherits:
Object show all
Includes:
Helpers
Defined in:
lib/vendor/rack-1.5.2/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 synchronous with the Rack response.

Your application’s call should end returning Response#finish.

Direct Known Subclasses

MockResponse, Sinatra::Response

Defined Under Namespace

Modules: Helpers

Instance Attribute Summary collapse

Attributes included from Helpers

#original_headers

Instance Method Summary collapse

Methods included from Helpers

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

Constructor Details

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

Returns a new instance of Response.

Yields:

  • (_self)

Yield Parameters:



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 22

def initialize(body=[], status=200, header={})
  @status = status.to_i
  @header = Utils::HeaderHash.new.merge(header)

  @chunked = "chunked" == @header['Transfer-Encoding']
  @writer  = lambda { |x| @body << x }
  @block   = nil
  @length  = 0

  @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.



47
48
49
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 47

def body
  @body
end

#headerObject (readonly) Also known as: headers

Returns the value of attribute header.



46
47
48
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 46

def header
  @header
end

#lengthObject

Returns the value of attribute length.



20
21
22
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 20

def length
  @length
end

#statusObject

Returns the value of attribute status.



47
48
49
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 47

def status
  @status
end

Instance Method Details

#[](key) ⇒ Object



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

def [](key)
  header[key]
end

#[]=(key, value) ⇒ Object



53
54
55
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 53

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

#closeObject



104
105
106
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 104

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


61
62
63
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 61

def delete_cookie(key, value={})
  Utils.delete_cookie_header!(header, key, value)
end

#each(&callback) ⇒ Object



85
86
87
88
89
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 85

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

#empty?Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 108

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

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



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 70

def finish(&block)
  @block = block

  if [204, 205, 304].include?(status.to_i)
    header.delete "Content-Type"
    header.delete "Content-Length"
    close
    [status.to_i, header, []]
  else
    [status.to_i, header, BodyProxy.new(self){}]
  end
end

#redirect(target, status = 302) ⇒ Object



65
66
67
68
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 65

def redirect(target, status=302)
  self.status = status
  self["Location"] = target
end


57
58
59
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 57

def set_cookie(key, value)
  Utils.set_cookie_header!(header, key, value)
end

#write(str) ⇒ Object

Append to body and update Content-Length.

NOTE: Do not mix #write and direct #body access!



95
96
97
98
99
100
101
102
# File 'lib/vendor/rack-1.5.2/lib/rack/response.rb', line 95

def write(str)
  s = str.to_s
  @length += Rack::Utils.bytesize(s) unless @chunked
  @writer.call s

  header["Content-Length"] = @length.to_s unless @chunked
  str
end