summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/invidious/yt_backend/youtube_api.cr21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/invidious/yt_backend/youtube_api.cr b/src/invidious/yt_backend/youtube_api.cr
index b26af8d1..977aea04 100644
--- a/src/invidious/yt_backend/youtube_api.cr
+++ b/src/invidious/yt_backend/youtube_api.cr
@@ -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