class Acme::Client::HTTPClient::AcmeMiddleware

AcmeMiddleware implements the Acme-protocol requirements for JWK requests.

def call(env)

def call(env)
  @env = env
  @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) }
end

def decode_body

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

def decode_link_headers

def decode_link_headers
  return unless env.response_headers.key?('Link')
  link_header = env.response_headers['Link']
  Acme::Client::Util.decode_link_headers(link_header)
end

def error_class

def error_class
  Acme::Client::Error::ACME_ERRORS.fetch(error_name, Acme::Client::Error)
end

def error_message

def error_message
  if env.body.is_a? Hash
    env.body['detail']
  else
    "Error message: #{env.body}"
  end
end

def error_name

def error_name
  return unless env.body.is_a?(Hash)
  return unless env.body.key?('type')
  env.body['type']
end

def get_nonce

def get_nonce
  client.get_nonce
end

def initialize(app, options)

def initialize(app, options)
  super(app)
  @client = options.fetch(:client)
  @mode = options.fetch(:mode)
end

def jws_header

def jws_header
  headers = { nonce: pop_nonce, url: env.url.to_s }
  headers[:kid] = client.kid if @mode == :kid
  headers
end

def nonces

def nonces
  client.nonces
end

def on_complete(env)

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

def pop_nonce

def pop_nonce
  if nonces.empty?
    get_nonce
  end
  nonces.pop
end

def raise_on_error!

def raise_on_error!
  raise error_class, error_message
end

def raise_on_not_found!

def raise_on_not_found!
  raise Acme::Client::Error::NotFound, env.url.to_s if env.status == 404
end

def store_nonce

def store_nonce
  nonce = env.response_headers['replay-nonce']
  nonces << nonce if nonce
end