Implementation of the HTTP Response body as a buffer which implements the IO writer protocol (for buffering the response payload), the IO reader protocol (for consuming the response payload), and can be iterated over (via each, which yields the payload in chunks).
Methods
Public Class
Public Instance
- ==
- bytesize
- close
- closed?
- copy_to
- each
- empty?
- encoding
- encodings
- filename
- initialize_dup
- inspect
- read
- rewind
- to_s
- write
Protected Instance
Public Instance Aliases
| to_str | -> | to_s |
Attributes
Public Class methods
initialized with the corresponding HTTPX::Response response and HTTPX::Options options.
# File lib/httpx/response/body.rb 18 def initialize(response, options) 19 @response = response 20 @headers = response.headers 21 @options = options 22 @window_size = options.window_size 23 @encodings = [] 24 @length = 0 25 @buffer = nil 26 @reader = nil 27 @state = :idle 28 29 # initialize response encoding 30 @encoding = if (enc = response.content_type.charset) 31 begin 32 Encoding.find(enc) 33 rescue ArgumentError 34 Encoding::BINARY 35 end 36 else 37 Encoding::BINARY 38 end 39 40 initialize_inflaters 41 end
Public Instance methods
# File lib/httpx/response/body.rb 153 def ==(other) 154 super || case other 155 when Response::Body 156 @buffer == other.buffer 157 else 158 @buffer = other 159 end 160 end
size of the decoded response payload. May differ from “content-length” header if response was encoded over-the-wire.
# File lib/httpx/response/body.rb 85 def bytesize 86 @length 87 end
closes/cleans the buffer, resets everything
# File lib/httpx/response/body.rb 144 def close 145 if @buffer 146 @buffer.close 147 @buffer = nil 148 end 149 @length = 0 150 transition(:closed) 151 end
# File lib/httpx/response/body.rb 49 def closed? 50 @state == :closed 51 end
copies the payload to dest.
body.copy_to("path/to/file") body.copy_to(Pathname.new("path/to/file")) body.copy_to(File.new("path/to/file"))
# File lib/httpx/response/body.rb 131 def copy_to(dest) 132 return unless @buffer 133 134 rewind 135 136 if dest.respond_to?(:path) && @buffer.respond_to?(:path) 137 FileUtils.mv(@buffer.path, dest.path) 138 else 139 IO.copy_stream(@buffer, dest) 140 end 141 end
yields the payload in chunks.
# File lib/httpx/response/body.rb 90 def each 91 return enum_for(__method__) unless block_given? 92 93 begin 94 if @buffer 95 rewind 96 while (chunk = @buffer.read(@window_size)) 97 yield(chunk.force_encoding(@encoding)) 98 end 99 end 100 ensure 101 close 102 end 103 end
whether the payload is empty.
# File lib/httpx/response/body.rb 122 def empty? 123 @length.zero? 124 end
returns the declared filename in the “contennt-disposition” header, when present.
# File lib/httpx/response/body.rb 106 def filename 107 return unless @headers.key?("content-disposition") 108 109 Utils.get_filename(@headers["content-disposition"]) 110 end
# File lib/httpx/response/body.rb 43 def initialize_dup(other) 44 super 45 46 @buffer = other.instance_variable_get(:@buffer).dup 47 end
:nocov:
# File lib/httpx/response/body.rb 163 def inspect 164 "#<#{self.class}:#{object_id} " \ 165 "@state=#{@state} " \ 166 "@length=#{@length}>" 167 end
reads a chunk from the payload (implementation of the IO reader protocol).
# File lib/httpx/response/body.rb 72 def read(*args) 73 return unless @buffer 74 75 unless @reader 76 rewind 77 @reader = @buffer 78 end 79 80 @reader.read(*args) 81 end
rewinds the response payload buffer.
# File lib/httpx/response/body.rb 171 def rewind 172 return unless @buffer 173 174 # in case there's some reading going on 175 @reader = nil 176 177 @buffer.rewind 178 end
returns the full response payload as a string.
# File lib/httpx/response/body.rb 113 def to_s 114 return "".b unless @buffer 115 116 @buffer.to_s 117 end
write the response payload chunk into the buffer. Inflates the chunk when required and supported.
# File lib/httpx/response/body.rb 55 def write(chunk) 56 return if @state == :closed 57 58 return 0 if chunk.empty? 59 60 chunk = decode_chunk(chunk) 61 62 size = chunk.bytesize 63 @length += size 64 transition(:open) 65 @buffer.write(chunk) 66 67 @response.emit(:chunk_received, chunk) 68 size 69 end