@@ -13,15 +13,15 @@ type Digester struct {
1313 digester digest.Digester // Or nil
1414}
1515
16- // newDigester initiates computation of a digest.Canonical digest of stream,
16+ // newDigester initiates computation of a digest of stream using the specified algorithm ,
1717// if !validDigest; otherwise it just records knownDigest to be returned later.
1818// The caller MUST use the returned stream instead of the original value.
19- func newDigester (stream io.Reader , knownDigest digest.Digest , validDigest bool ) (Digester , io.Reader ) {
19+ func newDigester (stream io.Reader , knownDigest digest.Digest , validDigest bool , algorithm digest. Algorithm ) (Digester , io.Reader ) {
2020 if validDigest {
2121 return Digester {knownDigest : knownDigest }, stream
2222 } else {
2323 res := Digester {
24- digester : digest . Canonical .Digester (),
24+ digester : algorithm .Digester (),
2525 }
2626 stream = io .TeeReader (stream , res .digester .Hash ())
2727 return res , stream
@@ -34,7 +34,7 @@ func newDigester(stream io.Reader, knownDigest digest.Digest, validDigest bool)
3434// The caller MUST use the returned stream instead of the original value.
3535func DigestIfUnknown (stream io.Reader , blobInfo types.BlobInfo ) (Digester , io.Reader ) {
3636 d := blobInfo .Digest
37- return newDigester (stream , d , d != "" )
37+ return newDigester (stream , d , d != "" , digest . Canonical )
3838}
3939
4040// DigestIfCanonicalUnknown initiates computation of a digest.Canonical digest of stream,
@@ -43,7 +43,16 @@ func DigestIfUnknown(stream io.Reader, blobInfo types.BlobInfo) (Digester, io.Re
4343// The caller MUST use the returned stream instead of the original value.
4444func DigestIfCanonicalUnknown (stream io.Reader , blobInfo types.BlobInfo ) (Digester , io.Reader ) {
4545 d := blobInfo .Digest
46- return newDigester (stream , d , d != "" && d .Algorithm () == digest .Canonical )
46+ return newDigester (stream , d , d != "" && d .Algorithm () == digest .Canonical , digest .Canonical )
47+ }
48+
49+ // DigestIfAlgorithmUnknown initiates computation of a digest of stream,
50+ // if a digest of the specified algorithm is not supplied in the provided blobInfo;
51+ // otherwise blobInfo.Digest will be used.
52+ // The caller MUST use the returned stream instead of the original value.
53+ func DigestIfAlgorithmUnknown (stream io.Reader , blobInfo types.BlobInfo , algorithm digest.Algorithm ) (Digester , io.Reader ) {
54+ d := blobInfo .Digest
55+ return newDigester (stream , d , d != "" && d .Algorithm () == algorithm , algorithm )
4756}
4857
4958// Digest() returns a digest value possibly computed by Digester.
0 commit comments