diff options
author | Thomas E. Enebo <tom.enebo@gmail.com> | 2017-09-05 16:30:31 -0500 |
---|---|---|
committer | Thomas E. Enebo <tom.enebo@gmail.com> | 2017-09-05 16:30:31 -0500 |
commit | 2bbb245edaf80179f4673bf4bf75978a10654c64 (patch) | |
tree | 3bcf8b863240a2dfb2023242fe2a35d71ba4add2 /test | |
parent | 4039a811248de7b0b9ae9e4a97854f00ba985255 (diff) | |
download | psych-2bbb245edaf80179f4673bf4bf75978a10654c64.zip |
Parse.load with an IO/File which has a non-YAML allowed encoding will just
set the encoding to UTF-8 and hope for the best. This appears to be how
libyaml works.
This issue was noticed in yaml/store because it extends pstore which will
create an IO in read_only mode as:
```ruby
RD_ACCESS = {mode: IO::RDONLY | IO::BINARY, encoding: Encoding::ASCII_8BIT}
```
The data in the test case I was debugging was in fact UTF-8 data and MRI was
happy to take this 8bit IO and pretend it is UTF-8. Form-fitting ftw.
Diffstat (limited to 'test')
-rw-r--r-- | test/psych/test_encoding.rb | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/test/psych/test_encoding.rb b/test/psych/test_encoding.rb index a4f9f03..01ebe25 100644 --- a/test/psych/test_encoding.rb +++ b/test/psych/test_encoding.rb @@ -106,6 +106,18 @@ module Psych } end + def test_io_utf8_read_as_binary + Tempfile.create(['utf8', 'yml']) {|t| + t.binmode + t.write '--- こんにちは!'.encode('UTF-8') + t.close + + File.open(t.path, 'rb', :encoding => 'ascii-8bit') do |f| + assert_equal "こんにちは!", Psych.load(f) + end + } + end + def test_emit_alias @emitter.start_stream Psych::Parser::UTF8 @emitter.start_document [], [], true |