7 # class for making http requests easier (mainly for plugins to use)
8 # this class can check the bot proxy configuration to determine if a proxy
9 # needs to be used, which includes support for per-url proxy configuration.
11 BotConfig.register('http.proxy', :default => false,
12 :desc => "Proxy server to use for HTTP requests (URI, e.g http://proxy.host:port)")
13 BotConfig.register('http.proxy_user', :default => false,
14 :desc => "User for authenticating with the http proxy (if required)")
15 BotConfig.register('http.proxy_pass', :default => false,
16 :desc => "Password for authenticating with the http proxy (if required)")
17 BotConfig.register('http.proxy_include', :type => :array, :default => [],
18 :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")
19 BotConfig.register('http.proxy_exclude', :type => :array, :default => [],
20 :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")
25 'User-Agent' => "rbot http util #{$version} (http://linuxbrit.co.uk/rbot/)",
29 # if http_proxy_include or http_proxy_exclude are set, then examine the
30 # uri to see if this is a proxied uri
31 # the in/excludes are a list of regexps, and each regexp is checked against
32 # the server name, and its IP addresses
33 def proxy_required(uri)
35 if @bot.config["http.proxy_exclude"].empty? && @bot.config["http.proxy_include"].empty?
41 list.push Resolv.getaddresses(uri.host)
42 rescue StandardError => err
43 puts "warning: couldn't resolve host uri.host"
46 unless @bot.config["http.proxy_exclude"].empty?
47 re = @bot.config["http.proxy_exclude"].collect{|r| Regexp.new(r)}
57 unless @bot.config["http.proxy_include"].empty?
58 re = @bot.config["http.proxy_include"].collect{|r| Regexp.new(r)}
68 debug "using proxy for uri #{uri}?: #{use_proxy}"
72 # uri:: Uri to create a proxy for
74 # return a net/http Proxy object, which is configured correctly for
75 # proxying based on the bot's proxy configuration.
76 # This will include per-url proxy configuration based on the bot config
77 # +http_proxy_include/exclude+ options.
80 if (ENV['http_proxy'])
81 proxy = URI.parse ENV['http_proxy']
83 if (@bot.config["http.proxy"])
84 proxy = URI.parse ENV['http_proxy']
88 debug "proxy is set to #{proxy.uri}"
89 proxy = nil unless proxy_required(uri)
96 if @bot.config["http.proxy_user"]
97 proxy_user = @bot.config["http.proxy_user"]
98 if @bot.config["http.proxy_pass"]
99 proxy_pass = @bot.config["http.proxy_pass"]
103 proxy_host = proxy.host
104 proxy_port = proxy.port
107 return Net::HTTP.new(uri.host, uri.port, proxy_host, proxy_port, proxy_user, proxy_port)
110 # uri:: uri to query (Uri object)
111 # readtimeout:: timeout for reading the response
112 # opentimeout:: timeout for opening the connection
114 # simple get request, returns response body if the status code is 200 and
115 # the request doesn't timeout.
116 def get(uri, readtimeout=10, opentimeout=5)
117 proxy = get_proxy(uri)
118 proxy.open_timeout = opentimeout
119 proxy.read_timeout = readtimeout
122 proxy.start() {|http|
123 resp = http.get(uri.request_uri(), @headers)
124 if resp.code == "200"
127 puts "HttpUtil.get return code #{resp.code} #{resp.body}"
131 rescue StandardError, Timeout::Error => e
132 $stderr.puts "HttpUtil.get exception: #{e}, while trying to get #{uri}"