Backport #7278

'warning: regexp match /.../n against to UTF-8 string' in net/protocol.rb

Added by Shintaro KAKUTANI almost 3 years ago. Updated over 2 years ago.

[ruby-dev:46394]
Status:Closed
Priority:Normal
Assignee:Usaku NAKAMURA

Description

かくたにです。
UTF-8のメールをRails 3.2.8 のActionMailerから出そうとすると、
'warning: regexp match /.../n against to UTF-8 string' の警告が出ます。
添付のパッチではASCII-8BITにforce_encodingする方法にしてみました。

過去1ヶ月の間にもモンキーパッチでしのいでる方を複数見かけたので、対応いただければと思っております。
http://dev.ywesee.com/Yasu/20121012-create-fachinfo-chapter-exporter-job
http://d.hatena.ne.jp/benikujyaku/20111002/1317536555

よろしくお願いします。

0001-lib-net-protocol.rb-Suppress-warning-message.patch Magnifier (719 Bytes) Shintaro KAKUTANI, 11/05/2012 09:45 AM

Associated revisions

Revision 37487
Added by Yui NARUSE almost 3 years ago

  • lib/net/protocol.rb (Net::InternetMessageIO#each_crlf_line): don't use /n in universal regexp. [Bug #7278]

Revision 37563
Added by Yui NARUSE almost 3 years ago

  • lib/net/protocol.rb (Net::InternetMessageIO#each_crlf_line): treat \r as newline as mame pointed. [Bug #7278]

Revision 38830
Added by Usaku NAKAMURA over 2 years ago

merge revision(s) 37487,37563: [Backport #7278]

* lib/net/protocol.rb (Net::InternetMessageIO#each_crlf_line):
  don't use /n in universal regexp.  [Bug #7278]

* lib/net/protocol.rb (Net::InternetMessageIO#each_crlf_line):
  treat \r as newline as mame pointed.  [Bug #7278]

History

#1 Updated by Nobuhiro IMAI almost 3 years ago

これだと yield される文字列のエンコーディングが ASCII-8BIT になってしまいますね。
each_line でダメなケースってあるのかな。test/net/ 以下のテストは全部とおります。
@wbuf を破壊しないことによる影響はちょっと分かりません。

diff --git a/lib/net/protocol.rb b/lib/net/protocol.rb
index 9733d56..743e59b 100644
--- a/lib/net/protocol.rb
+++ b/lib/net/protocol.rb
@@ -322,7 +322,7 @@ module Net # :nodoc:

 def each_crlf_line(src)
   buffer_filling(@wbuf, src) do
  • while line = @wbuf.slice!(/\A.*(?:\n|\r\n|\r(?!\z))/n)
  • @wbuf.each_line do |line| yield line.chomp("\n") + "\r\n" end end

#2 Updated by Shintaro KAKUTANI almost 3 years ago

意図としてはeach_lineでも良さそうに見えますし、破壊しないほうが行儀は良さそう!

#3 Updated by Yusuke Endoh almost 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to Yui NARUSE

正確にはここは微妙にメンテナがいないのですが、近縁の net/http のメンテナ
かつ encoding がらみということで成瀬さんに振ってみます。

コード見ただけですが、破壊的に書き換えることでバッファ管理してる気配が
ありますので、each_line じゃダメな予感がします。

そもそもこの正規表現、間違ってる気がすごくします。
/\A.?(?:\n|\r\n|\r(?!\z))/ と書きたかったのではないかなあ。
.
? の ? が足りない。

Yusuke Endoh mame@tsg.ne.jp

#4 Updated by Yui NARUSE almost 3 years ago

mame (Yusuke Endoh) wrote:

そもそもこの正規表現、間違ってる気がすごくします。
/\A.?(?:\n|\r\n|\r(?!\z))/ と書きたかったのではないかなあ。
.
? の ? が足りない。

ちなみに、この . は [\n] のことなので、? はなくても大丈夫です。

#5 Updated by Yui NARUSE almost 3 years ago

  • % Done changed from 0 to 100
  • Status changed from Assigned to Closed

This issue was solved with changeset r37487.
Shintaro, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • lib/net/protocol.rb (Net::InternetMessageIO#each_crlf_line): don't use /n in universal regexp. [Bug #7278]

#6 Updated by Yusuke Endoh almost 3 years ago

naruse (Yui NARUSE) wrote:

mame (Yusuke Endoh) wrote:

そもそもこの正規表現、間違ってる気がすごくします。
/\A.?(?:\n|\r\n|\r(?!\z))/ と書きたかったのではないかなあ。
.
? の ? が足りない。

ちなみに、この . は [\n] のことなので、? はなくても大丈夫です。

"foo\rbar\r" を "foo" と "bar" に分けてほしいのではないかと。
実際、この正規表現が書かれた r5907 以前では \r で切れていたように読めます。
動かしてないので勘違いならすみません。

Yusuke Endoh mame@tsg.ne.jp

#7 Updated by Yui NARUSE over 2 years ago

  • Tracker changed from Bug to Backport
  • Project changed from Ruby trunk to Backport193
  • Status changed from Closed to Assigned
  • Assignee changed from Yui NARUSE to Usaku NAKAMURA

#8 Updated by Usaku NAKAMURA over 2 years ago

  • Status changed from Assigned to Closed

This issue was solved with changeset r38830.
Shintaro, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


merge revision(s) 37487,37563: [Backport #7278]

* lib/net/protocol.rb (Net::InternetMessageIO#each_crlf_line):
  don't use /n in universal regexp.  [Bug #7278]

* lib/net/protocol.rb (Net::InternetMessageIO#each_crlf_line):
  treat \r as newline as mame pointed.  [Bug #7278]

Also available in: Atom PDF