Class: Thin::Response

Inherits:
Object
  • Object
show all
Defined in:
lib/thin/response.rb

Overview

A response sent to the client.

Defined Under Namespace

Classes: Stream

Constant Summary collapse

CONNECTION =
'connection'.freeze
CLOSE =
'close'.freeze
KEEP_ALIVE =
'keep-alive'.freeze
SERVER =
'server'.freeze
CONTENT_LENGTH =
'content-length'.freeze
PERSISTENT_STATUSES =
[100, 101].freeze
ERROR =

Error Responses

[500, {'content-type' => 'text/plain'}, ['Internal server error']].freeze
PERSISTENT_ERROR =
[500, {'content-type' => 'text/plain', 'connection' => 'keep-alive', 'content-length' => "21"}, ['Internal server error']].freeze
BAD_REQUEST =
[400, {'content-type' => 'text/plain'}, ['Bad Request']].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeResponse

Returns a new instance of Response.



72
73
74
75
76
77
# File 'lib/thin/response.rb', line 72

def initialize
  @headers    = Headers.new
  @status     = 200
  @persistent = false
  @skip_body  = false
end

Instance Attribute Details

#bodyObject

Response body, must respond to each.



67
68
69
# File 'lib/thin/response.rb', line 67

def body
  @body
end

#headersObject

Headers key-value hash



70
71
72
# File 'lib/thin/response.rb', line 70

def headers
  @headers
end

#statusObject

Status code



64
65
66
# File 'lib/thin/response.rb', line 64

def status
  @status
end

Instance Method Details

#closeObject

Close any resource used by the response



107
108
109
# File 'lib/thin/response.rb', line 107

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

#each {|head| ... } ⇒ Object

Yields each chunk of the response. To control the size of each chunk define your own each method on body.

Yields:



114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/thin/response.rb', line 114

def each(&block)
  yield head

  unless @skip_body
    if @body.is_a?(String)
      yield @body
    elsif @body.respond_to?(:each)
      @body.each { |chunk| yield chunk }
    else
      @body.call(Stream.new(block))
    end
  end
end

#headObject

Top header of the response, containing the status code and response headers.



91
92
93
# File 'lib/thin/response.rb', line 91

def head
  "HTTP/1.1 #{@status} #{HTTP_STATUS_CODES[@status.to_i]}\r\n#{headers_output}\r\n"
end

#headers_outputObject

String representation of the headers to be sent in the response.



81
82
83
84
85
86
87
# File 'lib/thin/response.rb', line 81

def headers_output
  # Set default headers
  @headers[CONNECTION] = persistent? ? KEEP_ALIVE : CLOSE unless @headers.has_key?(CONNECTION)
  @headers[SERVER]     = Thin::NAME unless @headers.has_key?(SERVER)

  @headers.to_s
end

#persistent!Object

Tell the client the connection should stay open



129
130
131
# File 'lib/thin/response.rb', line 129

def persistent!
  @persistent = true
end

#persistent?Boolean

Persistent connection must be requested as keep-alive from the server and have a content-length, or the response status must require that the connection remain open.

Returns:

  • (Boolean)


136
137
138
# File 'lib/thin/response.rb', line 136

def persistent?
  (@persistent && @headers.has_key?(CONTENT_LENGTH)) || PERSISTENT_STATUSES.include?(@status)
end

#skip_body!Object



140
141
142
# File 'lib/thin/response.rb', line 140

def skip_body!
  @skip_body = true
end