module Gemini::AuthenticatedConnection

Private Instance Methods

authenticated_post(url, options = {}) click to toggle source
# File lib/gemini/authenticated_rest.rb, line 5
def authenticated_post(url, options = {})
  raise Gemini::InvalidAuthKeyError unless valid_key?
  complete_url = build_url(url)
  body = options[:params] || {}
  nonce = new_nonce

  payload = if config.api_version == 1
    build_payload("/v1/#{url}", options[:params], nonce)
  else
    "/api#{complete_url}#{nonce}#{body.to_json}"
  end

  response = rest_connection.post do |req|
    req.url complete_url
    req.body = body.to_json
    req.options.timeout = config.rest_timeout
    req.options.open_timeout = config.rest_open_timeout
    req.headers['Content-Type'] = 'application/json'
    req.headers['Accept'] = 'application/json'

    if config.api_version == 1
      req.headers['X-GEMINI-PAYLOAD'] = payload
      req.headers['X-GEMINI-SIGNATURE'] = sign(payload)
      req.headers['X-GEMINI-APIKEY'] = config.api_key
    else
      # TODO: Verify if this applies to Gemini.
      req.headers['gemini-nonce'] = nonce
      req.headers['gemini-signature'] = sign(payload)
      req.headers['gemini-apikey'] = config.api_key
    end
  end
end
build_payload(url, params = {}, nonce) click to toggle source
# File lib/gemini/authenticated_rest.rb, line 38
def build_payload(url, params = {}, nonce)
  payload = {}
  payload['nonce'] = nonce
  payload['request'] = url
  payload.merge!(params) if params
  Base64.strict_encode64(payload.to_json)
end
new_nonce() click to toggle source
# File lib/gemini/authenticated_rest.rb, line 46
def new_nonce
  (Time.now.to_f * 10_000).to_i.to_s
end
sign(payload) click to toggle source
# File lib/gemini/authenticated_rest.rb, line 50
def sign(payload)
  OpenSSL::HMAC.hexdigest('sha384', config.secret, payload)
end
valid_key?() click to toggle source
# File lib/gemini/authenticated_rest.rb, line 54
def valid_key?
  !! (config.api_key && config.secret)
end