記事検索
月別アーカイブ
アクセスカウンター

    タグ絞り込み検索
    2021年02月26日18:24bsfilterがときどき切れる問題

    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 ということまでは覚えていなかった。



    このエントリーをはてなブックマークに追加

    コメントする

    名前
     
      絵文字