class MMS::Client

Attributes

apikey[RW]
url[RW]
username[RW]

Public Class Methods

new(username = nil, apikey = nil, url = nil) click to toggle source

@param [String] username @param [String] apikey @param [String] url

# File lib/mms/client.rb, line 10
def initialize(username = nil, apikey = nil, url = nil)
  @username = username
  @apikey = apikey
  @url = url.nil? ? 'https://mms.mongodb.com:443/api/public/v1.0' : url
end

Public Instance Methods

delete(path) click to toggle source

@param [String] path @return [Hash]

# File lib/mms/client.rb, line 31
def delete(path)
  _request(Net::HTTP::Delete, @url + path, @username, @apikey, nil)
end
get(path) click to toggle source

@param [String] path @return [Hash]

# File lib/mms/client.rb, line 18
def get(path)
  _request(Net::HTTP::Get, @url + path, @username, @apikey, nil)
end
patch(path, data) click to toggle source

@param [String] path @param [Hash] data @return [Hash]

# File lib/mms/client.rb, line 38
def patch(path, data)
  _request(Net::HTTP::Patch, @url + path, @username, @apikey, data)
end
post(path, data) click to toggle source

@param [String] path @param [Hash] data @return [Hash]

# File lib/mms/client.rb, line 25
def post(path, data)
  _request(Net::HTTP::Post, @url + path, @username, @apikey, data)
end
put(path, data) click to toggle source

@param [String] path @param [Hash] data @return [Hash]

# File lib/mms/client.rb, line 45
def put(path, data)
  _request(Net::HTTP::Put, @url + path, @username, @apikey, data)
end

Private Instance Methods

_request(http_method, path, username, password, data = nil) click to toggle source

@param [Net::HTTPRequest] http_method @param [String] path @param [String] username @param [String] password @param [Hash] data @return [Hash]

# File lib/mms/client.rb, line 57
def _request(http_method, path, username, password, data = nil)
  digest_auth = Net::HTTP::DigestAuth.new
  digest_auth.next_nonce

  uri = URI.parse path
  uri.user = CGI.escape(username)
  uri.password = CGI.escape(password)

  http = Net::HTTP.new uri.host, uri.port
  http.use_ssl = (uri.scheme == 'https')

  req = http_method.new(uri.request_uri, 'Content-Type' => 'application/json')
  res = http.request req

  raise 'Invalid method' unless http_method.is_a?(Class) && http_method < Net::HTTPRequest
  req = http_method.new(uri.request_uri, 'Content-Type' => 'application/json')
  method_name = http_method.name.split('::').last.upcase
  auth = digest_auth.auth_header(uri, res['WWW-Authenticate'], method_name)
  req.add_field 'Authorization', auth
  req.body = data.to_json

  response = http.request req
  response_json = JSON.parse response.body

  unless response.code == 200 || response_json['error'].nil?
    msg = "http 'get' error for url `#{url}`"
    msg = response_json['detail'] unless response_json['detail'].nil?

    raise MMS::AuthError.new(msg, req, response) if response.code == '401'
    raise MMS::ApiError.new(msg, req, response)
  end

  response_json.nil? || response_json['results'].nil? ? response_json : response_json['results']
end