require 'net/http'
require 'uri'
require 'openssl'

begin
  target = URI(ENV.fetch('QG_TARGET_URL'))
  proxy = URI(ENV.fetch('QUOTAGUARDSTATIC_URL'))
  # Net::HTTP proxy arguments below implement Static's plaintext proxy hop.
  raise 'config' unless target.scheme == 'https' && target.host && !target.userinfo
  raise 'config' unless proxy.scheme == 'http' && proxy.host && proxy.user && proxy.password
  token = ENV.fetch('DESTINATION_API_TOKEN', '')
  raise 'config' if token.match?(/[\r\n]/) || (!token.empty? && target.host == 'ip.quotaguard.com')
  http = Net::HTTP.new(target.host, target.port, proxy.host, proxy.port,
    URI::DEFAULT_PARSER.unescape(proxy.user), URI::DEFAULT_PARSER.unescape(proxy.password))
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  http.open_timeout = 10
  http.read_timeout = 30
  http.max_retries = 0
  request = Net::HTTP::Get.new(target.request_uri)
  request['Authorization'] = "Bearer #{token}" unless token.empty?
  response = http.request(request)
  raise 'status' unless response.code.to_i.between?(200, 299)
  puts 'PASS: destination returned a successful HTTP status'
rescue StandardError
  warn 'Request failed; check configuration and the guide.'
  exit 1
end
