class HTTPX::Response

  1. lib/httpx/response.rb
  2. lib/httpx/response/body.rb
  3. lib/httpx/response/buffer.rb
  4. lib/httpx/transcoder/utils/deflater.rb
  5. show all
Superclass: Object

Defines a HTTP response is handled internally, with a few properties exposed as attributes.

It delegates the following methods to the corresponding HTTPX::Request:

It implements (indirectly, via the body) the IO write protocol to internally buffer payloads.

It implements the IO reader protocol in order for users to buffer/stream it, acts as an enumerable (of payload chunks).

Included modules

  1. Callbacks

Attributes

body [R]

a HTTPX::Response::Body object wrapping the response body. The following methods are delegated to it:

headers [R]

an HTTPX::Headers object containing the response HTTP headers.

status [R]

the HTTP response status code

version [R]

The HTTP protocol version used to fetch the response.

Public Class methods

new(request, status, version, headers)

inits the instance with the corresponding request to this response, an the response HTTP status, version and HTTPX::Headers instance of headers.

[show source]
   # File lib/httpx/response.rb
63 def initialize(request, status, version, headers)
64   @request = request
65   @options = request.options
66   @version = version
67   @status = Integer(status)
68   @headers = @options.headers_class.new(headers)
69   @body = @options.response_body_class.new(self, @options)
70   @finished = complete?
71   @callbacks = @content_type = @content_length = nil
72 end

Public Instance methods

<<(data)

writes data chunk into the response body.

[show source]
   # File lib/httpx/response.rb
95 def <<(data)
96   @body.write(data)
97 end
bodyless?()

returns whether the response contains body payload.

[show source]
    # File lib/httpx/response.rb
126 def bodyless?
127   @request.verb == "HEAD" ||
128     @status < 200 || # informational response
129     @status == 204 ||
130     @status == 205 ||
131     @status == 304 || begin
132       content_length = @headers["content-length"]
133       return false if content_length.nil?
134 
135       content_length == "0"
136     end
137 end
close()

closes the respective +@request+ and +@body+.

[show source]
   # File lib/httpx/response.rb
83 def close
84   @request.close
85   @body.close
86 end
complete?()
[show source]
    # File lib/httpx/response.rb
139 def complete?
140   bodyless? || (@request.verb == "CONNECT" && @status == 200)
141 end
content_length()

returns the response content length as advertised in the HTTP Content-Length header value.

[show source]
    # File lib/httpx/response.rb
108 def content_length
109   return @content_length if defined?(@content_length)
110 
111   @content_length = @headers["content-length"]&.to_i
112 end
content_type()

returns the HTTPX::ContentType for the response, as per what’s declared in the content-type header.

response.content_type #=> #<HTTPX::ContentType:xxx @header_value="text/plain">
response.content_type.mime_type #=> "text/plain"
[show source]
    # File lib/httpx/response.rb
103 def content_type
104   @content_type ||= ContentType.new(@headers["content-type"])
105 end
error()

returns an instance of HTTPX::HTTPError if the response has a 4xx or 5xx status code, or nothing.

ok_response.error #=> nil
not_found_response.error #=> HTTPX::HTTPError instance, status 404
[show source]
    # File lib/httpx/response.rb
158 def error
159   return if @status < 400
160 
161   HTTPError.new(self)
162 end
finish!()

marks the response as finished, freezes the headers.

[show source]
    # File lib/httpx/response.rb
120 def finish!
121   @finished = true
122   @request.connection = nil
123 end
finished?()

returns whether the response has been fully fetched.

[show source]
    # File lib/httpx/response.rb
115 def finished?
116   @finished
117 end
form()

decodes the response payload into a ruby object if the payload is valid “application/x-www-urlencoded” or “multipart/form-data”.

[show source]
    # File lib/httpx/response.rb
184 def form
185   decode(Transcoder::Form)
186 end
initialize_dup(orig)

dupped initialization

[show source]
   # File lib/httpx/response.rb
75 def initialize_dup(orig)
76   super
77   # if a response gets dupped, the body handle must also get dupped to prevent
78   # two responses from using the same file handle to read.
79   @body = orig.body.dup
80 end
inspect()

simplecov:disable

[show source]
    # File lib/httpx/response.rb
144 def inspect
145   "#<#{self.class}:#{object_id} " \
146     "HTTP/#{version} " \
147     "@status=#{@status} " \
148     "@headers=#{@headers} " \
149     "@body=#{@body.bytesize}>"
150 end
json(...)

decodes the response payload into a ruby object if the payload is valid json.

response.json #≈> { "foo" => "bar" } for "{\"foo\":\"bar\"}" payload
response.json(symbolize_names: true) #≈> { foo: "bar" } for "{\"foo\":\"bar\"}" payload
[show source]
    # File lib/httpx/response.rb
178 def json(...)
179   decode(Transcoder::JSON, ...)
180 end
merge_headers(h)

merges headers defined in h into the response headers.

[show source]
   # File lib/httpx/response.rb
89 def merge_headers(h)
90   @headers = @headers.merge(h)
91   @content_type = @content_length = nil
92 end
raise_for_status()

it raises the exception returned by error, or itself otherwise.

ok_response.raise_for_status #=> ok_response
not_found_response.raise_for_status #=> raises HTTPX::HTTPError exception
[show source]
    # File lib/httpx/response.rb
168 def raise_for_status
169   return self unless (err = error)
170 
171   raise err
172 end
xml()
[show source]
    # File lib/httpx/response.rb
188 def xml
189   # TODO: remove at next major version.
190   warn "DEPRECATION WARNING: calling `.#{__method__}` on plain HTTPX responses is deprecated. " \
191        "Use HTTPX.plugin(:xml) sessions and call `.#{__method__}` in its responses instead."
192   require "httpx/plugins/xml"
193   decode(Plugins::XML::Transcoder)
194 end