class BingTranslator::ApiClient

Constants

API_HOST
COGNITIVE_ACCESS_TOKEN_URI

Public Class Methods

new(subscription_key, skip_ssl_verify, read_timeout = 60, open_timeout = 60) click to toggle source
# File lib/bing_translator.rb, line 22
def initialize(subscription_key, skip_ssl_verify, read_timeout = 60, open_timeout = 60)
  @subscription_key = subscription_key
  @skip_ssl_verify = skip_ssl_verify
  @read_timeout = read_timeout
  @open_timeout = open_timeout
end

Public Instance Methods

get(path, params: {}, headers: {}, authorization: false) click to toggle source
# File lib/bing_translator.rb, line 29
def get(path, params: {}, headers: {}, authorization: false)
  uri = request_uri(path, params)
  request = Net::HTTP::Get.new(uri.request_uri, default_headers(authorization).merge(headers))

  json_response(uri, request)
end
post(path, params: {}, headers: {}, data: {}, authorization: true) click to toggle source
# File lib/bing_translator.rb, line 36
def post(path, params: {}, headers: {}, data: {}, authorization: true)
  uri = request_uri(path, params)

  request = Net::HTTP::Post.new(uri.request_uri, default_headers(authorization).merge(headers))
  request.body = data

  json_response(uri, request)
end

Private Instance Methods

access_token() click to toggle source
# File lib/bing_translator.rb, line 78
def access_token
  if @access_token.nil? || Time.now >= @access_token_expiration_time
    @access_token = request_new_access_token
  end
  @access_token
end
default_headers(authorization = true) click to toggle source
# File lib/bing_translator.rb, line 47
def default_headers(authorization = true)
  headers = { 'Content-Type' => 'application/json' }
  headers['Authorization'] = "Bearer #{access_token}" if authorization
  headers
end
http_client(uri) click to toggle source
# File lib/bing_translator.rb, line 62
def http_client(uri)
  http = Net::HTTP.new(uri.host, 443)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE if @skip_ssl_verify
  http.read_timeout = @read_timeout
  http.open_timeout = @open_timeout
  http
end
json_response(uri, request) click to toggle source
# File lib/bing_translator.rb, line 53
def json_response(uri, request)
  http = http_client(uri)

  response = http.request(request)

  raise ApiException.new("Unsuccessful API call: Code: #{response.code}") unless response.code == '200'
  JSON.parse(response.body)
end
request_new_access_token() click to toggle source
# File lib/bing_translator.rb, line 85
def request_new_access_token
  headers = {
    'Ocp-Apim-Subscription-Key' => @subscription_key
  }

  http = Net::HTTP.new(COGNITIVE_ACCESS_TOKEN_URI.host, COGNITIVE_ACCESS_TOKEN_URI.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE if @skip_ssl_verify

  response = http.post(COGNITIVE_ACCESS_TOKEN_URI.path, '', headers)
  case response
  when Net::HTTPSuccess
    @access_token_expiration_time = Time.now + 480
    response.body
  when Net::HTTPServerError
    raise UnavailableException.new("#{response.code}: Credentials server unavailable")
  else
    raise AuthenticationException.new("Unsuccessful Access Token call: Code: #{response.code} (Invalid credentials?)")
  end
end
request_uri(path, params) click to toggle source
# File lib/bing_translator.rb, line 71
def request_uri(path, params)
  encoded_params = URI.encode_www_form(params.merge('api-version' => '3.0'))
  uri = URI.parse("#{API_HOST}#{path}")
  uri.query = encoded_params
  uri
end