module Zzlink::Client

The HTTP client.

Attributes

access_key[RW]
api_url[RW]
secret_key[RW]

Public Instance Methods

delete(path, query_params = {}) click to toggle source
# File lib/zzlink/client.rb, line 59
def delete(path, query_params = {})
  uri = uri_of(path, query_params)
  resp = Net::HTTP.start(uri.host, uri.port, nil, nil, nil, nil, use_ssl: (uri.scheme == 'https')) do |http|
    req = Net::HTTP::Delete.new(uri.request_uri)
    set_request_headers(req)
    http.request(req)
  end
  check_and_return(resp)
end
get(path, query_params = {}) click to toggle source

Do a GET request.

# File lib/zzlink/client.rb, line 21
def get(path, query_params = {})
  uri = uri_of(path, query_params)
  resp = Net::HTTP.start(uri.host, uri.port, nil, nil, nil, nil, use_ssl: (uri.scheme == 'https')) do |http|
    req = Net::HTTP::Get.new(uri.request_uri)
    set_request_headers(req)
    http.request(req)
  end
  check_and_return(resp)
end
post(path, data = {}) click to toggle source
# File lib/zzlink/client.rb, line 31
def post(path, data = {})
  uri = uri_of(path)
  resp = Net::HTTP.start(uri.host, uri.port, nil, nil, nil, nil, use_ssl: (uri.scheme == 'https')) do |http|
    req = Net::HTTP::Post.new(uri.request_uri)
    set_request_headers(req)
    unless data.empty?
      req['Content-Type'] = 'application/json'
      req.body = data.to_json
    end
    http.request(req)
  end
  check_and_return(resp)
end
put(path, data = {}) click to toggle source
# File lib/zzlink/client.rb, line 45
def put(path, data = {})
  uri = uri_of(path)
  resp = Net::HTTP.start(uri.host, uri.port, nil, nil, nil, nil, use_ssl: (uri.scheme == 'https')) do |http|
    req = Net::HTTP::Put.new(uri.request_uri)
    set_request_headers(req)
    unless data.empty?
      req['Content-Type'] = 'application/json'
      req.body = data.to_json
    end
    http.request(req)
  end
  check_and_return(resp)
end

Private Instance Methods

check_and_return(response) click to toggle source
# File lib/zzlink/client.rb, line 98
def check_and_return(response)
  if response.is_a?(Net::HTTPSuccess)
    response.body
  else
    raise Error.new(response.code, response.body)
  end
end
set_request_headers(request) click to toggle source

Set headers for the HTTP request. @param request [HttpRequest] the request object.

# File lib/zzlink/client.rb, line 87
def set_request_headers(request)
  host = self.name + '.' + self.version
  date = Time.now().gmtime.strftime('%a, %d %b %Y %H:%M:%S %Z')
  signing_string = "host: #{host}\n#{request.method} #{request.path} HTTP/1.1\ndate: #{date}"
  signature = Base64.strict_encode64(OpenSSL::HMAC.digest("SHA256", Client.secret_key, signing_string))
  request['Accept'] = 'application/json'
  request['Host'] = host
  request['Date'] = date
  request['Authorization'] = "hmac username=\"#{Client.access_key}\", algorithm=\"hmac-sha256\", headers=\"host request-line date\", signature=\"#{signature}\""
end
uri_of(path, query_params = {}) click to toggle source

Make URI object from request path and query parameters. @param path [String] request path (without scheme, host and port). @param query_params [Hash] optional query parameters. @return the URI object.

# File lib/zzlink/client.rb, line 75
def uri_of(path, query_params = {})
  url = Client.api_url + path
  if query_params.empty?
    URI(url)
  else
    queries = URI.encode_www_form(query_params)
    url.include?('?') ? URI(url + '&' + queries) : URI(url + '?' + queries)
  end
end