diff --git a/lib/fastimage.rb b/lib/fastimage.rb index aad1bfe..0fbb507 100644 --- a/lib/fastimage.rb +++ b/lib/fastimage.rb @@ -237,6 +237,21 @@ class FastImage end end + case res['content-encoding'] + when 'deflate', 'gzip', 'x-gzip' + begin + gzip = Zlib::GzipReader.new(FiberStream.new(read_fiber)) + rescue FiberError, Zlib::GzipFile::Error + raise CannotParseImage + end + + read_fiber = Fiber.new do + while data = gzip.readline + Fiber.yield data + end + end + end + parse_packets FiberStream.new(read_fiber) break # needed to actively quit out of the fetch diff --git a/test/fixtures/gzipped.jpg b/test/fixtures/gzipped.jpg new file mode 100644 index 0000000..8b4337c Binary files /dev/null and b/test/fixtures/gzipped.jpg differ diff --git a/test/fixtures/truncated_gzipped.jpg b/test/fixtures/truncated_gzipped.jpg new file mode 100644 index 0000000..7213325 Binary files /dev/null and b/test/fixtures/truncated_gzipped.jpg differ diff --git a/test/test.rb b/test/test.rb index 10194e4..8187b3e 100644 --- a/test/test.rb +++ b/test/test.rb @@ -56,6 +56,12 @@ BadFixtures.each do |fn| FakeWeb.register_uri(:get, "#{TestUrl}#{fn}", :body => File.join(FixturePath, fn)) end +GzipTestImg = "gzipped.jpg" +FakeWeb.register_uri(:get, "#{TestUrl}#{GzipTestImg}", :body => File.join(FixturePath, GzipTestImg), :content_encoding => "gzip") +GzipTestImgTruncated = "truncated_gzipped.jpg" +FakeWeb.register_uri(:get, "#{TestUrl}#{GzipTestImgTruncated}", :body => File.join(FixturePath, GzipTestImgTruncated), :content_encoding => "gzip") +GzipTestImgSize = [970, 450] + class FastImageTest < Test::Unit::TestCase def test_should_report_type_correctly GoodFixtures.each do |fn, info| @@ -258,4 +264,16 @@ class FastImageTest < Test::Unit::TestCase assert_equal info[1], FastImage.size(stringio) end end + + def test_gzipped_file + url = "http://example.nowhere/#{GzipTestImg}" + assert_equal([970, 450], FastImage.size(url)) + end + + def test_truncated_gzipped_file + url = "http://example.nowhere/#{GzipTestImgTruncated}" + assert_raises(FastImage::SizeNotFound) do + FastImage.size(url, :raise_on_failure => true) + end + end end