Skip to content
This repository has been archived by the owner on Jan 24, 2021. It is now read-only.

Non buffered requests #1920

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/Nancy.Testing.Tests/BrowserFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ public async Task Should_be_able_to_send_stream_in_body()
var writer = new StreamWriter(stream);
writer.Write(thisIsMyRequestBody);
writer.Flush();

stream.Position = 0;
// When
var result = await browser.Post("/", with =>
{
Expand Down Expand Up @@ -299,10 +299,12 @@ public async Task Should_be_able_to_continue_with_another_request()
var firstRequestWriter = new StreamWriter(firstRequestStream);
firstRequestWriter.Write(FirstRequestBody);
firstRequestWriter.Flush();
firstRequestStream.Position = 0;
var secondRequestStream = new MemoryStream();
var secondRequestWriter = new StreamWriter(secondRequestStream);
secondRequestWriter.Write(SecondRequestBody);
secondRequestWriter.Flush();
secondRequestStream.Position = 0;

// When
await browser.Post("/", with =>
Expand Down
1 change: 1 addition & 0 deletions src/Nancy.Testing/Browser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,7 @@ private static Request CreateRequest(string method, Url url, IBrowserContextValu

var requestStream =
RequestStream.FromStream(contextValues.Body, 0, true);
requestStream.BufferStream();

var certBytes = (contextValues.ClientCertificate == null)
? new byte[] { }
Expand Down
2 changes: 2 additions & 0 deletions src/Nancy.Testing/BrowserContextExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public static void JsonBody<TModel>(this BrowserContext browserContext, TModel m
contextValues.Body = new MemoryStream();

serializer.Serialize("application/json", model, contextValues.Body);
contextValues.Body.Position = 0;
browserContext.Header("Content-Type", "application/json");
}

Expand All @@ -86,6 +87,7 @@ public static void XMLBody<TModel>(this BrowserContext browserContext, TModel mo
contextValues.Body = new MemoryStream();

serializer.Serialize("application/xml", model, contextValues.Body);
contextValues.Body.Position = 0;
browserContext.Header("Content-Type", "application/xml");
}

Expand Down
132 changes: 38 additions & 94 deletions src/Nancy.Tests/Unit/IO/RequestStreamFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,6 @@ public void Should_not_dispose_wrapped_stream_when_not_switched()
stream.HasBeenDisposed.ShouldBeFalse();
}

[Fact]
public void Should_move_non_seekable_stream_into_seekable_stream_when_stream_switching_is_disabled()
{
// Given
var stream = new ConfigurableMemoryStream(Seekable: false);

// When
var result = RequestStream.FromStream(stream, 0, 1, true);

// Then
result.CanSeek.ShouldBeTrue();
}

[Fact]
public void Should_move_stream_out_of_memory_if_longer_than_threshold_and_stream_switching_is_enabled()
{
Expand All @@ -46,6 +33,7 @@ public void Should_move_stream_out_of_memory_if_longer_than_threshold_and_stream

// When
var result = RequestStream.FromStream(inputStream, 0, 4, false);
result.BufferStream();

// Then
result.IsInMemory.ShouldBeFalse();
Expand All @@ -59,6 +47,7 @@ public void Should_not_move_stream_out_of_memory_if_longer_than_threshold_and_st

// When
var result = RequestStream.FromStream(inputStream, 0, 4, true);
result.BufferStream();

// Then
result.IsInMemory.ShouldBeTrue();
Expand Down Expand Up @@ -134,7 +123,7 @@ public void Should_return_true_when_queried_about_supporting_reading()
}

[Fact]
public void Should_return_true_when_queried_about_supporting_writing()
public void Should_return_false_when_queried_about_supporting_writing()
{
// Given
var stream = new ConfigurableMemoryStream();
Expand All @@ -144,11 +133,11 @@ public void Should_return_true_when_queried_about_supporting_writing()
var result = request.CanWrite;

// Then
result.ShouldBeTrue();
result.ShouldBeFalse();
}

[Fact]
public void Should_return_true_when_queried_about_supporting_seeking()
public void Should_return_false_when_queried_about_supporting_seeking()
{
// Given
var stream = new ConfigurableMemoryStream();
Expand All @@ -158,21 +147,36 @@ public void Should_return_true_when_queried_about_supporting_seeking()
var result = request.CanSeek;

// Then
result.ShouldBeTrue();
result.ShouldBeFalse();
}

[Fact]
public void Should_return_false_when_queried_about_supporting_timeout()
public void Should_return_true_when_queried_about_supporting_seeking_if_buffered()
{
// Given
var stream = new ConfigurableMemoryStream();
var request = RequestStream.FromStream(stream, 0, 1, false);
request.BufferStream();

// When
var result = request.CanSeek;

// Then
result.ShouldBeTrue();
}

[Fact]
public void Should_return_underlaying_stream_when_queried_about_supporting_timeout()
{
// Given
var stream = new ConfigurableMemoryStream(Timeoutable: true);
var request = RequestStream.FromStream(stream, 0, 1, false);

// When
var result = request.CanTimeout;

// Then
result.ShouldBeFalse();
result.ShouldBeTrue();
}

[Fact]
Expand Down Expand Up @@ -247,17 +251,17 @@ public void Should_throw_invalidoperationexception_when_position_is_set_to_great
}

[Fact]
public void Should_flush_underlaying_stream()
public void Should_throw_on_flush()
{
// Given
var stream = new ConfigurableMemoryStream();
var request = RequestStream.FromStream(stream, 0, 1, false);

// When
request.Flush();
var exception = Record.Exception(() => request.Flush());

// Then
stream.HasBeenFlushed.ShouldBeTrue();
exception.ShouldBeOfType<NotSupportedException>();
}

[Fact]
Expand All @@ -275,45 +279,17 @@ public void Should_throw_notsupportedexception_when_setting_length()
}

[Fact]
public void Should_set_position_of_underlaying_stream_to_zero_when_created()
{
// Given
var stream = new ConfigurableMemoryStream(Position: 10L);

// When
var request = RequestStream.FromStream(stream, 0, 1, false);

// Then
stream.Position.ShouldEqual(0L);
}

[Fact]
public void Should_seek_in_the_underlaying_stream_when_seek_is_called()
public void Should_throw_when_seek_is_called()
{
// Given
var stream = new ConfigurableMemoryStream();
var request = RequestStream.FromStream(stream, 0, 1, false);

// When
request.Seek(10L, SeekOrigin.Current);
var exception = Record.Exception(() => request.Seek(10L, SeekOrigin.Current));

// Then
stream.HasBeenSeeked.ShouldBeTrue();
}

[Fact]
public void Should_return_the_new_position_of_the_underlaying_stream_when_seek_is_called()
{
// Given
var stream = CreateFakeStream();
A.CallTo(() => stream.Seek(A<long>.Ignored, A<SeekOrigin>.Ignored)).Returns(100L);
var request = RequestStream.FromStream(stream, 0, 1, false);

// When
var result = request.Seek(10L, SeekOrigin.Current);

// Then
result.ShouldEqual(100L);
exception.ShouldBeOfType<NotSupportedException>();
}

[Fact]
Expand Down Expand Up @@ -377,65 +353,33 @@ public void Should_return_result_from_reading_underlaying_stream()
}

