class Feedium::Request

Constants

MAX_CONTENT_SIZE
URI_REQEX

Attributes

io[R]
uri[R]
url[R]

Public Class Methods

new(url, base_uri = nil) click to toggle source
# File lib/feedium/request.rb, line 7
def initialize(url, base_uri = nil)
  url = url.strip
  url = URI.parse(base_uri).merge(url).to_s if base_uri

  begin
    @uri = URI.parse(url)
  rescue URI::InvalidURIError => e
    raise Feedium::RequestError.new(e.message)
  end
end

Public Instance Methods

send() click to toggle source
# File lib/feedium/request.rb, line 18
def send
  @uri.scheme = 'http' unless %w(http https).include?(@uri.scheme)
  query       = @uri.query.nil? ? '' : "?#{@uri.query}"
  @url        = "#{@uri.scheme}://#{@uri.host}#{@uri.path}#{query}"

  raise Feedium::RequestError.new('Not valid url') unless @url =~ URI_REQEX

  begin
    @io = open(url, {
        allow_redirections: :all,
        read_timeout: 10,
        open_timeout: 10,
        content_length_proc: ->(size) {
          raise Feedium::RequestError.new('File Too Large') if size && size > MAX_CONTENT_SIZE
        },
        progress_proc: ->(size) {
          raise Feedium::RequestError.new('File Too Large') if size > MAX_CONTENT_SIZE
        },
        'User-Agent' => 'Feedium',
        'Accept-Encoding' => ''
    })
  rescue Net::ReadTimeout => e
    raise Feedium::RequestError.new(e.message == 'Net::ReadTimeout' ? '598 Network Read Timeout Error' : e.message)
  rescue Net::OpenTimeout => e
    raise Feedium::RequestError.new(e.message)
  rescue OpenURI::HTTPError => e
    raise Feedium::RequestError.new(e.message)
  rescue OpenSSL::SSL::SSLError => e
    raise Feedium::RequestError.new(e.message)
  rescue Errno::ECONNREFUSED => e
    raise Feedium::RequestError.new(e.message)
  rescue SocketError=> e
    raise Feedium::RequestError.new(e.message)
  rescue Errno::ENETUNREACH => e
    raise Feedium::RequestError.new(e.message)
  rescue RuntimeError => e
    raise Feedium::RequestError.new(e.message)
  end
end