read_bodyでジェネレータ

ジェネレータを使えば、呼び出し側トリガでread_bodyを回せるなぁ…と思って、少し頭をひねってみる。

#!/usr/bin/env ruby1.9
require 'net/http'
require 'uri'
require 'enumerator'

class WebEnum
  def initialize(uri)
    @uri = URI.parse(uri)
    @http = Net::HTTP.new(@uri.host, @uri.port)
    @itor = self.to_enum
  end

  def next
    @itor.next
  rescue StopIteration
    nil
  end

  private
  def each
    req = Net::HTTP::Get.new(@uri.path)

    @http.request(req) do |res|
      res.read_body do |str|
        yield(str)
      end
    end
  end
end

we = WebEnum.new('http://www.hatena.ne.jp/')

while chunk = we.next
  puts "(#{chunk.length}B) #{chunk.slice(0, 16).inspect}"
end


~/work$ ./foo.rb
(10548B) "