Skip to content

Commit 93f7682

Browse files
authored
Correction of BufferedReadStream's Position (#60529)
1 parent a2e3677 commit 93f7682

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

src/Http/WebUtilities/src/BufferedReadStream.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ public override long Position
108108
if (innerOffset <= _bufferCount)
109109
{
110110
// Yes, just skip some of the buffered data
111-
_bufferOffset += innerOffset;
112-
_bufferCount -= innerOffset;
111+
_bufferOffset += _bufferCount - innerOffset;
112+
_bufferCount = innerOffset;
113113
}
114114
else
115115
{

src/Http/WebUtilities/test/MultipartReaderTests.cs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ public class MultipartReaderTests
8080
"<!DOCTYPE html><title>Content of a.html.</title>\r\n" +
8181
"\r\n" +
8282
"--9051914041544843365972754266--\r\n";
83-
8483
private const string TwoPartBodyIncompleteBuffer =
8584
"--9051914041544843365972754266\r\n" +
8685
"Content-Disposition: form-data; name=\"text\"\r\n" +
@@ -315,6 +314,43 @@ public void MultipartReader_BufferSizeMustBeLargerThanBoundary_Throws()
315314
});
316315
}
317316

317+
[Fact]
318+
public async Task MultipartReader_ReadMultipartBodyWithFilesForDeferredCopy_Success()
319+
{
320+
var stream = MakeStream(ThreePartBody);
321+
var reader = new MultipartReader(Boundary, stream);
322+
323+
await reader.ReadNextSectionAsync(); // skip text field section
324+
325+
var section = await reader.ReadNextSectionAsync();
326+
Assert.NotNull(section);
327+
Assert.Equal(2, section.Headers.Count);
328+
Assert.Equal("form-data; name=\"file1\"; filename=\"a.txt\"", section.Headers["Content-Disposition"][0]);
329+
Assert.Equal("text/plain", section.Headers["Content-Type"][0]);
330+
var stream1 = section.Body;
331+
332+
section = await reader.ReadNextSectionAsync();
333+
Assert.NotNull(section);
334+
Assert.Equal(2, section.Headers.Count);
335+
Assert.Equal("form-data; name=\"file2\"; filename=\"a.html\"", section.Headers["Content-Disposition"][0]);
336+
Assert.Equal("text/html", section.Headers["Content-Type"][0]);
337+
var stream2 = section.Body;
338+
339+
Assert.Null(await reader.ReadNextSectionAsync());
340+
341+
Assert.True(stream1.CanSeek);
342+
Assert.Equal(0, stream1.Seek(0, SeekOrigin.Begin));
343+
var buffer = new MemoryStream();
344+
await stream1.CopyToAsync(buffer);
345+
Assert.Equal("Content of a.txt.\r\n", Encoding.ASCII.GetString(buffer.ToArray()));
346+
347+
Assert.True(stream2.CanSeek);
348+
Assert.Equal(0, stream2.Seek(0, SeekOrigin.Begin));
349+
buffer = new MemoryStream();
350+
await stream2.CopyToAsync(buffer);
351+
Assert.Equal("<!DOCTYPE html><title>Content of a.html.</title>\r\n", Encoding.ASCII.GetString(buffer.ToArray()));
352+
}
353+
318354
[Fact]
319355
public async Task MultipartReader_TwoPartBodyIncompleteBuffer_TwoSectionsReadSuccessfullyThirdSectionThrows()
320356
{

0 commit comments

Comments
 (0)