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).
Methods
Public Class
Public Instance
Included modules
Classes and Modules
Attributes
| body | [R] |
a |
| headers | [R] |
an |
| status | [R] |
the HTTP response status code |
| version | [R] |
The HTTP protocol version used to fetch the response. |
Public Class methods
inits the instance with the corresponding request to this response, an the response HTTP status, version and HTTPX::Headers instance of headers.
# 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 @content_type = @content_length = nil 72 end
Public Instance methods
writes data chunk into the response body.
# File lib/httpx/response.rb 95 def <<(data) 96 @body.write(data) 97 end
returns whether the response contains body payload.
# File lib/httpx/response.rb 127 def bodyless? 128 @request.verb == "HEAD" || 129 @status < 200 || # informational response 130 @status == 204 || 131 @status == 205 || 132 @status == 304 || begin 133 content_length = @headers["content-length"] 134 return false if content_length.nil? 135 136 content_length == "0" 137 end 138 end
closes the respective +@request+ and +@body+.
# File lib/httpx/response.rb 83 def close 84 @request.close 85 @body.close 86 end
# File lib/httpx/response.rb 140 def complete? 141 bodyless? || (@request.verb == "CONNECT" && @status == 200) 142 end
returns the response content length as advertised in the HTTP Content-Length header value.
# 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
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"
# File lib/httpx/response.rb 103 def content_type 104 @content_type ||= ContentType.new(@headers["content-type"]) 105 end
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
# File lib/httpx/response.rb 159 def error 160 return if @status < 400 161 162 HTTPError.new(self) 163 end
marks the response as finished, freezes the headers.
# File lib/httpx/response.rb 120 def finish! 121 @finished = true 122 @headers.freeze 123 @request.connection = nil 124 end
returns whether the response has been fully fetched.
# File lib/httpx/response.rb 115 def finished? 116 @finished 117 end
decodes the response payload into a ruby object if the payload is valid “application/x-www-urlencoded” or “multipart/form-data”.
# File lib/httpx/response.rb 185 def form 186 decode(Transcoder::Form) 187 end
dupped initialization
# 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
:nocov:
# File lib/httpx/response.rb 145 def inspect 146 "#<#{self.class}:#{object_id} " \ 147 "HTTP/#{version} " \ 148 "@status=#{@status} " \ 149 "@headers=#{@headers} " \ 150 "@body=#{@body.bytesize}>" 151 end
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
# File lib/httpx/response.rb 179 def json(*args) 180 decode(Transcoder::JSON, *args) 181 end
merges headers defined in h into the response headers.
# File lib/httpx/response.rb 89 def merge_headers(h) 90 @headers = @headers.merge(h) 91 @content_type = @content_length = nil 92 end
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
# File lib/httpx/response.rb 169 def raise_for_status 170 return self unless (err = error) 171 172 raise err 173 end
# File lib/httpx/response.rb 189 def xml 190 # TODO: remove at next major version. 191 warn "DEPRECATION WARNING: calling `.#{__method__}` on plain HTTPX responses is deprecated. " \ 192 "Use HTTPX.plugin(:xml) sessions and call `.#{__method__}` in its responses instead." 193 require "httpx/plugins/xml" 194 decode(Plugins::XML::Transcoder) 195 end