class Acme::Client::FaradayMiddleware

Constants

CONTENT_TYPE

Attributes

client[R]
env[R]
response[R]

Public Class Methods

new(app, options) click to toggle source
Calls superclass method
# File lib/acme/client/faraday_middleware.rb, line 8
def initialize(app, options)
  super(app)
  @client = options.fetch(:client)
  @mode = options.fetch(:mode)
end

Public Instance Methods

call(env) click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 14
def call(env)
  @env = env
  @env[:request_headers]['User-Agent'] = Acme::Client::USER_AGENT
  @env[:request_headers]['Content-Type'] = CONTENT_TYPE

  if @env.method != :get
    @env.body = client.jwk.jws(header: jws_header, payload: env.body)
  end

  @app.call(env).on_complete { |response_env| on_complete(response_env) }
rescue Faraday::TimeoutError, Faraday::ConnectionFailed
  raise Acme::Client::Error::Timeout
end
on_complete(env) click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 28
def on_complete(env)
  @env = env

  raise_on_not_found!
  store_nonce
  env.body = decode_body
  env.response_headers['Link'] = decode_link_headers

  return if env.success?

  raise_on_error!
end

Private Instance Methods

decode_body() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 75
def decode_body
  content_type = env.response_headers['Content-Type'].to_s

  if content_type.start_with?('application/json', 'application/problem+json')
    JSON.load(env.body)
  else
    env.body
  end
end
error_class() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 65
def error_class
  Acme::Client::Error::ACME_ERRORS.fetch(error_name, Acme::Client::Error)
end
error_message() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 57
def error_message
  if env.body.is_a? Hash
    env.body['detail']
  else
    "Error message: #{env.body}"
  end
end
error_name() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 69
def error_name
  return unless env.body.is_a?(Hash)
  return unless env.body.key?('type')
  env.body['type']
end
get_nonce() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 104
def get_nonce
  client.get_nonce
end
jws_header() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 43
def jws_header
  headers = { nonce: pop_nonce, url: env.url.to_s }
  headers[:kid] = client.kid if @mode == :kid
  headers
end
nonces() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 108
def nonces
  client.nonces
end
pop_nonce() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 96
def pop_nonce
  if nonces.empty?
    get_nonce
  end

  nonces.pop
end
raise_on_error!() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 53
def raise_on_error!
  raise error_class, error_message
end
raise_on_not_found!() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 49
def raise_on_not_found!
  raise Acme::Client::Error::NotFound, env.url.to_s if env.status == 404
end
store_nonce() click to toggle source
# File lib/acme/client/faraday_middleware.rb, line 91
def store_nonce
  nonce = env.response_headers['replay-nonce']
  nonces << nonce if nonce
end