allow multiple, successive content-encodings

This commit is contained in:
Samantaz Fox 2021-11-21 18:16:05 +01:00
parent 2c447a42f2
commit ba48f68fc3
No known key found for this signature in database
GPG key ID: F42821059186176E

View file

@ -434,11 +434,22 @@ module YoutubeAPI
# - https://github.com/iv-org/invidious/issues/2612
# - https://github.com/crystal-lang/crystal/issues/11354
#
case response.headers["Content-Encoding"]?
when "gzip"
body = Compress::Gzip::Reader.new(response.body_io, sync_close: true)
when "deflate"
body = Compress::Deflate::Reader.new(response.body_io, sync_close: true)
if encodings = response.headers["Content-Encoding"]?
io = response.body_io
# Multiple encodings can be combined, and are listed in the order
# in which they were applied. E.g: "deflate, gzip" means that the
# content must be first "gunzipped", then "defated".
encodings.split(',').reverse.each do |enc|
case enc.strip(' ')
when "gzip"
io = Compress::Gzip::Reader.new(io, sync_close: true)
when "deflate"
io = Compress::Deflate::Reader.new(io, sync_close: true)
end
end
body = io.gets_to_end
else
body = response.body
end