class RDF::Util::File::NetHttpAdapter
Net::HTTP adapter to retrieve resources without additional dependencies @since 1.2
Public Class Methods
Source
# File lib/rdf/util/file.rb, line 119 def self.open_url(base_uri, proxy: nil, headers: {}, verify_none: false, **options) ssl_verify = verify_none ? OpenSSL::SSL::VERIFY_NONE : OpenSSL::SSL::VERIFY_PEER redirect_count = 0 max_redirects = 5 parsed_url = RDF::URI.parse(base_uri) parsed_proxy = RDF::URI.parse(proxy.to_s) base_uri = parsed_url.to_s remote_document = nil until remote_document do Net::HTTP::start(parsed_url.host, parsed_url.port, parsed_proxy.host, parsed_proxy.port, open_timeout: 60 * 1000, use_ssl: parsed_url.scheme == 'https', verify_mode: ssl_verify ) do |http| request = Net::HTTP::Get.new(parsed_url.request_uri, headers(headers: headers)) http.request(request) do |response| case response when Net::HTTPSuccess # found object # Normalize headers using symbols response_headers = response.to_hash.inject({}) do |out, (key, value)| out[key.gsub(/-/, '_').downcase.to_sym] = %w{ set-cookie }.include?(key.downcase) ? value : value.first out end # If a Location is returned, it defines the base resource for this file, not it's actual ending location document_options = { base_uri: RDF::URI(response["Location"] ? response["Location"] : base_uri), code: response.code.to_i, content_type: response.content_type, headers: response_headers }.merge(response.type_params) document_options[:last_modified] = DateTime.parse(response["Last-Modified"]) if response["Last-Modified"] remote_document = RemoteDocument.new(response.body, document_options) when Net::HTTPRedirection # Follow redirection raise IOError, "Too many redirects" if (redirect_count += 1) > max_redirects # Location may be relative parsed_url = ::URI.join(base_uri, response["Location"]) base_uri = parsed_url.to_s else raise IOError, "<#{parsed_url}>: #{response.message}(#{response.code})" end end end end remote_document end
(see HttpAdapter.open_url
)