2016-02-01 07:43:26 -05:00
|
|
|
# frozen_string_literal: true
|
2012-11-29 01:52:18 -05:00
|
|
|
##
|
|
|
|
# IO wrapper that creates digests of contents written to the IO it wraps.
|
|
|
|
|
|
|
|
class Gem::Package::DigestIO
|
|
|
|
##
|
|
|
|
# Collected digests for wrapped writes.
|
|
|
|
#
|
|
|
|
# {
|
|
|
|
# 'SHA1' => #<OpenSSL::Digest: [...]>,
|
|
|
|
# 'SHA512' => #<OpenSSL::Digest: [...]>,
|
|
|
|
# }
|
|
|
|
|
|
|
|
attr_reader :digests
|
|
|
|
|
|
|
|
##
|
|
|
|
# Wraps +io+ and updates digest for each of the digest algorithms in
|
|
|
|
# the +digests+ Hash. Returns the digests hash. Example:
|
|
|
|
#
|
|
|
|
# io = StringIO.new
|
|
|
|
# digests = {
|
|
|
|
# 'SHA1' => OpenSSL::Digest.new('SHA1'),
|
|
|
|
# 'SHA512' => OpenSSL::Digest.new('SHA512'),
|
|
|
|
# }
|
|
|
|
#
|
|
|
|
# Gem::Package::DigestIO.wrap io, digests do |digest_io|
|
|
|
|
# digest_io.write "hello"
|
|
|
|
# end
|
|
|
|
#
|
|
|
|
# digests['SHA1'].hexdigest #=> "aaf4c61d[...]"
|
|
|
|
# digests['SHA512'].hexdigest #=> "9b71d224[...]"
|
|
|
|
|
2018-11-21 05:20:47 -05:00
|
|
|
def self.wrap(io, digests)
|
2012-11-29 01:52:18 -05:00
|
|
|
digest_io = new io, digests
|
|
|
|
|
|
|
|
yield digest_io
|
|
|
|
|
|
|
|
return digests
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Creates a new DigestIO instance. Using ::wrap is recommended, see the
|
|
|
|
# ::wrap documentation for documentation of +io+ and +digests+.
|
|
|
|
|
2018-11-21 05:20:47 -05:00
|
|
|
def initialize(io, digests)
|
2012-11-29 01:52:18 -05:00
|
|
|
@io = io
|
|
|
|
@digests = digests
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Writes +data+ to the underlying IO and updates the digests
|
|
|
|
|
2018-11-21 05:20:47 -05:00
|
|
|
def write(data)
|
2012-11-29 01:52:18 -05:00
|
|
|
result = @io.write data
|
|
|
|
|
|
|
|
@digests.each do |_, digest|
|
|
|
|
digest << data
|
|
|
|
end
|
|
|
|
|
|
|
|
result
|
|
|
|
end
|
|
|
|
end
|