From: Tanaka Akira Date: 2003-05-02T13:14:19+09:00 Subject: [ruby-list:37643] Re: net/pop.rbにUIDLコマンドでMessage-Idのリストを取得するメソッド In article <002501c3105f$25ca0540$0547a8c0@motive.com>, "Keisuke Minami" 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]