#!/usr/bin/env ruby # WebAgent class # # Copyright 2001 TAKAHASHI 'Maki' Masayoshi # You can redistribute and/or modify it under the same term as Ruby. # cf. http://www.ruby-lang.org/en/LICENSE.txt require 'net/http' require 'cgi' #require 'simpleuri' class CGI class Cookie def Cookie._load(dumped) str = Marshal.load(dumped) load_str(str) end def Cookie.load_str(str) str =~ /^([^=]*)=([^;]*)(;(.*))?$/ name, values_str, rest = $1.strip, $2, $4 name = CGI::unescape(name) values_str ||= "" values = values_str.split('&').collect{|v| CGI::unescape(v)} cookie_hash = {'name'=>name, 'value'=>values} if rest rest.split(';').each do |pair| name, value_str = pair.split('=', 2) name = CGI::unescape(name.strip) value_str ||= "" value = if name == 'expires' require 'parsedate' Time.gm(*ParseDate::parsedate(value_str)[0..5]) elsif name == 'secure' true else value_str end cookie_hash[name] = value end end Cookie.new(cookie_hash) end def _dump(limit) dumped = self.to_s Marshal.dump(dumped) end end end class WebAgent ## cookie保存用ファイル COOKIE_FILE = '.agent_cookie' attr_accessor :code, :message, :header, :body attr_accessor :cookies def uri=(uri) case uri when String @uri = URI.create(uri) else @uri = uri end end def initialize() @code = nil @body = nil @header = nil @old_uri = [] @cookies = Hash.new() @cookie_file = COOKIE_FILE end def get_http_adapter() if ENV['http_proxy'] @p_uri = URI.create(ENV['http_proxy']) return Net::HTTP::Proxy(@p_uri.host, @p_uri.port) else return Net::HTTP end end def load_cookie if @cookie_file && FileTest.exist?(@cookie_file) begin open(@cookie_file){|f| @cookies = Marshal.load(f) } end end end def set_user_header() @user_header = Hash.new() load_cookie() send_cookies = @cookies.collect{|key, val| path_length = val.path.length #p val.path[0, path_length] if val.domain == @uri.host && val.path == @uri.path[0, path_length] "#{key}=#{val.value.join('&').gsub(/\+/,'%2B')}" end } @user_header['cookie'] = send_cookies.join("; ") @user_header['user-agent'] = 'HTTP-getter (Ruby)' end def get() net_http = get_http_adapter() set_user_header() net_http.start(@uri.host, @uri.port) do |http| request_path = @uri.path request_path += ('?' + @uri.query) if @uri.query # p [request_path, @user_header] res = http.get2(request_path, @user_header) @code = res.code @message = res.message @header = Hash.new() res.each{|key, value| @header[key] = value } if @header['set-cookie'] # p @header['set-cookie'] @cookies = Hash.new() cookie = CGI::Cookie.load_str(@header['set-cookie']) @cookies[cookie.name] = cookie #p @cookies end # p @header @body = res.body end save_cookie() if %r|