# frozen_string_literal: true

# patch https://github.com/rack/rack/pull/600
#
class Rack::ETag
  private

  def digest_body(body)
    parts = []
   has_body = false

   body.each do |part|
     parts << part
     has_body ||= part.length > 0
   end

   hexdigest =
     if has_body
       digest = Digest::MD5.new
       parts.each { |part| digest << part }
       digest.hexdigest
     end

   [hexdigest, parts]
 end
end

# patch https://github.com/rack/rack/pull/596
#
class Rack::ConditionalGet
  private
  def to_rfc2822(since)
    # shortest possible valid date is the obsolete: 1 Nov 97 09:55 A
    # anything shorter is invalid, this avoids exceptions for common cases
    # most common being the empty string
    if since && since.length >= 16
      # NOTE: there is no trivial way to write this in a non execption way
      #   _rfc2822 returns a hash but is not that usable
      Time.rfc2822(since) rescue nil
    else
      nil
    end
 end
end
