class Consul::Client::HTTP
Attributes
logger[RW]
Public Class Methods
new(host:, port:, logger:, rpc_retries_timeout:)
click to toggle source
# File lib/consul/client/http.rb, line 15 def initialize(host:, port:, logger:, rpc_retries_timeout:) @host = host @port = port @logger = logger @rpc_retries_timeout = rpc_retries_timeout end
Public Instance Methods
delete(request_uri)
click to toggle source
# File lib/consul/client/http.rb, line 107 def delete(request_uri) url = base_uri + request_uri logger.debug("DELETE #{url}") uri = URI.parse(url) begin response = http_request(:delete, uri) parse_body(response) rescue NotFoundException nil end end
exists?(request_uri)
click to toggle source
# File lib/consul/client/http.rb, line 36 def exists?(request_uri) url = base_uri + request_uri logger.debug("GET #{url}") uri = URI.parse(url) begin response = http_request(:get, uri) rescue NotFoundException return false end return true end
get(request_uri, recurse: false, raw: false)
click to toggle source
# File lib/consul/client/http.rb, line 22 def get(request_uri, recurse: false, raw: false) url = base_uri + request_uri logger.debug("GET #{url}") uri = URI.parse(url) uri.query ||= "" uri.query += "&recurse" if recurse uri.query += "&raw" if raw response = http_request(:get, uri) raw ? response.body : parse_body(response) end
mkdir(request_uri, recurse: false)
click to toggle source
# File lib/consul/client/http.rb, line 50 def mkdir(request_uri, recurse: false) request_uri = "/#{request_uri}/".gsub(/\/+/,'/') put(request_uri) unless exists?(request_uri) if recurse while File.dirname(request_uri) != "/kv" request_uri = File.dirname(request_uri) put(request_uri) unless exists?(request_uri) end end end
put(request_uri, data = nil)
click to toggle source
# File lib/consul/client/http.rb, line 96 def put(request_uri, data = nil) url = base_uri + request_uri logger.debug("PUT #{url}") uri = URI.parse(url) response = http_request(:put, uri, request_uri.match('^/kv/') ? data : data.to_json) parse_body(response) end
watch(request_uri, index: 0, wait: '60s', recurse: false)
click to toggle source
# File lib/consul/client/http.rb, line 61 def watch(request_uri, index: 0, wait: '60s', recurse: false) url = base_uri + request_uri uri = URI.parse(url) uri.query ||= "" uri.query += "&index=#{index}&wait=#{wait}" uri.query += "&recurse" if recurse wait_timeout = 0 case wait when /^(.+)s$/ wait_timeout = $1.to_i + 5 when /^(.+)m$/ wait_timeout = ($1.to_i * 60) + 5 else raise InavlidArgument end while true do begin logger.debug("GET #{uri}") response = http_request(:get, uri, nil, wait_timeout) unless response['x-consul-index'].to_i == index return { index: response['x-consul-index'].to_i, body: parse_body(response) } end rescue RpcErrorException logger.warn("Got 500 while watching #{uri}") sleep 5 rescue TimeoutException logger.warn("Got timeout while watching #{uri}") end end end
Protected Instance Methods
base_uri()
click to toggle source
# File lib/consul/client/http.rb, line 125 def base_uri "http://#{@host}:#{@port}/v1" end
http_request(method, uri, data = nil, timeout = 60, rpc_retries_timeout = nil)
click to toggle source
# File lib/consul/client/http.rb, line 133 def http_request(method, uri, data = nil, timeout = 60, rpc_retries_timeout = nil) start = Time.now rpc_retries_timeout ||= @rpc_retries_timeout method = { get: Net::HTTP::Get, put: Net::HTTP::Put, delete: Net::HTTP::Delete }.fetch(method) http = Net::HTTP.new(uri.host, uri.port) http.read_timeout = timeout request = method.new(uri.request_uri) request.body = data begin response = http.request(request) if response.code.to_i == 404 raise NotFoundException, "#{response.code} on #{uri}" elsif response.code.to_i >= 500 raise RpcErrorException, "#{response.code} on #{uri}" elsif response.code.to_i >= 400 raise ResponseException, "#{response.code} on #{uri}" end rescue Net::ReadTimeout raise TimeoutException, "timeout on #{uri}" rescue RpcErrorException if Time.now - start > rpc_retries_timeout raise RpcErrorException, "#{response.code} on #{uri} lasted for over #{rpc_retries_timeout} seconds" else sleep 1 retry end end response end
parse_body(response)
click to toggle source
# File lib/consul/client/http.rb, line 129 def parse_body(response) JSON.parse("[#{response.body}]")[0] end