module Stackd::Util::HTTP

Public Class Methods

delete(credentials, url) click to toggle source
# File lib/stackd/util/http.rb, line 25
def self.delete credentials, url
  request_without_body :delete, credentials, url
end
get(credentials, url) click to toggle source
# File lib/stackd/util/http.rb, line 9
def self.get credentials, url
  request_without_body :get, credentials, url
end
patch(credentials, url, body, content_type) click to toggle source
# File lib/stackd/util/http.rb, line 21
def self.patch credentials, url, body, content_type
  request_with_body :patch, credentials, url, body, content_type
end
post(credentials, url, body, content_type) click to toggle source
# File lib/stackd/util/http.rb, line 13
def self.post credentials, url, body, content_type
  request_with_body :post, credentials, url, body, content_type
end
put(credentials, url, body, content_type) click to toggle source
# File lib/stackd/util/http.rb, line 17
def self.put credentials, url, body, content_type
  request_with_body :put, credentials, url, body, content_type
end

Private Class Methods

basic_auth_for(credentials) click to toggle source
# File lib/stackd/util/http.rb, line 89
def self.basic_auth_for credentials
  if credentials.is_a? Hash
    credentials
  elsif credentials.is_a? Client
    { user: credentials.id, password: credentials.secret }
  end
end
creds_are_valid?(credentials) click to toggle source
# File lib/stackd/util/http.rb, line 80
def self.creds_are_valid? credentials
  credentials.nil? || \
  credentials.is_a?(Client) || \
  credentials.is_a?(Token) || \
  (credentials.is_a?(Hash) && \
   credentials[:user].is_a?(String) && \
   credentials[:password].is_a?(String))
end
headers_for(credentials, content_type = nil) click to toggle source
# File lib/stackd/util/http.rb, line 97
def self.headers_for credentials, content_type = nil
  headers = {}

  if credentials.is_a? Token
    headers.merge!(
      { 'Authorization' => "Bearer #{credentials.access_token}" })
  end

  unless content_type.nil?
    content_type_value = content_type == :json \
      ? 'application/json' \
      : 'application/x-www-form-urlencoded'

    headers.merge!({ 'Content-Type' => content_type_value })
  end

  headers
end
parameters_for(body, content_type) click to toggle source
# File lib/stackd/util/http.rb, line 116
def self.parameters_for body, content_type
  if content_type == :json
    JSON.generate body
  else
    body
  end
end
process_response(res) click to toggle source
# File lib/stackd/util/http.rb, line 124
def self.process_response res
  if res.code >= 500
    raise ServerError.new res.body.deep_symbolize_keys
  elsif res.code >= 400
    raise Error.new res.body.deep_symbolize_keys
  else
    res.body.deep_symbolize_keys
  end
end
request_with_body(method, credentials, url, body, content_type) click to toggle source
# File lib/stackd/util/http.rb, line 43
def self.request_with_body method, credentials, url, body, content_type
  validate_params! credentials, url, body, content_type

  basic_auth = basic_auth_for credentials
  headers = headers_for credentials, content_type
  parameters = parameters_for body, content_type

  res = Unirest.public_send method, url, headers: headers,
                                         auth: basic_auth,
                                         parameters: parameters

  process_response res
end
request_without_body(method, credentials, url) click to toggle source
# File lib/stackd/util/http.rb, line 31
def self.request_without_body method, credentials, url
  validate_params! credentials, url

  basic_auth = basic_auth_for credentials
  headers = headers_for credentials

  res = Unirest.public_send method, url, headers: headers,
                                         auth: basic_auth

  process_response res
end
validate_params!(credentials, url, body = nil, content_type = nil) click to toggle source
# File lib/stackd/util/http.rb, line 57
def self.validate_params! credentials, url, body = nil, content_type = nil
  unless creds_are_valid? credentials
    raise ArgumentError.new \
      "credentials must be a Stackd::Token, Hash with :user + " + \
        ":password, credentials: #{credentials.inspect}"
  end

  unless url.is_a? String
    raise ArgumentError.new "url must be String. url: #{url.inspect}"
  end

  unless body.nil? || body.is_a?(Hash)
    raise ArgumentError.new \
      "body must be a Hash or nil. body: #{body.inspect}"
  end

  unless content_type.nil? || [:json, :form].include?(content_type)
    raise ArgumentError.new \
      "content_type must be :json, :form, or nil. " + \
        "content_type: #{content_type.inspect}"
  end
end