[#86520] [Ruby trunk Bug#14681] `syswrite': stream closed in another thread (IOError) — samuel@...
Issue #14681 has been reported by ioquatix (Samuel Williams).
3 messages
2018/04/12
[#86755] [Ruby trunk Feature#14723] [WIP] sleepy GC — normalperson@...
Issue #14723 has been reported by normalperson (Eric Wong).
6 messages
2018/04/29
[ruby-core:86601] [Ruby trunk Feature#14352] Array#pack("M") Quoted-Printable with binary mode
From:
naruse@...
Date:
2018-04-19 07:54:23 UTC
List:
ruby-core #86601
Issue #14352 has been updated by naruse (Yui NARUSE).
議論したのですが、結論としてドキュメントイシューということになりました。
大本のPerlもそうですが、pack/unpackは前提として、Unix環境で入力をとり、LFのまま出力し、
その出力をsendmail等に流して、それらがLFをCRLFに変換することを想定したものであろうという見解に至りました。
よって、現状の挙動はその用途においては妥当なものなので、変更せず、ドキュメントの追記のみを行いました。
kirika (Toshio Maki) wrote:
> また、Mailライブラリ側でも同種の議論があり、バイナリの場合はto_crlfで改変しないようにするのか、
> pack("M")呼び出し時に、後処理をするのかなど、試行錯誤していますが、まだ落ち着いていない状況です。
>
> https://github.com/mikel/mail/issues/1010
> https://github.com/mikel/mail/pull/1113
>
> Ruby側でバイナリモード時のQuoted-Printableがサポートされれば、それを呼び出すのが一番いいのではないかと思っているのですが、
> pack("M")の出力に加工を加える、でも対応はできると思うので、ここでの方針が決まれば、mailライブラリのコミュニティにも報告しようかと思っています。
バイナリモード時の Quoted-Printable はハード改行をどう扱うかが一般にはよくわからないので、
汎用ツールであるRubyでは扱わないことになりました。
ad-hocな対応はmailライブラリの側で対応をお願いします。
----------------------------------------
Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352#change-71557
* Author: kirika (Toshio Maki)
* Status: Closed
* Priority: Normal
* Assignee:
* Target version:
----------------------------------------
英語で書こうと思ったのですが、うまく伝えられないかもしれないので日本語で書かせてください。すみません。
mail libraryというgemを使ってメールをパースしたり、書きだしたりしているのですが、
Quoted-Printableでエンコードされたバイナリがメールに含まれていた場合に、メールを破壊する
可能性があるということが分かりました。
調査してみると、RubyのArray#Pack("M")を使ったときに、以下のように
\rは=0Dに変換してくれるのですが、\nは=0Aではなく、そのまま\nで維持するのが問題のようで、
mail libraryはパース前の処理に\nを\r\nに変換するという処理を加えるのですが、その時に\nが
\r\nに変換され、オリジナルのバイナリを破壊してしまうことが分かりました。
<pre>
puts ["あいうえお\r\nかきくけこ"].pack('M')
</pre>
実行結果
<pre>
=E3=81=82=E3=81=84=E3=81=86=E3=81=88=E3=81=8A=0D
=E3=81=8B=E3=81=8D=E3=81=8F=E3=81=91=E3=81=93=
</pre>
Quoted-Printableにおいては、レイアウトのための改行は=\r\nにする、ということが決まっているので、
このように\nが単独で残るということはないような気がするのですが、昨年末にまつもとさんにご質問
させていただいた際にPerlの実装を参考にした、ということを伺ったので、Perlについても調べて
みたのですが、Perlは$binmodeというフラグで、バイナリ時の挙動と分けているようです。
http://perldoc.perl.org/MIME/QuotedPrint.html
(もしかすると、参考にした実装とは関係ないかもしれません)
今からpack('M')の挙動を変えると、影響範囲が大きそうなので、バイナリをQuoted-Printableでエンコード
するためのオプションがあれば、いいと思うのですが、packにどういうオプション名をつければよいか、
またpack.cのqpencode関数にbinmode用の拡張しても良いかを含めてご相談させてください。
出来れば今使っているrubyのバージョンは2.3とかだったりするので、2.3.x, 2.4.xにバックポート可能かどうかも
含めて相談させてもらえれば、と思います。
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>