Class: Net::HTTPResponse::Inflater
- Inherits:
-
Object
- Object
- Net::HTTPResponse::Inflater
- Defined in:
- lib/net/http/response.rb
Overview
Inflater is a wrapper around Net::BufferedIO that transparently inflates zlib and gzip streams.
Instance Method Summary collapse
-
#finish ⇒ Object
Finishes the inflate stream.
-
#inflate_adapter(dest) ⇒ Object
Returns a Net::ReadAdapter that inflates each read chunk into
dest
. -
#initialize(socket) ⇒ Inflater
constructor
Creates a new Inflater wrapping
socket
. -
#read(clen, dest, ignore_eof = false) ⇒ Object
Reads
clen
bytes from the socket, inflates them, then writes them todest
. -
#read_all(dest) ⇒ Object
Reads the rest of the socket, inflates it, then writes it to
dest
.
Constructor Details
#initialize(socket) ⇒ Inflater
Creates a new Inflater wrapping socket
362 363 364 365 366 |
# File 'lib/net/http/response.rb', line 362 def initialize socket @socket = socket # zlib with automatic gzip detection @inflate = Zlib::Inflate.new(32 + Zlib::MAX_WBITS) end |
Instance Method Details
#finish ⇒ Object
Finishes the inflate stream.
371 372 373 374 |
# File 'lib/net/http/response.rb', line 371 def finish return if @inflate.total_in == 0 @inflate.finish end |
#inflate_adapter(dest) ⇒ Object
Returns a Net::ReadAdapter that inflates each read chunk into dest
.
This allows a large response body to be inflated without storing the entire body in memory.
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 |
# File 'lib/net/http/response.rb', line 382 def inflate_adapter(dest) if dest.respond_to?(:set_encoding) dest.set_encoding(Encoding::ASCII_8BIT) elsif dest.respond_to?(:force_encoding) dest.force_encoding(Encoding::ASCII_8BIT) end block = proc do |compressed_chunk| @inflate.inflate(compressed_chunk) do |chunk| compressed_chunk.clear dest << chunk end end Net::ReadAdapter.new(block) end |
#read(clen, dest, ignore_eof = false) ⇒ Object
Reads clen
bytes from the socket, inflates them, then writes them to dest
. ignore_eof
is passed down to Net::BufferedIO#read
Unlike Net::BufferedIO#read, this method returns more than clen
bytes. At this time there is no way for a user of Net::HTTPResponse to read a specific number of bytes from the HTTP response body, so this internal API does not return the same number of bytes as were requested.
See bugs.ruby-lang.org/issues/6492 for further discussion.
409 410 411 412 413 |
# File 'lib/net/http/response.rb', line 409 def read clen, dest, ignore_eof = false temp_dest = inflate_adapter(dest) @socket.read clen, temp_dest, ignore_eof end |
#read_all(dest) ⇒ Object
Reads the rest of the socket, inflates it, then writes it to dest
.
418 419 420 421 422 |
# File 'lib/net/http/response.rb', line 418 def read_all dest temp_dest = inflate_adapter(dest) @socket.read_all temp_dest end |