public virtual async Task <Response <UploadManifestResult> > UploadManifestAsync(Stream stream, UploadManifestOptions options = default, CancellationToken cancellationToken = default) { options ??= new UploadManifestOptions(); string reference = options.Tag ?? DigestHelper.ComputeDigest(DigestHelper.AlgorithmIdentifierSha256, stream); stream.Position = 0; ResponseWithHeaders <ContainerRegistryCreateManifestHeaders> response = await _restClient.CreateManifestAsync(_repositoryName, reference, options.MediaType, stream, cancellationToken).ConfigureAwait(false); return(Response.FromValue(new UploadManifestResult(), response.GetRawResponse())); }
private static void ValidateManifestResponse(Response <DownloadManifestResult> manifestResponse) { var digestFromRegistry = manifestResponse.Value.Digest; var stream = manifestResponse.Value.Content; stream.Position = 0; // TODO: The registry may use a different digest algorithm - we need to handle that string digestFromContent = DigestHelper.ComputeDigest(DigestHelper.AlgorithmIdentifierSha256, stream); if (!string.Equals(digestFromRegistry, digestFromContent, DigestComparison)) { throw new OciModuleRegistryException($"There is a mismatch in the manifest digests. Received content digest = {digestFromContent}, Digest in registry response = {digestFromRegistry}"); } }
public virtual async Task <Response <UploadBlobResult> > UploadBlobAsync(Stream stream, CancellationToken cancellationToken = default) { string digest = DigestHelper.ComputeDigest(DigestHelper.AlgorithmIdentifierSha256, stream); ResponseWithHeaders <ContainerRegistryBlobStartUploadHeaders> startUploadResult = await _blobRestClient.StartUploadAsync(_repositoryName, cancellationToken).ConfigureAwait(false); stream.Position = 0; ResponseWithHeaders <ContainerRegistryBlobUploadChunkHeaders> uploadChunkResult = await _blobRestClient.UploadChunkAsync(startUploadResult.Headers.Location, stream, cancellationToken).ConfigureAwait(false); ResponseWithHeaders <ContainerRegistryBlobCompleteUploadHeaders> completeUploadResult = await _blobRestClient.CompleteUploadAsync(digest, uploadChunkResult.Headers.Location, null, cancellationToken).ConfigureAwait(false); return(Response.FromValue(new UploadBlobResult(), completeUploadResult.GetRawResponse())); }
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}"); } }