[ruby-list:37643] Re: net/pop.rbにUIDLコマンドでMessage-Idのリストを取得するメソッド

From: Tanaka Akira <akr@...17n.org>
Date: 2003-05-02 04:14:19 UTC
List: ruby-list #37643
In article <002501c3105f$25ca0540$0547a8c0@motive.com>,
  "Keisuke Minami" <keisuke@rccn.com> writes:

> ただ、net/pop.rbでいろいろとやってくれるのはいいのですが、
> セッション内でどんなコマンドを発行したかを、
> なんらかの手段で取得できるとうれしいですね。
> #今まで、直接NICに流れるデータを見て確認していたので。

net/pop 用というわけではありませんが、-rdebug-socket とすると
TCPSocket 経由の通信を全部ファイルに記録するというものを書いたことがあ
ります。そういうやりかたもあるかもしれません。

require 'socket'

module DebugSocket
  @@seq = 0
  def DebugSocket.open_log
    n = (@@seq += 1)
    File.open("/tmp/debug-socket-#{n}", 'w')
  end

  class TCPSock < TCPSocket
    def initialize(host, service, *rest)
      super
      @debug_log = DebugSocket.open_log
      @debug_log << "#{host}:#{service}\n"
    end

    def write(str)
      str.each_line {|line| @debug_log << ">" << line.dump << "\n"}
      super
    end

    def syswrite(str)
      str.each_line {|line| @debug_log << ">" << line.dump << "\n"}
      super
    end

    def each(*args)
      super(*args) {|line|
	@debug_log << "<" << line.dump << "\n"
        yield line
      }
    end
    alias each_line each

    def each_byte(*args)
      super(*args) {|ch|
	@debug_log << "<" << [ch].pack("C").dump << "\n"
        yield ch
      }
    end

    def getc(*args)
      ch = super
      @debug_log << "<" << [ch].pack("C").dump << "\n" if ch
      return ch
    end

    def gets(*args)
      line = super
      @debug_log << "<" << line.dump << "\n" if line
      return line
    end

    def read(*args)
      str = super
      str.each_line {|line| @debug_log << "<" << line.dump << "\n"}
      return str
    end

    def readchar(*args)
      ch = super
      @debug_log << "<" << [ch].pack("C").dump << "\n"
      return ch
    end

    def readline(*args)
      line = super
      @debug_log << "<" << line.dump << "\n"
      return line
    end

    def readlines(*args)
      lines = super
      lines.each {|line| @debug_log << "<" << line.dump << "\n"}
      return lines
    end

    def sysread(*args)
      str = super
      str.each_line {|line| @debug_log << "<" << line.dump << "\n"}
      return str
    end
  end
end

class << TCPSocket
  alias debugsocket_original_new new
  def new(host, service, *rest)
    DebugSocket::TCPSock.debugsocket_original_new(host, service, *rest)
  end
end
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread