lib/bullion/challenge_clients/http.rb



# frozen_string_literal: true

module Bullion
  module ChallengeClients
    # ACME HTTP01 Challenge Client
    # @see https://tools.ietf.org/html/rfc8555#section-8.3
    class HTTP < ChallengeClient
      def self.acme_type = "http-01"
      def type = "HTTP01"

      def performs_challenge?
        response = begin
          retrieve_body(challenge_url)
        rescue SocketError
          LOGGER.debug "Failed to connect to #{challenge_url}"
          ""
        end

        token, thumbprint = response.split(".")
        token == challenge.token && thumbprint == challenge.thumbprint
      end

      def challenge_url
        "http://#{identifier}/.well-known/acme-challenge/#{challenge.token}"
      end

      def retrieve_body(url)
        HTTParty.get(
          url,
          verify: false,
          headers: { "User-Agent" => "Bullion/#{Bullion::VERSION}" }
        ).body
      end
    end
  end
end