ruby realize cookies management

用ruby实现HTTP Cookies管理。

#!/usr/bin/env rubyrequire 'pp'require 'erb'require 'uri'require 'hpricot'require 'net/http'require 'net/https'module CookieMechanism  def cookies_hashed(set_cookie, path, domain)    expires = 'Mon, 01-Jan-2010 00:00:00 GMT'    arr_hashed = Array.new    if set_cookie      arr = set_cookie.split(/, /)      for i in 0 ... arr.size - 1        if arr[i] =~ /Expires=/ && arr[i + 1] =~ /.*GMT/          arr[i] << ', ' << arr[i + 1]          arr[i + 1] = ''        end      end      arr.delete_if {|del| del == ''}      arr.each do |cookie|        fields = cookie.split(';')        hashed = Hash.new        hashed['Path'] = path        hashed['Domain'] = domain        hashed['Secure'] = 0        fields.each do |f|          h = f.strip.split('=', 2)          h[0].capitalize! if h[0].capitalize =~ /Expires|Path|Domain|Secure/i          h[1] = 1 if h[0] == 'Secure'          hashed.merge!({h[0] => h[1]})        end        if hashed.has_key?('Expires')          hashed['Expires'] = 0 if Time.httpdate(hashed['Expires']) <= Time.now()        else          hashed['Expires'] = expires        end        arr_hashed << hashed      end    end    return arr_hashed  end  def cookies_process(arr_hashed_new, arr_hashed_old = Array.new)    arr_hashed_new.each do |new|      same_key = 0      new.each do |new_key, new_value|        if new_key !~ /Expires|Path|Domain|Secure/i          arr_hashed_old.each do |old|            old.each do |old_key, old_value|              if old_key !~ /Expires|Path|Domain|Secure/i && same_key == 0                if old_key == new_key                  same_key = 1                end              end              break if same_key == 1            end          end          if same_key == 1            arr_hashed_old.each do |old|              old.each do |old_key, old_value|                if old_key == new_key                  if new['Path'] == old['Path'] && new['Domain'] == old['Domain']                    if new['Expires'] != 0                      old[old_key] = new_value                      old['Expires'] = new['Expires']                      old['Secure'] = new['Secure']                    else                      arr_hashed_old.delete(old)                    end                  else                    arr_hashed_old << new if new['Expires'] != 0                  end                end              end            end          else            arr_hashed_old << new if new['Expires'] != 0          end        end      end    end    return arr_hashed_old  end  def cookies_request(arr_hashed_old, path, domain, secure = 0)    cookie = String.new    cookies = Array.new    arr_hashed_old.each do |old|      reg_str = Regexp.escape(old['Path'])      reg_path = Regexp.new('^' + reg_str)      reg_str = Regexp.escape(old['Domain'])      reg_domain = Regexp.new(reg_str + '$')      if path =~ reg_path && domain =~ reg_domain        if secure == 0          cookies << old if old['Secure'] == 0        else          cookies << old        end      end    end    cookies.sort!{|a, b| a['Path'] <=> b['Path']}.reverse!    cookies.each do |c|      c.each do |key, value|        if key !~ /Expires|Path|Domain|Secure/i          cookie == '' ? cookie += key + '=' + value : cookie += '; ' + key + '=' + value        end      end    end    return cookie  end  def add_cookie(response, path, domain, arr_hashed_old)    set_cookie = response['set-cookie']    # response: HTTPResponse object    arr_hashed_new = cookies_hashed(set_cookie, path, domain)    arr_hashed_old = cookies_process(arr_hashed_new, arr_hashed_old)  end  def get_http_headers(path, domain, arr_hashed_old)    return {     'Cookie' => cookies_request(arr_hashed_old, path, domain, 0),     'User-Agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',     'Connection' => 'Keep-Alive',     'Accept-Language' => 'zh-cn'    }  end  def post_http_headers(path, domain, arr_hashed_old)    return {     'Cookie' => cookies_request(arr_hashed_old, path, domain, 0),     'Content-Type' => 'application/x-www-form-urlencoded',     'User-Agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',     'Connection' => 'Keep-Alive',     'Accept-Language' => 'zh-cn'    }  end  def get_https_headers(path, domain, arr_hashed_old)    return {     'Cookie' => cookies_request(arr_hashed_old, path, domain, 1),     'User-Agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',     'Connection' => 'Keep-Alive',     'Accept-Language' => 'zh-cn'    }  end  def post_https_headers(path, domain, arr_hashed_old)    return {     'Cookie' => cookies_request(arr_hashed_old, path, domain, 1),     'Content-Type' => 'application/x-www-form-urlencoded',     'User-Agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',     'Connection' => 'Keep-Alive',     'Accept-Language' => 'zh-cn'    }  endend