mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-10-07 00:05:02 -04:00
removed the compression modules from the transcoders, using them directly in the plugin, rewrote the encoder to be more interchangeable
This commit is contained in:
parent
72b90c3f17
commit
dcd90b706a
@ -15,11 +15,22 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module RequestBodyMethods
|
||||||
|
def initialize(*)
|
||||||
|
super
|
||||||
|
return if @body.nil?
|
||||||
|
@headers.get("content-encoding").each do |encoding|
|
||||||
|
@body = Encoder.new(@body, Compression.registry(encoding).encoder)
|
||||||
|
end
|
||||||
|
@headers["content-length"] = @body.bytesize unless chunked?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
module ResponseBodyMethods
|
module ResponseBodyMethods
|
||||||
def initialize(*)
|
def initialize(*)
|
||||||
super
|
super
|
||||||
@_decoders = @headers.get("content-encoding").map do |encoding|
|
@_decoders = @headers.get("content-encoding").map do |encoding|
|
||||||
Transcoder.registry(encoding).decoder
|
Compression.registry(encoding).decoder
|
||||||
end
|
end
|
||||||
@_compressed_length = if @headers.key?("content-length")
|
@_compressed_length = if @headers.key?("content-length")
|
||||||
@headers["content-length"].to_i
|
@headers["content-length"].to_i
|
||||||
@ -50,6 +61,47 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class Encoder
|
||||||
|
def initialize(body, deflater)
|
||||||
|
@body = body.respond_to?(:read) ? body : StringIO.new(body.to_s)
|
||||||
|
@buffer = StringIO.new("".b, File::RDWR)
|
||||||
|
@deflater = deflater
|
||||||
|
end
|
||||||
|
|
||||||
|
def each(&blk)
|
||||||
|
return enum_for(__method__) unless block_given?
|
||||||
|
unless @buffer.size.zero?
|
||||||
|
@buffer.rewind
|
||||||
|
return @buffer.each(&blk)
|
||||||
|
end
|
||||||
|
deflate(&blk)
|
||||||
|
end
|
||||||
|
|
||||||
|
def bytesize
|
||||||
|
deflate
|
||||||
|
@buffer.size
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
deflate
|
||||||
|
@buffer.rewind
|
||||||
|
@buffer.read
|
||||||
|
end
|
||||||
|
|
||||||
|
def close
|
||||||
|
@buffer.close
|
||||||
|
@body.close
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def deflate(&blk)
|
||||||
|
return unless @buffer.size.zero?
|
||||||
|
@body.rewind
|
||||||
|
@deflater.deflate(@body, @buffer, chunk_size: 16_384, &blk)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
class Decoder
|
class Decoder
|
||||||
extend Forwardable
|
extend Forwardable
|
||||||
|
|
||||||
@ -65,41 +117,6 @@ module HTTPX
|
|||||||
@inflater.inflate(chunk)
|
@inflater.inflate(chunk)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class CompressEncoder
|
|
||||||
attr_reader :content_type
|
|
||||||
|
|
||||||
def initialize(raw, encoder)
|
|
||||||
@content_type = raw.content_type
|
|
||||||
@raw = raw.respond_to?(:read) ? raw : StringIO.new(raw.to_s)
|
|
||||||
@buffer = StringIO.new("".b, File::RDWR)
|
|
||||||
@encoder = encoder
|
|
||||||
end
|
|
||||||
|
|
||||||
def each(&blk)
|
|
||||||
return enum_for(__method__) unless block_given?
|
|
||||||
unless @buffer.size.zero?
|
|
||||||
@buffer.rewind
|
|
||||||
return @buffer.each(&blk)
|
|
||||||
end
|
|
||||||
@encoder.compress(@raw, @buffer, chunk_size: 16_384, &blk)
|
|
||||||
end
|
|
||||||
|
|
||||||
def to_s
|
|
||||||
compress
|
|
||||||
@buffer.rewind
|
|
||||||
@buffer.read
|
|
||||||
end
|
|
||||||
|
|
||||||
def bytesize
|
|
||||||
@encoder.compress(@raw, @buffer, chunk_size: 16_384)
|
|
||||||
@buffer.size
|
|
||||||
end
|
|
||||||
|
|
||||||
def close
|
|
||||||
# @buffer.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
register_plugin :compression, Compression
|
register_plugin :compression, Compression
|
||||||
end
|
end
|
||||||
|
@ -11,16 +11,13 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.configure(*)
|
def self.configure(*)
|
||||||
Transcoder.register "br", BrotliTranscoder
|
|
||||||
Compression.register "br", self
|
Compression.register "br", self
|
||||||
end
|
end
|
||||||
|
|
||||||
module Encoder
|
module Encoder
|
||||||
module_function
|
module_function
|
||||||
|
|
||||||
def compress(raw, buffer, chunk_size: )
|
def deflate(raw, buffer, chunk_size: )
|
||||||
return unless buffer.size.zero?
|
|
||||||
raw.rewind
|
|
||||||
begin
|
begin
|
||||||
while chunk = raw.read(chunk_size)
|
while chunk = raw.read(chunk_size)
|
||||||
compressed = ::Brotli.deflate(chunk)
|
compressed = ::Brotli.deflate(chunk)
|
||||||
@ -43,11 +40,10 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
module BrotliTranscoder
|
|
||||||
module_function
|
module_function
|
||||||
|
|
||||||
def encode(payload)
|
def encoder
|
||||||
CompressEncoder.new(payload, Encoder)
|
Encoder
|
||||||
end
|
end
|
||||||
|
|
||||||
def decoder
|
def decoder
|
||||||
@ -55,7 +51,6 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
register_plugin :"compression/brotli", Compression::Brotli
|
register_plugin :"compression/brotli", Compression::Brotli
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -10,17 +10,13 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.configure(*)
|
def self.configure(*)
|
||||||
Transcoder.register "deflate", DeflateTranscoder
|
|
||||||
Compression.register "deflate", self
|
Compression.register "deflate", self
|
||||||
end
|
end
|
||||||
|
|
||||||
module DeflateTranscoder
|
|
||||||
module Encoder
|
module Encoder
|
||||||
module_function
|
module_function
|
||||||
|
|
||||||
def compress(raw, buffer, chunk_size: )
|
def deflate(raw, buffer, chunk_size: )
|
||||||
return unless buffer.size.zero?
|
|
||||||
raw.rewind
|
|
||||||
begin
|
begin
|
||||||
deflater = Zlib::Deflate.new(Zlib::BEST_COMPRESSION,
|
deflater = Zlib::Deflate.new(Zlib::BEST_COMPRESSION,
|
||||||
Zlib::MAX_WBITS,
|
Zlib::MAX_WBITS,
|
||||||
@ -42,8 +38,8 @@ module HTTPX
|
|||||||
|
|
||||||
module_function
|
module_function
|
||||||
|
|
||||||
def encode(payload)
|
def encoder
|
||||||
CompressEncoder.new(payload, Encoder)
|
Encoder
|
||||||
end
|
end
|
||||||
|
|
||||||
def decoder
|
def decoder
|
||||||
@ -51,7 +47,6 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
register_plugin :"compression/deflate", Compression::Deflate
|
register_plugin :"compression/deflate", Compression::Deflate
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -11,15 +11,11 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.configure(*)
|
def self.configure(*)
|
||||||
Transcoder.register "gzip", GZIPTranscoder
|
|
||||||
Compression.register "gzip", self
|
Compression.register "gzip", self
|
||||||
end
|
end
|
||||||
|
|
||||||
module GZIPTranscoder
|
|
||||||
class Encoder
|
class Encoder
|
||||||
def compress(raw, buffer, chunk_size: )
|
def deflate(raw, buffer, chunk_size: )
|
||||||
return unless buffer.size.zero?
|
|
||||||
raw.rewind
|
|
||||||
begin
|
begin
|
||||||
gzip = Zlib::GzipWriter.new(self)
|
gzip = Zlib::GzipWriter.new(self)
|
||||||
|
|
||||||
@ -52,8 +48,8 @@ module HTTPX
|
|||||||
|
|
||||||
module_function
|
module_function
|
||||||
|
|
||||||
def encode(payload)
|
def encoder
|
||||||
CompressEncoder.new(payload, Encoder.new)
|
Encoder.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def decoder
|
def decoder
|
||||||
@ -61,7 +57,6 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
register_plugin :"compression/gzip", Compression::GZIP
|
register_plugin :"compression/gzip", Compression::GZIP
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user