青山です。

Keep-Alive を受け付けるとわかっているホスト相手には、こんな感じにする
とかなり高速化できます。ただし、なんらかの事情で相手が途中で
Connection: Close を返したりした場合にはおかしくなりますけれど。


#!/usr/local/bin/ruby

require "socket"

CR  = "\015"
LF  = "\012"
EOL = CR + LF

def get_head(host, port, files)
  heads = []
  sock = TCPsocket.open(host, port)
  sock.binmode
  STDERR.print "server open.\n"

  Thread.start do
    for i in 0 ... files.size

      if i == files.size - 1
        connection = "Close"
      else
        connection = "Keep-Alive"
      end

      sock << "HEAD " << files[i] << " HTTP/1.1" << EOL
      sock << "Host: " << host << EOL
      sock << "Connection: " << connection << EOL
      sock << EOL
    end
  end

  begin
    head = sock.gets(EOL + EOL)
    heads.push(head)
  end until /Connection:\s+Close/ni === head

  sock.close if not sock.closed?
  heads
end

port = "80"
host = "www.jin.gr.jp"
files = %w[ /~nahi/ /~nahi/Ruby/ /~nahi/link-Ruby.html ]

get_head(host, port, files).each do |head|
  print head
end


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>