Example of how to use Ruby's NET::HTTP

I always forget how to use NET:HTTP and examples online are of little help, so I use this code as a starting point when I work with NET:HTTP. The code supports: \* HTTP redirects \* POST/GET \* Headers \* SSL/HTTPs \* Proxies \* Debugging HTTP traffic \* HTTP connection and read timeout ```ruby require 'net/http' require 'net/https' require 'uri' class HTTP class << self def get(url, options = {}) execute(url, options) end def post(url, options = { :method => :post }) execute(url, options) end protected def proxy http_proxy = ENV["http_proxy"] URI.parse(http_proxy) rescue nil end def to_uri(url) begin if !url.kind_of?(URI) url = URI.parse(url) end rescue raise URI::InvalidURIError, "Invalid url '#{url}'" end if (url.class != URI::HTTP && url.class != URI::HTTPS) raise URI::InvalidURIError, "Invalid url '#{url}'" end url end def execute(url, options = {}) options = { :parameters => {}, :debug => false, :http_timeout => 60, :method => :get, :headers => {}, :redirect_count => 0, :max_redirects => 10 }.merge(options) url = to_uri(url) if proxy http = Net::HTTP::Proxy(proxy.host, proxy.port).new(url.host, url.port) else http = Net::HTTP.new(url.host, url.port) end if url.scheme == 'https' http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE end http.open_timeout = http.read_timeout = options[:http_timeout] http.set_debug_output $stderr if options[:debug] request = case options[:method] when :post request = Net::HTTP::Post.new(url.request_uri) request.set_form_data(options[:parameters]) request else Net::HTTP::Get.new(url.request_uri) end options[:headers].each { |key, value| request[key] = value } response = http.request(request) if response.kind_of?(Net::HTTPRedirection) options[:redirect_count] += 1 if options[:redirect_count] > options[:max_redirects] raise "Too many redirects (#{options[:redirect_count]}): #{url}" end redirect_url = redirect_url(response) if redirect_url.start_with?('/') url = to_uri("#{url.scheme}://#{url.host}#{redirect_url}") end response = execute(url, options) end response end # From http://railstips.org/blog/archives/2009/03/04/following-redirects-with-nethttp/ def redirect_url(response) if response['location'].nil? response.body.match(/]+)\">/i)[1] else response['location'] end end end end ``` You can also find my [Net:HTTP example on Github](https://github.com/christianhellsten/ruby-http-client)