diff --git a/src/PdqHash/PdqHasher.cs b/src/PdqHash/PdqHasher.cs index 99cdcab..437f4d0 100644 --- a/src/PdqHash/PdqHasher.cs +++ b/src/PdqHash/PdqHasher.cs @@ -66,7 +66,15 @@ private static void ComputeDCTMatrix(Memory memory) public HashResult? FromStream(Stream input, string source) { var stopwatch = Stopwatch.StartNew(); - + + using var bufferedStream = input.CanSeek ? null : new MemoryStream(); + if (bufferedStream != null) + { + input.CopyTo(bufferedStream); + bufferedStream.Position = 0; + input = bufferedStream; + } + using var codec = SKCodec.Create(input, out var result); if (codec == null) diff --git a/test/PdqHash.Tests/Streams/StreamParsingTests.cs b/test/PdqHash.Tests/Streams/StreamParsingTests.cs index 73abbea..219615a 100644 --- a/test/PdqHash.Tests/Streams/StreamParsingTests.cs +++ b/test/PdqHash.Tests/Streams/StreamParsingTests.cs @@ -62,7 +62,11 @@ public async Task EnsureHashingWithNonSeekableStreams() return hasher.FromStream(pipe.Reader.AsStream(), ""); }); - var writeTask = Task.Run(() => pipe.Writer.WriteAsync(bytes)); + var writeTask = Task.Run(async () => + { + await pipe.Writer.WriteAsync(bytes); + await pipe.Writer.CompleteAsync(); + }); await Task.WhenAll(hashTask, writeTask);