Some JPEG files might have corrupted Exif tags (or the Exif parsing is flawed, not sure). In any case, FastImage fails on those because the Exif parsing reads beyond the APP1 block.
This PR solves this by reading the APP1 block into a string and parsing the Exif from that string. If the exif parsing fails, no biggie, we continue with the rotation info.
To do this, I gradually isolated the reading into a new FiberStream class and the Exif parsing into its own class. I broke it down into reasonably small commits, each should be reasonably easy to follow.
Update gemfile lock
Remove trailing spaces
Small refactor of read_int -> get_int
Create peek_chars to avoid writing to strpos/bytes_delivered
Simplify dealing with encoding
Remove unused instance variable
Encapsulate reading in a new class
move get_byte, get_int into module
Isolate Exif parsing
Rename bytes_delivered -> pos
Add failing test for a jpeg
JPEG exif parsing can now fail gracefully 🎉