Skip to content
This repository was archived by the owner on Nov 22, 2018. It is now read-only.

Commit 884cb58

Browse files
committed
Eagerly disable buffering
1 parent 20e11e4 commit 884cb58

File tree

3 files changed

+30
-9
lines changed

3 files changed

+30
-9
lines changed

src/Microsoft.AspNetCore.ResponseCaching/Internal/ResponseCacheStream.cs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal
1111
internal class ResponseCacheStream : Stream
1212
{
1313
private readonly Stream _innerStream;
14+
private readonly long _maxBufferSize;
1415

15-
public ResponseCacheStream(Stream innerStream)
16+
public ResponseCacheStream(Stream innerStream, long maxBufferSize)
1617
{
1718
_innerStream = innerStream;
19+
_maxBufferSize = maxBufferSize;
1820
}
1921

2022
public MemoryStream BufferedStream { get; } = new MemoryStream();
@@ -77,7 +79,14 @@ public override void Write(byte[] buffer, int offset, int count)
7779

7880
if (BufferingEnabled)
7981
{
80-
BufferedStream.Write(buffer, offset, count);
82+
if (BufferedStream.Length + count > _maxBufferSize)
83+
{
84+
DisableBuffering();
85+
}
86+
else
87+
{
88+
BufferedStream.Write(buffer, offset, count);
89+
}
8190
}
8291
}
8392

@@ -95,7 +104,14 @@ public override async Task WriteAsync(byte[] buffer, int offset, int count, Canc
95104

96105
if (BufferingEnabled)
97106
{
98-
await BufferedStream.WriteAsync(buffer, offset, count, cancellationToken);
107+
if (BufferedStream.Length + count > _maxBufferSize)
108+
{
109+
DisableBuffering();
110+
}
111+
else
112+
{
113+
await BufferedStream.WriteAsync(buffer, offset, count, cancellationToken);
114+
}
99115
}
100116
}
101117

@@ -113,7 +129,14 @@ public override void WriteByte(byte value)
113129

114130
if (BufferingEnabled)
115131
{
116-
BufferedStream.WriteByte(value);
132+
if (BufferedStream.Length + 1 > _maxBufferSize)
133+
{
134+
DisableBuffering();
135+
}
136+
else
137+
{
138+
BufferedStream.WriteByte(value);
139+
}
117140
}
118141
}
119142

src/Microsoft.AspNetCore.ResponseCaching/ResponseCachingContext.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -594,9 +594,7 @@ internal void FinalizeCachingHeaders()
594594

595595
internal void FinalizeCachingBody()
596596
{
597-
if (CacheResponse &&
598-
ResponseCacheStream.BufferingEnabled &&
599-
!(_options.MaximumCachedBodySize < ResponseCacheStream.BufferedStream.Length))
597+
if (CacheResponse && ResponseCacheStream.BufferingEnabled)
600598
{
601599
_cachedResponse.Body = ResponseCacheStream.BufferedStream.ToArray();
602600

@@ -621,7 +619,7 @@ internal void ShimResponseStream()
621619

622620
// Shim response stream
623621
OriginalResponseStream = _httpContext.Response.Body;
624-
ResponseCacheStream = new ResponseCacheStream(OriginalResponseStream);
622+
ResponseCacheStream = new ResponseCacheStream(OriginalResponseStream, _options.MaximumCachedBodySize);
625623
_httpContext.Response.Body = ResponseCacheStream;
626624

627625
// Shim IHttpSendFileFeature

src/Microsoft.AspNetCore.ResponseCaching/ResponseCachingOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class ResponseCachingOptions
1111
/// <summary>
1212
/// The largest cacheable size for the response body in bytes.
1313
/// </summary>
14-
public int? MaximumCachedBodySize { get; set; }
14+
public long MaximumCachedBodySize { get; set; } = 1024 * 1024;
1515

1616
/// <summary>
1717
/// For testing purposes only.

0 commit comments

Comments
 (0)