[Fact]
public void Should_write_to_underlaying_stream_when_write_is_called()
public void Should_throw_when_write_is_called()
{
// Given
var stream = CreateFakeStream();
var buffer = new byte[1];
var request = RequestStream.FromStream(stream, 0, 1, false);

// When
request.Write(buffer, 0, buffer.Length);
var exception = Record.Exception(() => request.Write(buffer, 0, buffer.Length));

// Then
A.CallTo(() => stream.Write(buffer, 0, buffer.Length)).MustHaveHappened();
exception.ShouldBeOfType<NotSupportedException>();
}

[Fact]
public void Should_no_longer_be_in_memory_if_expected_length_is_greater_or_equal_to_threshold_length()
{
// Given
var stream = CreateFakeStream();

// When
var request = RequestStream.FromStream(stream, 1, 0, false);

// Then
request.IsInMemory.ShouldBeFalse();
}

[Fact]
public void Should_no_longer_be_in_memory_when_more_bytes_have_been_written_to_stream_then_size_of_the_threshold_and_stream_swapping_is_enabled()
{
// Given
var stream = CreateFakeStream();
var buffer = new byte[100];
var request = RequestStream.FromStream(stream, 0, 10, false);
A.CallTo(() => stream.Length).Returns(100);

// When
request.Write(buffer, 0, buffer.Length);
var request = RequestStream.FromStream(stream, 1, 0, false);

// Then
request.IsInMemory.ShouldBeFalse();
}

[Fact]
public void Should_still_be_in_memory_when_more_bytes_have_been_written_to_stream_than_size_of_threshold_and_stream_swapping_is_disabled()
{
// Given
var stream = CreateFakeStream();
var buffer = new byte[100];
var request = RequestStream.FromStream(stream, 0, 10, true);
A.CallTo(() => stream.Length).Returns(100);

// When
request.Write(buffer, 0, buffer.Length);

// Then
request.IsInMemory.ShouldBeTrue();
}

[Fact]
public void Should_call_beginread_on_underlaying_stream_when_beginread_is_called()
{
Expand Down Expand Up @@ -540,18 +484,18 @@ public void Should_return_result_from_underlaying_endread_when_endread_is_called
}

[Fact]
public void Should_call_endwrite_on_underlaying_stream_when_endwrite_is_called()
public void Should_throw_when_endwrite_is_called()
{
// Given
var stream = CreateFakeStream();
var asyncResult = A.Fake<IAsyncResult>();
var request = RequestStream.FromStream(stream, 0, 10, true);

// When
request.EndWrite(asyncResult);
var exception = Record.Exception(() => request.EndWrite(asyncResult));

// Then
A.CallTo(() => stream.EndWrite(asyncResult)).MustHaveHappened();
exception.ShouldBeOfType<NotSupportedException>();
}

private static Stream CreateFakeStream()
Expand All @@ -565,7 +509,7 @@ private static Stream CreateFakeStream()
A.CallTo(() => stream.CanSeek).Returns(true);
A.CallTo(() => stream.CanTimeout).Returns(true);
A.CallTo(() => stream.CanWrite).Returns(true);

return stream;
}

Expand Down Expand Up @@ -620,7 +564,7 @@ public override long Length
public override long Position
{
get { return this.position; }
set { this.position = value ; }
set { this.position = value; }
}

protected override void Dispose(bool disposing)
Expand Down