bsfilterをpop proxyとしてうごかしてmewで読むということをしているのだが、ときどきあるメールで受信が止まってしまうという現象が起きていた。そういうときはbsfilterをとおさずにpopアクセスして問題のメールだけ削除して逃げていたのだが、調べる気になったので調べてみたところ
"invalid byte sequence in EUC-JP"
というメッセージが表示されていた(普段はバックグラウンドでうごかしてメッセージは/dev/nullにすていているので気づいていなかった)。
しらべてみるとbsfilterの「invalid byte sequence in EUC-JP」を回避するというそのものずばりなページがありさっそくパッチを当ててみたが直らず、バックとレースを仕込んでしらべてみたらまた別なところで同様なことがおこっていた。なんだかあちこちscrubを埋め込まないといけない予感がするが、とりあえず問題になったところだけパッチして今回は終了した。
ついでにtimeout関係の書き方が古いらしいのでこれも修正。
% cvs diff
cvs diff: Diffing .
Index: bsfilter
===================================================================
RCS file: /cvsroot/bsfilter/bsfilter/bsfilter,v
retrieving revision 1.87
diff -u -p -r1.87 bsfilter
--- bsfilter 3 Nov 2013 10:22:15 -0000 1.87
+++ bsfilter 26 Feb 2021 09:18:45 -0000
@@ -1243,7 +1243,7 @@ EOM
""
end
end
- content = NKF::nkf('-e -X -Z0', content.gsub(/\?(iso-2202-jp|shift-jis)\?/i, '?ISO-2022-JP?'))
+ content = NKF::nkf('-e -X -Z0', content.scrub('?').gsub(/\?(iso-2202-jp|shift-jis)\?/i, '?ISO-2022-JP?'))
else
content = latin2ascii(content)
end
@@ -1368,7 +1368,7 @@ EOM
def decode_character_reference(str, lang)
if (@options["utf-8"])
- newstr = str.gsub(/\&\#(\d{1,5}|x[\da-f]{1,4});/i) do
+ newstr = str.scrub('?').gsub(/\&\#(\d{1,5}|x[\da-f]{1,4});/i) do
hex_or_dec = $1
if (hex_or_dec =~ /^x(.*)/i)
hex_str = $1
@@ -2633,7 +2633,7 @@ EOM
return if (str =~ /^\A\-ERR/)
while (str != ".\r\n")
- timeout(SOCKET_TIMEOUT) do
+ Timeout.timeout(SOCKET_TIMEOUT) do
pop_proxy_socket.write(str = pop_socket.gets) # forward
end
end
@@ -2664,7 +2664,7 @@ EOM
@options["message-fh"].print(pop_proxy_socket, " is accepted\n") if (@options["verbose"])
begin
pop_socket = nil
- timeout(SOCKET_TIMEOUT) do
+ Timeout.timeout(SOCKET_TIMEOUT) do
pop_socket = TCPSocket.open(pop_server, pop_port)
end
@options["message-fh"].print(pop_socket, " is connected\n") if (@options["verbose"])
@@ -2718,12 +2718,13 @@ EOM
pop_proxy_socket.write(response.join) # return response to MUA
end
end
- rescue TimeoutError
+ rescue Timeout::Error
@options["message-fh"].printf("Timeout error %s %s %s\n", pop_server, pop_port, pop_proxy_port) if (@options["verbose"])
- rescue
+ rescue => e
@options["message-fh"].printf("pop exception caught %s %s %s\n", pop_server, pop_port, pop_proxy_port) if (@options["verbose"])
p "#{$!}" if (@options["verbose"])
p "#{$@}" if (@options["debug"])
+ p e.backtrace
ensure
if (pop_proxy_socket && ! pop_proxy_socket.closed?)
@options["message-fh"].print(pop_proxy_socket, " is gone\n") if (@options["verbose"])
@@ -2894,12 +2895,12 @@ EOM
def setup_socket_timeout
TCPSocket.class_eval <<EOM
def write_timeout(str)
- timeout(SOCKET_TIMEOUT) do
+ Timeout.timeout(SOCKET_TIMEOUT) do
return self.write(str)
end
end
def gets_timeout
- timeout(SOCKET_TIMEOUT) do
+ Timeout.timeout(SOCKET_TIMEOUT) do
s = self.gets
if (s == nil)
raise "socket.gets returned nil"
@@ -2916,12 +2917,12 @@ EOM
def setup_ssl_socket_timeout
OpenSSL::SSL::SSLSocket.class_eval <<EOM
def write_timeout(str)
- timeout(SOCKET_TIMEOUT) do
+ Timeout.timeout(SOCKET_TIMEOUT) do
return self.write(str)
end
end
def gets_timeout
- timeout(SOCKET_TIMEOUT) do
+ Timeout.timeout(SOCKET_TIMEOUT) do
s = self.gets
if (s == nil)
raise "ssl_socket.gets returned nil"
久しぶりにCVSをさわった。体が覚えていたが cvs up -n じゃなくて cvs -n up ということまでは覚えていなかった。














