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