class Wovnrb::ApiTranslator

Public Class Methods

new(store, headers) click to toggle source
# File lib/wovnrb/api_translator.rb, line 8
def initialize(store, headers)
  @store = store
  @headers = headers
end

Public Instance Methods

translate(body) click to toggle source
# File lib/wovnrb/api_translator.rb, line 13
def translate(body)
  connection = prepare_connection
  request = prepare_request(body)

  begin
    response = connection.request(request)
  rescue => e
    WovnLogger.error("\"#{e.message}\" error occurred when contacting WOVNio translation API")
    return body
  end

  case response
  when Net::HTTPSuccess
    if response.header['Content-Encoding'] == 'gzip'
      response_body = Zlib::GzipReader.new(StringIO.new(response.body)).read

      JSON.parse(response_body)['body'] || body
    elsif @store.dev_mode?
      JSON.parse(response.body)['body'] || body
    else
      WovnLogger.error("Received invalid content (\"#{response.header['Content-Encoding']}\") from WOVNio translation API.")
      body
    end
  else
    WovnLogger.error("Received \"#{response.message}\" from WOVNio translation API.")
    body
  end
end

Private Instance Methods

api_timeout() click to toggle source
# File lib/wovnrb/api_translator.rb, line 115
def api_timeout
  @store.settings['api_timeout_seconds']
end
api_uri() click to toggle source
# File lib/wovnrb/api_translator.rb, line 111
def api_uri
  Addressable::URI.parse("#{@store.settings['api_url']}/v0/")
end
compress_request_data(data_hash) click to toggle source
# File lib/wovnrb/api_translator.rb, line 101
def compress_request_data(data_hash)
  encoded_data_components = data_hash.map do |key, value|
    "#{key}=#{CGI.escape(value)}"
  end

  gzip = Zlib::GzipWriter.new(StringIO.new)
  gzip << encoded_data_components.join('&')
  gzip.close.string
end
custom_lang_aliases() click to toggle source
# File lib/wovnrb/api_translator.rb, line 139
def custom_lang_aliases
  @store.settings['custom_lang_aliases']
end
generate_cache_key(body) click to toggle source
# File lib/wovnrb/api_translator.rb, line 71
def generate_cache_key(body)
  cache_key_components = {
    'token' => token,
    'settings_hash' => settings_hash,
    'body_hash' => Digest::MD5.hexdigest(body),
    'path' => page_pathname,
    'lang' => lang_code,
    'version' => "wovnrb_#{VERSION}"
  }.map { |k, v| "#{k}=#{v}" }.join('&')

  CGI.escape("(#{cache_key_components})")
end
generate_request_data(body) click to toggle source
# File lib/wovnrb/api_translator.rb, line 84
def generate_request_data(body)
  data = {
    'url' => page_url,
    'token' => token,
    'lang_code' => lang_code,
    'url_pattern' => url_pattern,
    'lang_param_name' => lang_param_name,
    'product' => 'WOVN.rb',
    'version' => VERSION,
    'body' => body
  }

  data['custom_lang_aliases'] = JSON.dump(custom_lang_aliases) unless custom_lang_aliases.empty?

  data
end
generate_request_path(body) click to toggle source
# File lib/wovnrb/api_translator.rb, line 67
def generate_request_path(body)
  "#{api_uri.path.sub(/\/$/, '')}/translation?cache_key=#{generate_cache_key(body)}"
end
lang_code() click to toggle source
# File lib/wovnrb/api_translator.rb, line 127
def lang_code
  @headers.lang_code
end
lang_param_name() click to toggle source
# File lib/wovnrb/api_translator.rb, line 135
def lang_param_name
  @store.settings['lang_param_name']
end
page_pathname() click to toggle source
# File lib/wovnrb/api_translator.rb, line 147
def page_pathname
  @headers.pathname_with_trailing_slash_if_present
end
page_url() click to toggle source
# File lib/wovnrb/api_translator.rb, line 143
def page_url
  "#{@headers.protocol}://#{@headers.url}"
end
prepare_connection() click to toggle source
# File lib/wovnrb/api_translator.rb, line 44
def prepare_connection
  connection = Net::HTTP.new(api_uri.host, api_uri.port)

  connection.open_timeout = api_timeout
  connection.read_timeout = api_timeout

  connection
end
prepare_request(body) click to toggle source
# File lib/wovnrb/api_translator.rb, line 53
def prepare_request(body)
  data = compress_request_data(generate_request_data(body))
  headers = {
    'Accept-Encoding' => 'gzip',
    'Content-Type' => 'application/octet-stream',
    'Content-Length' => data.bytesize.to_s
  }
  request = Net::HTTP::Post.new(generate_request_path(body), headers)

  request.body = data

  request
end
settings_hash() click to toggle source
# File lib/wovnrb/api_translator.rb, line 119
def settings_hash
  Digest::MD5.hexdigest(JSON.dump(@store.settings))
end
token() click to toggle source
# File lib/wovnrb/api_translator.rb, line 123
def token
  @store.settings['project_token']
end
url_pattern() click to toggle source
# File lib/wovnrb/api_translator.rb, line 131
def url_pattern
  @store.settings['url_pattern']
end