# 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