module Kernel

Private Instance Methods

call_microservice(microservice, args = {}) click to toggle source
# File lib/microservice_dsl.rb, line 44
def call_microservice(microservice, args = {})
  request = prepare_microservice_request microservice, args
  response = nil
  MicroserviceDSL::Instrument.instrument('run.microservice_dsl', 'Call microservice', request.url) do
    response = request.run
  end
  [response.body, response.headers['content-type'], response.code]
end
prepare_microservice_request(microservice, args = {}) click to toggle source
# File lib/microservice_dsl.rb, line 11
def prepare_microservice_request(microservice, args = {})
  raise ArgumentError unless microservice

  url = ENV["#{microservice.upcase}_URL"] || "http://#{microservice}.#{ENV['MS_DOMAIN'] || Rails.env}:#{ENV["MS_#{microservice.upcase}_PORT"] || '3000'}"
  url << "/#{args[:path]}" if args[:path]
  body = args[:body].is_a?(String) ? args[:body] : args[:body].to_json if args[:body]
  headers = MicroserviceDSL.default_headers.merge(args[:headers] || {}).merge(MicroserviceDSL.hop_header => MicroserviceDSL.hop_string)
  method = args[:method] || :get
  timeout = ENV['MS_DEFAULT_TIMEOUT'].try(:to_f) || 0
  timeout = 10 if timeout == 0
  req = Typhoeus::Request.new(url, method: method, headers: headers, body: body, params: args[:params], timeout: timeout)

  if method.to_s.casecmp('get').zero?
    req.on_complete do |res|
      if res.code == 200 && etag = res.headers['etag']
        MicroserviceDSL.set_cache(url, etag, res)
      end
    end
    if cached = MicroserviceDSL.get_cache(url, req)
      req.options[:headers]['If-None-Match'] = cached[:etag]
      req.on_complete do |res|
        if res.code == 304
          res.options[:response_body] = cached[:response][:body]
          res.options[:response_code] = cached[:response][:code]
          res.options[:headers] = Typhoeus::Response::Header.new(cached[:response][:headers])
        end
      end
    end

  end
  req
end