Class: HTTP::Response

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Headers::Mixin
Defined in:
lib/http/response.rb,
lib/http/response/body.rb,
lib/http/response/parser.rb,
lib/http/response/status.rb,
lib/http/response/inflater.rb,
lib/http/response/status/reasons.rb

Defined Under Namespace

Classes: Body, Inflater, Parser, Status

Instance Attribute Summary collapse

Attributes included from Headers::Mixin

#headers

Instance Method Summary collapse

Methods included from Headers::Mixin

#[], #[]=

Constructor Details

#initialize(opts) ⇒ Response

Inits a new instance

Parameters:

  • opts (Hash)

    a customizable set of options

Options Hash (opts):

  • :status (Integer)

    Status code

  • :version (String)

    HTTP version

  • :headers (Hash)
  • :proxy_headers (Hash)
  • :connection (HTTP::Connection)
  • :encoding (String)

    Encoding to use when reading body

  • :body (String)
  • request (HTTP::Request)

    The request this is in response to.

  • :uri (String) — default: DEPRECATED

    used to populate a missing request



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/http/response.rb', line 45

def initialize(opts)
  @version       = opts.fetch(:version)
  @request       = init_request(opts)
  @status        = HTTP::Response::Status.new(opts.fetch(:status))
  @headers       = HTTP::Headers.coerce(opts[:headers] || {})
  @proxy_headers = HTTP::Headers.coerce(opts[:proxy_headers] || {})

  if opts.include?(:body)
    @body = opts.fetch(:body)
  else
    connection = opts.fetch(:connection)
    encoding = opts[:encoding] || charset || default_encoding

    @body = Response::Body.new(connection, encoding: encoding)
  end
end

Instance Attribute Details

#bodyBody (readonly)

Returns:



26
27
28
# File 'lib/http/response.rb', line 26

def body
  @body
end

#proxy_headersHash (readonly)

Returns:

  • (Hash)


32
33
34
# File 'lib/http/response.rb', line 32

def proxy_headers
  @proxy_headers
end

#requestRequest (readonly)

Returns:



29
30
31
# File 'lib/http/response.rb', line 29

def request
  @request
end

#statusStatus (readonly)

Returns:



20
21
22
# File 'lib/http/response.rb', line 20

def status
  @status
end

#versionString (readonly)

Returns:

  • (String)


23
24
25
# File 'lib/http/response.rb', line 23

def version
  @version
end

Instance Method Details

#charsetString?

Charset of response (if any)

Returns:

  • (String, nil)


138
# File 'lib/http/response.rb', line 138

def_delegator :content_type, :charset

#chunked?Boolean

Returns:

  • (Boolean)


146
147
148
149
150
151
152
153
# File 'lib/http/response.rb', line 146

def chunked?
  return false unless @headers.include?(Headers::TRANSFER_ENCODING)

  encoding = @headers.get(Headers::TRANSFER_ENCODING)

  # TODO: "chunked" is frozen in the request writer. How about making it accessible?
  encoding.last == "chunked"
end

#codeFixnum

Returns status code.

Returns:

  • (Fixnum)

    status code



68
# File 'lib/http/response.rb', line 68

def_delegator :@status, :code

#connectionHTTP::Connection

The connection object used to make the corresponding request.

Returns:



81
# File 'lib/http/response.rb', line 81

def_delegator :@body, :connection

#content_lengthnil, Integer

Value of the Content-Length header.

Returns:

  • (nil)

    if Content-Length was not given, or it’s value was invalid (not an integer, e.g. empty string or string with non-digits).

  • (Integer)

    otherwise



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/http/response.rb', line 107

def content_length
  # http://greenbytes.de/tech/webdav/rfc7230.html#rfc.section.3.3.3
  # Clause 3: "If a message is received with both a Transfer-Encoding
  # and a Content-Length header field, the Transfer-Encoding overrides the Content-Length.
  return nil if @headers.include?(Headers::TRANSFER_ENCODING)

  value = @headers[Headers::CONTENT_LENGTH]
  return nil unless value

  begin
    Integer(value)
  rescue ArgumentError
    nil
  end
end

#content_typeHTTP::ContentType

Parsed Content-Type header

Returns:



126
127
128
# File 'lib/http/response.rb', line 126

def content_type
  @content_type ||= ContentType.parse headers[Headers::CONTENT_TYPE]
end

#cookiesObject



140
141
142
143
144
# File 'lib/http/response.rb', line 140

def cookies
  @cookies ||= headers.get(Headers::SET_COOKIE).each_with_object CookieJar.new do |v, jar|
    jar.parse(v, uri)
  end
end

#flushResponse

Flushes body and returns self-reference

Returns:



97
98
99
100
# File 'lib/http/response.rb', line 97

def flush
  body.to_s
  self
end

#inspectObject

Inspect a response



165
166
167
# File 'lib/http/response.rb', line 165

def inspect
  "#<#{self.class}/#{@version} #{code} #{reason} #{headers.to_h.inspect}>"
end

#mime_typeString?

MIME type of response (if any)

Returns:

  • (String, nil)


133
# File 'lib/http/response.rb', line 133

def_delegator :content_type, :mime_type

#parse(type = nil) ⇒ Object

Parse response body with corresponding MIME type adapter.

Parameters:

  • type (#to_s) (defaults to: nil)

    Parse as given MIME type.

Returns:

  • (Object)

Raises:

  • (Error)

    if no adapter found



160
161
162
# File 'lib/http/response.rb', line 160

def parse(type = nil)
  MimeType[type || mime_type].decode to_s
end

#readpartialObject



77
# File 'lib/http/response.rb', line 77

def_delegator :@body, :readpartial

#reasonString?

Returns status message.

Returns:

  • (String, nil)

    status message



64
# File 'lib/http/response.rb', line 64

def_delegator :@status, :reason

#to_aArray(Fixnum, Hash, String)

Returns an Array ala Rack: [status, headers, body]

Returns:

  • (Array(Fixnum, Hash, String))


90
91
92
# File 'lib/http/response.rb', line 90

def to_a
  [status.to_i, headers.to_h, body.to_s]
end

#to_sString Also known as: to_str

Returns eagerly consume the entire body as a string.

Returns:

  • (String)

    eagerly consume the entire body as a string



72
# File 'lib/http/response.rb', line 72

def_delegator :@body, :to_s

#uriObject



85
# File 'lib/http/response.rb', line 85

def_delegator :@request, :uri