in internal/storage/fake/bucket.go [304:392]
func preconditionChecks(b *bucket, req *gcs.CreateObjectRequest, contents []byte) (err error) {
// Find any existing record for this name.
existingIndex := b.objects.find(req.Name)
var existingRecord *fakeObject
if existingIndex < len(b.objects) {
existingRecord = &b.objects[existingIndex]
}
// Check the provided checksum, if any.
if req.CRC32C != nil {
actual := crc32.Checksum(contents, crc32cTable)
if actual != *req.CRC32C {
err = fmt.Errorf(
"CRC32C mismatch: got 0x%08x, expected 0x%08x",
actual,
*req.CRC32C)
return
}
}
// Check the provided hash, if any.
if req.MD5 != nil {
actual := md5.Sum(contents)
if actual != *req.MD5 {
err = fmt.Errorf(
"MD5 mismatch: got %s, expected %s",
hex.EncodeToString(actual[:]),
hex.EncodeToString(req.MD5[:]))
return
}
}
// Check preconditions.
if req.GenerationPrecondition != nil {
if *req.GenerationPrecondition == 0 && existingRecord != nil {
err = &gcs.PreconditionError{
Err: errors.New("precondition failed: object exists"),
}
return
}
if *req.GenerationPrecondition > 0 {
if existingRecord == nil {
err = &gcs.PreconditionError{
Err: errors.New("precondition failed: object doesn't exist"),
}
return
}
existingGen := existingRecord.metadata.Generation
if existingGen != *req.GenerationPrecondition {
err = &gcs.PreconditionError{
Err: fmt.Errorf(
"precondition failed: object has generation %v",
existingGen),
}
return
}
}
}
if req.MetaGenerationPrecondition != nil {
if existingRecord == nil {
err = &gcs.PreconditionError{
Err: errors.New("precondition failed: object doesn't exist"),
}
return
}
existingMetaGen := existingRecord.metadata.MetaGeneration
if existingMetaGen != *req.MetaGenerationPrecondition {
err = &gcs.PreconditionError{
Err: fmt.Errorf(
"precondition failed: object has meta-generation %v",
existingMetaGen),
}
return
}
}
return
}