class BSClient::App

Attributes

config[RW]
options[RW]

Public Class Methods

new(options, config) click to toggle source
# File lib/bsclient/app.rb, line 10
def initialize(options, config)
  @options = options
  @config = config
end

Public Instance Methods

build_query_params(params = {}) click to toggle source
# File lib/bsclient/app.rb, line 52
def build_query_params(params = {})
  params.merge(developerId: @config.developer_id,
               rtick: rtick,
               signType: 'rsa')
end
build_to_signed(url, params, body_digest) click to toggle source
# File lib/bsclient/app.rb, line 58
def build_to_signed(url, params, body_digest)
  params = params.sort.map { |kv| kv.join('=') }.join
  path = URI.parse(url).path
  "#{params}#{path}#{body_digest}"
end
create_user_image(request) click to toggle source
# File lib/bsclient/app.rb, line 35
def create_user_image(request)
  post_json(@config.create_user_image_url, request)
end
digest_body(body) click to toggle source
# File lib/bsclient/app.rb, line 74
def digest_body(body)
  Digest::MD5.hexdigest(body)
end
download_user_image(params) click to toggle source
# File lib/bsclient/app.rb, line 39
def download_user_image(params)
  get(@config.download_user_image_url, params)
end
format_response(resp) click to toggle source
# File lib/bsclient/app.rb, line 110
    def format_response(resp)
      unless options[:verbose]
        return resp.body
      end
      request_body = if resp.env.request_body.nil?
                       <<-EOF
                         +-------------------------------------------------+
                         |               No Request Body                   |
                         +-------------------------------------------------+
                       EOF
                     elsif resp.env.request_headers['content-type'] =~ /multipart/
                       <<-EOF
                         +-------------------------------------------------+
                         |                   Binary Data                   |
                         +-------------------------------------------------+
                       EOF
                     elsif resp.env.request_headers['content-type'] =~ /json/
                       json = JSON.pretty_generate(JSON.parse(resp.env.request_body))
                       json.gsub(/^/, '  ')
                     else
                       resp.env.request_body
                     end
      response_body = if resp.env.response_headers['content-type'] =~ /json/
                       json = JSON.pretty_generate(JSON.parse(resp.env.response_body))
                       json.gsub(/^/, '  ')
                     elsif resp.env.response_headers['content-type'] =~ /text/
                       resp.env.response_body
                     else
                       <<-EOF
                         +-------------------------------------------------+
                         |                   Binary Data                   |
                         +-------------------------------------------------+
                       EOF
                    end
      <<~EOF

        Request Method: #{resp.env.method.to_s.upcase}
        ----------------------

        URL: #{resp.env.url}
        ----------------------

        Request Headers:
        ----------------

        #{resp.env.request_headers.map { |k, v| "  #{k}: #{v}" }.join("\n")}

        Request Body:
        -------------
        #{request_body}

        ============================================

        Response Status: #{resp.status} #{resp.reason_phrase}
        ----------------------

        Response Headers:
        ----------------
        #{resp.env.response_headers.map { |k, v| "  #{k}: #{v}" }.join("\n")}

        Response Body:
        ----------------
        #{response_body}
      EOF
    end
get(url, params) click to toggle source
# File lib/bsclient/app.rb, line 90
def get(url, params)
  params = build_query_params(params)
  params.merge!(sign: sign(url, params))
  resp = Faraday.get(url) do |req|
    req.params = params
  end
  format_response(resp)
end
post_json(url, request) click to toggle source
# File lib/bsclient/app.rb, line 99
def post_json(url, request)
  params = build_query_params
  params.merge!(sign: sign(url, params, request))
  resp = Faraday.post(url) do |req|
    req.headers[:content_type] = 'application/json; charset=UTF-8'
    req.params = params
    req.body = request
  end
  format_response(resp)
end
print_response(resp) click to toggle source
query_registration(task_id, account) click to toggle source
# File lib/bsclient/app.rb, line 19
def query_registration(task_id, account)
  url = @config.query_url
  request = {
    taskId: task_id,
    account: account
  }.to_json
  params = build_query_params
  params.merge!(sign: sign(url, params, request))
  resp = Faraday.post(url) do |req|
    req.headers[:content_type] = 'application/json; charset=UTF-8'
    req.params = params
    req.body = request
  end
  format_response(resp)
end
read_private_key() click to toggle source
# File lib/bsclient/app.rb, line 68
def read_private_key
  raw_key = File.read(File.expand_path(@config.private_key)).chomp
  key = "-----BEGIN RSA PRIVATE KEY-----\n#{raw_key}\n-----END RSA PRIVATE KEY-----\n"
  OpenSSL::PKey::RSA.new(key)
end
register_account(request) click to toggle source
# File lib/bsclient/app.rb, line 15
def register_account(request)
  post_json(@config.register_url, request)
end
rsa_sign(content) click to toggle source
# File lib/bsclient/app.rb, line 64
def rsa_sign(content)
  Base64.strict_encode64(read_private_key.sign(OpenSSL::Digest::SHA1.new, content))
end
rtick() click to toggle source
# File lib/bsclient/app.rb, line 78
def rtick
  "#{(Time.now.to_f * 10000).to_i}"
end
sign(url, params, body = nil) click to toggle source
# File lib/bsclient/app.rb, line 43
def sign(url, params, body = nil)
  body_digest = if body
                  digest_body(body)
                else
                  ''
                end
  rsa_sign(build_to_signed(url, params, body_digest))
end