Ruby HTTP JSON fetch with timeouts
Ruby
require 'net/http'
require 'json'
def fetch_json(url, open_timeout: 3, read_timeout: 5)
uri = URI.parse(url)
raise ArgumentError, 'only http(s) URLs are supported' unless uri.is_a?(URI::HTTP)
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https',
open_timeout: open_timeout, read_timeout: read_timeout) do |http|
http.request(Net::HTTP::Get.new(uri))
end
raise %Q(HTTP #{response.code}) unless response.is_a?(Net::HTTPSuccess)
JSON.parse(response.body)
rescue JSON::ParserError => error
raise ArgumentError, %Q(invalid JSON: #{error.message})
end