summaryrefslogtreecommitdiff
path: root/lib/rbot/httputil.rb
blob: ff3216a6bd62df9efac78d3bb2ff5cf276792a9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
module Irc

require 'net/http'
Net::HTTP.version_1_2
  
# class for making http requests easier (mainly for plugins to use)
# 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
  def initialize(bot)
    @bot = bot
    @headers = {
      'User-Agent' => "rbot http util #{$version} (http://linuxbrit.co.uk/rbot/)",
    }
  end

  # uri:: Uri to create a proxy for
  #
  # return a net/http Proxy object, which is configured correctly for
  # proxying based on the bot's proxy configuration. 
  # This will include per-url proxy configuration based on the bot config
  # +http_proxy_include/exclude+ options.
  def get_proxy(uri)
    proxy = nil
    if (ENV['http_proxy'])
      proxy = URI.parse ENV['http_proxy']
    end
    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
    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"]
      end
    end
    if proxy
      proxy_host = proxy.host
      proxy_port = proxy.port
    end
    
    return Net::HTTP.new(uri.host, uri.port, proxy_host, proxy_port, proxy_user, proxy_port)
  end

  # uri::         uri to query (Uri object)
  # readtimeout:: timeout for reading the response
  # opentimeout:: timeout for opening the connection
  #
  # simple get request, returns response body if the status code is 200 and
  # the request doesn't timeout.
  def get(uri, readtimeout=10, opentimeout=5)
    proxy = get_proxy(uri)
    proxy.open_timeout = opentimeout
    proxy.read_timeout = readtimeout
   
    begin
      proxy.start() {|http|
        resp = http.get(uri.request_uri(), @headers)
        if resp.code == "200"
          return resp.body
        else
          puts "HttpUtil.get return code #{resp.code} #{resp.body}"
        end
        return nil
      }
    rescue StandardError, Timeout::Error => e
      $stderr.puts "HttpUtil.get exception: #{e}, while trying to get #{uri}"
    end
    return nil
  end
end

end