diff --git a/Activout.RestClient.Test/NonJsonRestClientTests.cs b/Activout.RestClient.Test/NonJsonRestClientTests.cs index cd8f49e..f7916f7 100644 --- a/Activout.RestClient.Test/NonJsonRestClientTests.cs +++ b/Activout.RestClient.Test/NonJsonRestClientTests.cs @@ -229,6 +229,24 @@ public async Task TestGetByteArray() Assert.Equal(new byte[] { 42 }, bytes); } + [Fact] + public async Task TestGetEmptyByteArray() + { + // arrange + _mockHttp + .When($"{BaseUri}/movies/bytes") + .Respond(new ByteArrayContent(new byte[0])); + + var reviewSvc = CreateMovieReviewService(); + + // act + var bytes = await reviewSvc.GetByteArray(); + + // assert + Assert.NotNull(bytes); + Assert.Empty(bytes); + } + [Fact] public async Task TestGetByteArrayObject() { @@ -246,6 +264,23 @@ public async Task TestGetByteArrayObject() Assert.Equal(new byte[] { 42 }, byteArrayObject.Bytes); } + [Fact] + public async Task TestGetByteArrayObjectWithEmptyArray() + { + // arrange + _mockHttp + .When($"{BaseUri}/movies/byte-object") + .Respond(new ByteArrayContent(new byte[0])); + + var reviewSvc = CreateMovieReviewService(); + + // act + var byteArrayObject = await reviewSvc.GetByteArrayObject(); + + // assert + Assert.Null(byteArrayObject); + } + [Fact] public async Task TestGetString() { diff --git a/Activout.RestClient/Serialization/Implementation/ByteArrayDeserializer.cs b/Activout.RestClient/Serialization/Implementation/ByteArrayDeserializer.cs index b046e7d..cf935b5 100644 --- a/Activout.RestClient/Serialization/Implementation/ByteArrayDeserializer.cs +++ b/Activout.RestClient/Serialization/Implementation/ByteArrayDeserializer.cs @@ -18,10 +18,19 @@ internal class ByteArrayDeserializer : IDeserializer public async Task Deserialize(HttpContent content, Type type) { var bytes = await content.ReadAsByteArrayAsync(); + if (type == typeof(byte[])) + { + return bytes; + } - return type == typeof(byte[]) - ? bytes - : Activator.CreateInstance(type, bytes); + if (type.IsValueType) + { + throw new InvalidOperationException( + $"Cannot deserialize application/octet-stream to value type '{type.FullName}'."); + } + + // If the byte array is empty, do not try to create an object + return bytes.Length == 0 ? null : Activator.CreateInstance(type, bytes); } public bool CanDeserialize(MediaType mediaType)