class Ecobee::HTTP

Public Class Methods

new(log_file: nil, token: nil) click to toggle source
# File lib/ecobee/http.rb, line 7
def initialize(log_file: nil, token: nil)
  raise ArgumentError.new('Missing token') unless token
  @token = token
  open_log log_file
  http
end

Public Instance Methods

get( arg: nil, no_auth: false, resource_prefix: '1/', retries: 3, options: nil, validate_status: true ) click to toggle source
# File lib/ecobee/http.rb, line 14
def get(
  arg: nil,
  no_auth: false,
  resource_prefix: '1/',
  retries: 3,
  options: nil,
  validate_status: true
)
  uri = URI.escape(sprintf("#{Ecobee::API_URI_BASE}/%s%s%s",
                           resource_prefix,
                           arg.to_s.sub(/^\//, ''),
                           options ? "?json=#{options.to_json}" : ''))
  log "http.get uri=#{uri}"
  request = Net::HTTP::Get.new(URI(uri))
  request['Content-Type'] = *CONTENT_TYPE
  request['Authorization'] = @token.authorization unless no_auth
  response = nil
  retries.times do
    http_response = http.request request
    response = JSON.parse(http_response.body)
    log "http.get response=#{response.pretty_inspect}"
    response = validate_status(response) if validate_status
    break unless response == :retry
    sleep 3
  end
  case response
  when :retry
    raise Ecobee::HTTPError.new('HTTP.get: retries exhausted')
  else
    response
  end
rescue SocketError => msg
  raise Ecobee::HTTPError.new("HTTP.get SocketError => #{msg}")
rescue JSON::ParserError => msg
  raise Ecobee::HTTPError.new("HTTP.get JSON::ParserError => #{msg}")
end
log(arg) click to toggle source
# File lib/ecobee/http.rb, line 51
def log(arg)
  return unless @log_fh
  if arg.length > MAX_LOG_LENGTH
    arg = arg.slice(0, MAX_LOG_LENGTH).chomp + "\n ...truncated..."
  end
  @log_fh.puts "#{Time.now} #{arg.chomp}"
  @log_fh.flush
end
post( arg: nil, body: nil, no_auth: false, resource_prefix: '1/', retries: 3, options: {}, validate_status: true ) click to toggle source
# File lib/ecobee/http.rb, line 60
def post(
  arg: nil,
  body: nil,
  no_auth: false,
  resource_prefix: '1/',
  retries: 3,
  options: {},
  validate_status: true
)
  uri = URI.escape(sprintf("#{Ecobee::API_URI_BASE}/%s%s%s",
                           resource_prefix,
                           arg.to_s.sub(/^\//, ''),
                           options.length > 0 ? "?json=#{options.to_json}" : ''))
  log "http.post uri=#{uri}"
  request = Net::HTTP::Post.new(URI(uri))
  request['Content-Type'] = *CONTENT_TYPE
  request['Authorization'] = @token.authorization unless no_auth
  if body
    log "http.post body=#{body.pretty_inspect}"
    request.body = JSON.generate(body)
  elsif options.length > 0
    request.set_form_data({ 'format' => 'json' }.merge(options))
  end
  response = nil
  retries.times do
    http_response = http.request request
    response = JSON.parse(http_response.body)
    log "http.post response=#{response.pretty_inspect}"
    response = validate_status(response) if validate_status
    break unless response == :retry
    sleep 3
  end
  case response
  when :retry
    raise Ecobee::HTTPError.new('HTTP.get: retries exhausted')
  else
    response
  end
rescue SocketError => msg
  raise Ecobee::HTTPError.new("HTTP.get SocketError => #{msg}")
rescue JSON::ParserError => msg
  raise Ecobee::HTTPError.new("HTTP.get JSON::ParserError => #{msg}")
end

Private Instance Methods

http() click to toggle source
# File lib/ecobee/http.rb, line 106
def http
  @http ||= Net::HTTP.new(API_HOST, API_PORT)
  unless @http.active?
    @http.use_ssl = true
    Net::HTTP.start(API_HOST, API_PORT)
  end
  @http
rescue SocketError => msg
  raise Ecobee::HTTPError.new("HTTP.http SocketError => #{msg}")
end
open_log(log_file) click to toggle source
# File lib/ecobee/http.rb, line 117
def open_log(log_file)
  return unless log_file
  log_file = File.expand_path log_file
  @log_fh = File.new(log_file, 'a')
rescue Exception => msg 
  raise Ecobee::HTTPError.new("open_log: #{msg}")
end
validate_status(response) click to toggle source
# File lib/ecobee/http.rb, line 125
def validate_status(response)
  if !response.key? 'status'
    raise Ecobee::HTTPError.new('Validate Error: Missing Status')
  elsif !response['status'].key? 'code'
    raise Ecobee::HTTPError.new('Validate Error: Missing Status Code')
  elsif response['status']['code'] == 14
    log "validate_status: token expired access_token_expire: #{@token.access_token_expire}"
    log "validate_status:                               now: #{Time.now.to_i}"
    :retry
  elsif response['status']['code'] != 0
    raise Ecobee::HTTPError.new(
      "Validate Error: (Code #{response['status']['code']}) " +
      "#{response['status']['message']}"
    )
  else
    response
  end
end