oci-dotnet-sdk icon indicating copy to clipboard operation
oci-dotnet-sdk copied to clipboard

Nonseekable stream can not be uploaded to Object storage

Open jeffhli opened this issue 1 year ago • 0 comments

The following code will throw an exception that Oci.Common.Model.OciException HResult=0x80131500 Message=v2-chunked-transfer-encoding Source=OCI.DotNetSDK.Common StackTrace: at Oci.Common.Http.Internal.ResponseHelper.HandleNonSuccessfulResponse(HttpResponseMessage responseMessage, ApiDetails apiDetails, String caller) at Oci.Common.Http.RestClient.CheckHttpResponseMessage(HttpRequestMessage httpRequest, HttpResponseMessage httpResponse, ApiDetails apiDetails) at Oci.ObjectstorageService.ObjectStorageClient.<PutObject>d__48.MoveNext() at Program.<<Main>$>d__0.MoveNext() in D:\code\localtest\OraclePlayground\Program.cs:line 37

  • NonseekableStream
internal class NonseekableStream : Stream
    {
        private Stream innerStream;

        public NonseekableStream(Stream innerStream)
        {
            this.innerStream = innerStream;
        }

        public override bool CanRead => innerStream.CanRead;

        public override bool CanSeek => false;

        public override bool CanWrite => false;

        public override long Length => innerStream.Length;

        public override long Position { get => innerStream.Position; set => throw new NotSupportedException(); }

        public override void Flush()
        {
            throw new NotSupportedException();
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return innerStream.Read(buffer, offset, count);
        }

        public override long Seek(long offset, SeekOrigin origin)
        {
            throw new NotSupportedException();
        }

        public override void SetLength(long value)
        {
            throw new NotSupportedException();
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            throw new NotSupportedException();
        }
    }
  • Main code
var objectStorageClient = new ObjectStorageClient(provider);
var uri = objectStorageClient.GetEndpoint();
var bucketResponse = await objectStorageClient.GetBucket(new GetBucketRequest()
{
    NamespaceName = "ax1hhmmvkvpo",
    BucketName = "jefftest"
});
var bucket = bucketResponse.Bucket;
var putObjectResponse = await objectStorageClient.PutObject(new PutObjectRequest()
{
    NamespaceName = "ax1hhkmvkvpo",
    BucketName = "jefftest",
    PutObjectBody = new NonseekableStream(new MemoryStream(Encoding.UTF8.GetBytes("Hello, World2!"))),
    ObjectName = "test.txt",

});

jeffhli avatar Jan 18 '24 09:01 jeffhli