class VirusTotal::Client::Base

Constants

BASE_URL
CONVERT_TABLE
HOST
VERSION

Attributes

key[R]

Public Class Methods

new(key: ENV["VIRUSTOTAL_API_KEY"]) click to toggle source
# File lib/virustotal/clients/base.rb, line 25
def initialize(key: ENV["VIRUSTOTAL_API_KEY"])
  @key = key
  raise ArgumentError, "No key has been found or provided!" unless key?
end

Private Instance Methods

_delete(path, params = {}, &block) click to toggle source
# File lib/virustotal/clients/base.rb, line 131
def _delete(path, params = {}, &block)
  delete = Net::HTTP::Delete.new(url_for(path))
  delete.body = JSON.generate(params) if params

  request(delete, &block)
end
_get(path, params = {}, &block) click to toggle source
# File lib/virustotal/clients/base.rb, line 98
def _get(path, params = {}, &block)
  uri = url_for(path)
  uri.query = URI.encode_www_form(params)
  get = Net::HTTP::Get.new(uri)

  request(get, &block)
end
_patch(path, params = {}, &block) click to toggle source
# File lib/virustotal/clients/base.rb, line 124
def _patch(path, params = {}, &block)
  patch = Net::HTTP::Patch.new(url_for(path))
  patch.body = JSON.generate(params) if params

  request(patch, &block)
end
_post(path, params = {}, &block) click to toggle source
# File lib/virustotal/clients/base.rb, line 106
def _post(path, params = {}, &block)
  post = Net::HTTP::Post.new(url_for(path))
  post.body = JSON.generate(params)

  request(post, &block)
end
_post_with_file(path, file:, filename:, &block) click to toggle source
# File lib/virustotal/clients/base.rb, line 113
def _post_with_file(path, file:, filename:, &block)
  post = Net::HTTP::Post.new(url_for(path))

  data = [
    ["file", file, { "filename": filename }],
  ]
  post.set_form(data, "multipart/form-data")

  request(post, &block)
end
https_options() click to toggle source
# File lib/virustotal/clients/base.rb, line 40
def https_options
  if proxy = ENV["HTTPS_PROXY"] || ENV["https_proxy"]
    uri = URI(proxy)
    {
      proxy_address: uri.hostname,
      proxy_port: uri.port,
      proxy_from_env: false,
      use_ssl: true
    }
  else
    { use_ssl: true }
  end
end
key?() click to toggle source
# File lib/virustotal/clients/base.rb, line 32
def key?
  !key.nil?
end
klass() click to toggle source
# File lib/virustotal/clients/base.rb, line 142
def klass
  self.class.to_s.split("::").last.to_s.downcase.to_sym
end
name() click to toggle source
# File lib/virustotal/clients/base.rb, line 146
def name
  CONVERT_TABLE.fetch klass
end
raise_error(code, message) click to toggle source
# File lib/virustotal/clients/base.rb, line 54
def raise_error(code, message)
  code = code.to_s.to_sym

  table = {
    "400": BadRequestError,
    "401": AuthenticationRequiredError,
    "403": ForbiddenError,
    "404": NotFoundError,
    "409": AlreadyExistsError,
    "429": QuotaExceededError,
    "503": TransientError,
  }
  raise Error, "Unsupported response code returned: #{code} - #{message}" unless table.key?(code)

  klass = table[code]
  raise klass, message
end
request(req) { |json| ... } click to toggle source
# File lib/virustotal/clients/base.rb, line 72
def request(req)
  Net::HTTP.start(HOST, 443, https_options) do |http|
    req["x-apikey"] = key

    response = http.request(req)

    code = response.code.to_i
    body = response.body
    json = JSON.parse(body) if response["Content-Type"].to_s.include?("application/json")
    message = json ? json.dig("message") : body

    case code
    when 200
      if json
        yield json
      else
        yield body
      end
    when 302
      yield response["Location"]
    else
      raise_error code, message
    end
  end
end
to_id(id) click to toggle source
# File lib/virustotal/clients/base.rb, line 138
def to_id(id)
  id
end
url_for(path) click to toggle source
# File lib/virustotal/clients/base.rb, line 36
def url_for(path)
  URI(BASE_URL + path)
end