class MetaInspector::Request
Makes the request to the server
Public Class Methods
Source
# File lib/meta_inspector/request.rb, line 14 def initialize(initial_url, options = {}) @url = initial_url fail MetaInspector::RequestError.new('URL must be HTTP') unless @url.url =~ /http[s]?:\/\//i @allow_redirections = options[:allow_redirections] @connection_timeout = options[:connection_timeout] @read_timeout = options[:read_timeout] @retries = options[:retries] @encoding = options[:encoding] @headers = options[:headers] @faraday_options = options[:faraday_options] || {} @faraday_http_cache = options[:faraday_http_cache] response # request early so we can fail early end
Public Instance Methods
Source
# File lib/meta_inspector/request.rb, line 43 def content_type return nil if response.headers['content-type'].nil? response.headers['content-type'].split(';')[0] if response end
Source
# File lib/meta_inspector/request.rb, line 34 def read return unless response body = response.body body = body.encode!(@encoding, @encoding, :invalid => :replace) if @encoding body.tr("\000", '') rescue ArgumentError => e raise MetaInspector::RequestError.new(e) end
Source
# File lib/meta_inspector/request.rb, line 48 def response @response ||= fetch rescue Faraday::TimeoutError => e raise MetaInspector::TimeoutError.new(e) rescue Faraday::ConnectionFailed, Faraday::SSLError, URI::InvalidURIError, Faraday::FollowRedirects::RedirectLimitReached => e raise MetaInspector::RequestError.new(e) end
Private Instance Methods
Source
# File lib/meta_inspector/request.rb, line 106 def fatal_timeout (@connection_timeout || 0) + (@read_timeout || 0) + 1 end
Timeouts when connecting / reading a request are handled by Faraday, but in the case of URLs that respond with streaming, Faraday will never return. In that case, we’ll resort to our own timeout
github.com/jaimeiniesta/metainspector/issues/188 github.com/lostisland/faraday/issues/602
Source
# File lib/meta_inspector/request.rb, line 58 def fetch Timeout::timeout(fatal_timeout) do @faraday_options.merge!(:url => url) follow_redirects_options = @faraday_options.delete(:redirect) || {} session = Faraday.new(@faraday_options) do |faraday| faraday.request :retry, max: @retries faraday.request :gzip if @allow_redirections follow_redirects_options[:limit] ||= 10 faraday.use Faraday::FollowRedirects::Middleware, **follow_redirects_options faraday.use :cookie_jar end if @faraday_http_cache.is_a?(Hash) @faraday_http_cache[:serializer] ||= Marshal faraday.use Faraday::HttpCache, **@faraday_http_cache end faraday.headers.merge!(@headers || {}) faraday.response :encoding faraday.adapter :net_http end response = session.get do |req| req.options.timeout = @connection_timeout req.options.open_timeout = @read_timeout end if @allow_redirections @url.url = response.env.url.to_s end response end rescue Timeout::Error => e raise MetaInspector::TimeoutError.new(e) end