private static async Task <HttpContent> CreateBufferedRequestContentAsync( IOwinRequest owinRequest, CancellationToken cancellationToken ) { // We need to replace the request body with a buffered stream so that other components can read the stream. // For this stream to be useful, it must NOT be diposed along with the request. Streams created by // StreamContent do get disposed along with the request, so use MemoryStream to buffer separately. MemoryStream buffer; int? contentLength = owinRequest.GetContentLength(); if (!contentLength.HasValue) { buffer = new MemoryStream(); } else { buffer = new MemoryStream(contentLength.Value); } cancellationToken.ThrowIfCancellationRequested(); using (StreamContent copier = new StreamContent(owinRequest.Body)) { await copier.CopyToAsync(buffer); } // Provide the non-disposing, buffered stream to later OWIN components (set to the stream's beginning). buffer.Position = 0; owinRequest.Body = buffer; // For MemoryStream, Length is guaranteed to be an int. return(new ByteArrayContent(buffer.GetBuffer(), 0, (int)buffer.Length)); }
public void GetContentLength_IfValid_ReturnsValue() { int expected = 123; IHeaderDictionary headers = CreateStubHeaders("Content-Length", new string[] { expected.ToString() }); IOwinRequest request = CreateStubRequest(headers); // Act int?length = request.GetContentLength(); // Assert Assert.True(length.HasValue); Assert.Equal(expected, length.Value); }
private static async Task<HttpContent> CreateBufferedRequestContentAsync(IOwinRequest owinRequest, CancellationToken cancellationToken) { // We need to replace the request body with a buffered stream so that other components can read the stream. // For this stream to be useful, it must NOT be diposed along with the request. Streams created by // StreamContent do get disposed along with the request, so use MemoryStream to buffer separately. MemoryStream buffer; int? contentLength = owinRequest.GetContentLength(); if (!contentLength.HasValue) { buffer = new MemoryStream(); } else { buffer = new MemoryStream(contentLength.Value); } cancellationToken.ThrowIfCancellationRequested(); using (StreamContent copier = new StreamContent(owinRequest.Body)) { await copier.CopyToAsync(buffer); } // Provide the non-disposing, buffered stream to later OWIN components (set to the stream's beginning). buffer.Position = 0; owinRequest.Body = buffer; // For MemoryStream, Length is guaranteed to be an int. return new ByteArrayContent(buffer.GetBuffer(), 0, (int)buffer.Length); }