private static void ProcessConfig(OciDescriptor config) { // media types are case insensitive if (!string.Equals(config.MediaType, BicepMediaTypes.BicepModuleConfigV1, MediaTypeComparison)) { throw new InvalidModuleException($"Did not expect config media type \"{config.MediaType}\"."); } if (config.Size != 0) { throw new InvalidModuleException("Expected an empty config blob."); } }
private static async Task <Stream> ProcessLayer(BicepRegistryBlobClient client, OciDescriptor layer) { if (!string.Equals(layer.MediaType, BicepMediaTypes.BicepModuleLayerV1Json, MediaTypeComparison)) { throw new InvalidModuleException($"Did not expect layer media type \"{layer.MediaType}\"."); } Response <DownloadBlobResult> blobResult; try { blobResult = await client.DownloadBlobAsync(layer.Digest); } catch (RequestFailedException exception) when(exception.Status == 404) { throw new InvalidModuleException($"Module manifest refers to a non-existent blob with digest \"{layer.Digest}\".", exception); } ValidateBlobResponse(blobResult, layer); return(blobResult.Value.Content); }
private static void ValidateBlobResponse(Response <DownloadBlobResult> blobResponse, OciDescriptor descriptor) { var stream = blobResponse.Value.Content; if (descriptor.Size != stream.Length) { throw new InvalidModuleException($"Expected blob size of {descriptor.Size} bytes but received {stream.Length} bytes from the registry."); } stream.Position = 0; string digestFromContents = DigestHelper.ComputeDigest(DigestHelper.AlgorithmIdentifierSha256, stream); stream.Position = 0; if (!string.Equals(descriptor.Digest, digestFromContents, DigestComparison)) { throw new InvalidModuleException($"There is a mismatch in the layer digests. Received content digest = {digestFromContents}, Requested digest = {descriptor.Digest}"); } }