class MetaInspector::Request

Makes the request to the server

Public Class Methods

new(initial_url, options = {}) click to toggle 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

content_type() click to toggle 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
read() click to toggle 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
response() click to toggle 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

fatal_timeout() click to toggle source

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

# File lib/meta_inspector/request.rb, line 106
def fatal_timeout
  (@connection_timeout || 0) + (@read_timeout || 0) + 1
end
fetch() click to toggle 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