]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/httputil.rb
Sat Jul 30 01:19:32 BST 2005 Tom Gilbert <tom@linuxbrit.co.uk>
[user/henk/code/ruby/rbot.git] / lib / rbot / httputil.rb
index ff3216a6bd62df9efac78d3bb2ff5cf276792a9c..56de73492cbcfcf13f6194c46e5ff7eb71c6a771 100644 (file)
@@ -1,5 +1,6 @@
 module Irc
 
+require 'resolv'
 require 'net/http'
 Net::HTTP.version_1_2
   
@@ -7,6 +8,17 @@ Net::HTTP.version_1_2
 # this class can check the bot proxy configuration to determine if a proxy
 # needs to be used, which includes support for per-url proxy configuration.
 class HttpUtil
+    BotConfig.register('http.proxy', :default => false,
+      :desc => "Proxy server to use for HTTP requests (URI, e.g http://proxy.host:port)")
+    BotConfig.register('http.proxy_user', :default => false,
+      :desc => "User for authenticating with the http proxy (if required)")
+    BotConfig.register('http.proxy_pass', :default => false,
+      :desc => "Password for authenticating with the http proxy (if required)")
+    BotConfig.register('http.proxy_include', :type => :array, :default => [],
+      :desc => "List of regexps to check against a URI's hostname/ip to see if we should use the proxy to access this URI. All URIs are proxied by default if the proxy is set, so this is only required to re-include URIs that might have been excluded by the exclude list. e.g. exclude /.*\.foo\.com/, include bar\.foo\.com")
+    BotConfig.register('http.proxy_exclude', :type => :array, :default => [],
+      :desc => "List of regexps to check against a URI's hostname/ip to see if we should use avoid the proxy to access this URI and access it directly")
+
   def initialize(bot)
     @bot = bot
     @headers = {
@@ -14,6 +26,49 @@ class HttpUtil
     }
   end
 
+  # if http_proxy_include or http_proxy_exclude are set, then examine the
+  # uri to see if this is a proxied uri
+  # the in/excludes are a list of regexps, and each regexp is checked against
+  # the server name, and its IP addresses
+  def proxy_required(uri)
+    use_proxy = true
+    if @bot.config["http.proxy_exclude"].empty? && @bot.config["http.proxy_include"].empty?
+      return use_proxy
+    end
+
+    list = [uri.host]
+    begin
+      list.push Resolv.getaddresses(uri.host)
+    rescue StandardError => err
+      puts "warning: couldn't resolve host uri.host"
+    end
+
+    unless @bot.config["http.proxy_exclude"].empty?
+      re = @bot.config["http.proxy_exclude"].collect{|r| Regexp.new(r)}
+      re.each do |r|
+        list.each do |item|
+          if r.match(item)
+            use_proxy = false
+            break
+          end
+        end
+      end
+    end
+    unless @bot.config["http.proxy_include"].empty?
+      re = @bot.config["http.proxy_include"].collect{|r| Regexp.new(r)}
+      re.each do |r|
+        list.each do |item|
+          if r.match(item)
+            use_proxy = true
+            break
+          end
+        end
+      end
+    end
+    debug "using proxy for uri #{uri}?: #{use_proxy}"
+    return use_proxy
+  end
+
   # uri:: Uri to create a proxy for
   #
   # return a net/http Proxy object, which is configured correctly for
@@ -25,28 +80,23 @@ class HttpUtil
     if (ENV['http_proxy'])
       proxy = URI.parse ENV['http_proxy']
     end
-    if (@bot.config["http_proxy"])
+    if (@bot.config["http.proxy"])
       proxy = URI.parse ENV['http_proxy']
     end
 
-    # if http_proxy_include or http_proxy_exclude are set, then examine the
-    # uri to see if this is a proxied uri
-    if uri
-      if @bot.config["http_proxy_exclude"]
-        # TODO
-      end
-      if @bot.config["http_proxy_include"]
-      end
+    if proxy
+      debug "proxy is set to #{proxy.uri}"
+      proxy = nil unless proxy_required(uri)
     end
     
     proxy_host = nil
     proxy_port = nil
     proxy_user = nil
     proxy_pass = nil
-    if @bot.config["http_proxy_user"]
-      proxy_user = @bot.config["http_proxy_user"]
-      if @bot.config["http_proxy_pass"]
-        proxy_pass = @bot.config["http_proxy_pass"]
+    if @bot.config["http.proxy_user"]
+      proxy_user = @bot.config["http.proxy_user"]
+      if @bot.config["http.proxy_pass"]
+        proxy_pass = @bot.config["http.proxy_pass"]
       end
     end
     if proxy