]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/httputil.rb
Better flood control
[user/henk/code/ruby/rbot.git] / lib / rbot / httputil.rb
index 1a43c1850ec49e09e53f8e813ac149d7e23ebb80..bcb05d885b8bd10b4bfc40296364ce4876d2ce9a 100644 (file)
@@ -45,7 +45,10 @@ class HttpUtil
     @headers = {
       'User-Agent' => "rbot http util #{$version} (http://linuxbrit.co.uk/rbot/)",
     }
+    @last_response = nil
   end
+  attr_reader :last_response
+  attr_reader :headers
 
   # if http_proxy_include or http_proxy_exclude are set, then examine the
   # uri to see if this is a proxied uri
@@ -133,8 +136,9 @@ class HttpUtil
   # simple get request, returns (if possible) response body following redirs
   # and caching if requested
   # if a block is given, it yields the urls it gets redirected to
+  # TODO we really need something to implement proper caching
   def get(uri_or_str, readtimeout=10, opentimeout=5, max_redir=@bot.config["http.max_redir"], cache=false)
-    if uri_or_str.class <= URI
+    if uri_or_str.kind_of?(URI)
       uri = uri_or_str
     else
       uri = URI.parse(uri_or_str.to_s)
@@ -150,7 +154,7 @@ class HttpUtil
         resp = http.get(uri.request_uri(), @headers)
         case resp
         when Net::HTTPSuccess
-          if cache
+          if cache && !(resp.key?('cache-control') && resp['cache-control']=='must-revalidate')
             k = uri.to_s
             @cache[k] = Hash.new
             @cache[k][:body] = resp.body
@@ -177,18 +181,20 @@ class HttpUtil
         else
           debug "HttpUtil.get return code #{resp.code} #{resp.body}"
         end
+        @last_response = resp
         return nil
       }
     rescue StandardError, Timeout::Error => e
       error "HttpUtil.get exception: #{e.inspect}, while trying to get #{uri}"
       debug e.backtrace.join("\n")
     end
+    @last_response = nil
     return nil
   end
 
   # just like the above, but only gets the head
   def head(uri_or_str, readtimeout=10, opentimeout=5, max_redir=@bot.config["http.max_redir"])
-    if uri_or_str.class <= URI
+    if uri_or_str.kind_of?(URI)
       uri = uri_or_str
     else
       uri = URI.parse(uri_or_str.to_s)
@@ -201,7 +207,7 @@ class HttpUtil
     begin
       proxy.start() {|http|
         yield uri.request_uri() if block_given?
-        resp = http.head(uri.request_uri(), @headers)
+        resp = http.request_head(uri.request_uri(), @headers)
         case resp
         when Net::HTTPSuccess
           return resp
@@ -216,12 +222,14 @@ class HttpUtil
         else
           debug "HttpUtil.head return code #{resp.code}"
         end
+        @last_response = resp
         return nil
       }
     rescue StandardError, Timeout::Error => e
       error "HttpUtil.head exception: #{e.inspect}, while trying to get #{uri}"
       debug e.backtrace.join("\n")
     end
+    @last_response = nil
     return nil
   end
 
@@ -230,7 +238,7 @@ class HttpUtil
   def get_cached(uri_or_str, readtimeout=10, opentimeout=5,
                  max_redir=@bot.config['http.max_redir'],
                  noexpire=@bot.config['http.no_expire_cache'])
-    if uri_or_str.class <= URI
+    if uri_or_str.kind_of?(URI)
       uri = uri_or_str
     else
       uri = URI.parse(uri_or_str.to_s)