Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions PolyShim.Tests/Net50/HttpClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,74 @@ await httpClient.PatchAsync(

ex.CancellationToken.Should().Be(cancellationToken);
}

[Fact]
public async Task CopyToAsync_Test()
{
// Arrange
var cancellationToken = new CancellationToken();
Comment thread
Tyrrrz marked this conversation as resolved.
Resolved
using var content = new StringContent("Hello world!");
using var stream = new MemoryStream();

// Act
await content.CopyToAsync(stream, cancellationToken);
stream.Position = 0;

using var reader = new StreamReader(stream);
var result = await reader.ReadToEndAsync();

// Assert
result.Should().Be("Hello world!");
}

[Fact]
public async Task CopyToAsync_Cancellation_Test()
{
// Arrange
var cancellationToken = new CancellationToken(true);
using var content = new StringContent("Hello world!");
using var stream = new MemoryStream();

// Act & assert
var ex = await Assert.ThrowsAnyAsync<OperationCanceledException>(async () =>
await content.CopyToAsync(stream, cancellationToken)
);

ex.CancellationToken.Should().Be(cancellationToken);
}

[Fact]
public async Task CopyToAsync_WithTransportContext_Test()
{
// Arrange
var cancellationToken = new CancellationToken();
using var content = new StringContent("Hello world!");
using var stream = new MemoryStream();

// Act
await content.CopyToAsync(stream, context: null, cancellationToken);
stream.Position = 0;

using var reader = new StreamReader(stream);
var result = await reader.ReadToEndAsync();

// Assert
result.Should().Be("Hello world!");
}

[Fact]
public async Task CopyToAsync_WithTransportContext_Cancellation_Test()
{
// Arrange
var cancellationToken = new CancellationToken(true);
using var content = new StringContent("Hello world!");
using var stream = new MemoryStream();

// Act & assert
var ex = await Assert.ThrowsAnyAsync<OperationCanceledException>(async () =>
await content.CopyToAsync(stream, context: null, cancellationToken)
);

ex.CancellationToken.Should().Be(cancellationToken);
}
}
19 changes: 19 additions & 0 deletions PolyShim/Net50/HttpContent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#pragma warning disable CS0436

using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
Expand Down Expand Up @@ -39,6 +40,24 @@ public async Task<string> ReadAsStringAsync(CancellationToken cancellationToken
cancellationToken.ThrowIfCancellationRequested();
return await httpContent.ReadAsStringAsync().ConfigureAwait(false);
}

// https://learn.microsoft.com/dotnet/api/system.net.http.httpcontent.copytoasync#system-net-http-httpcontent-copytoasync(system-io-stream-system-threading-cancellationtoken)
public async Task CopyToAsync(Stream stream, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
await httpContent.CopyToAsync(stream).ConfigureAwait(false);
}

// https://learn.microsoft.com/dotnet/api/system.net.http.httpcontent.copytoasync#system-net-http-httpcontent-copytoasync(system-io-stream-system-net-transportcontext-system-threading-cancellationtoken)
public async Task CopyToAsync(
Stream stream,
TransportContext? context,
CancellationToken cancellationToken = default
)
{
cancellationToken.ThrowIfCancellationRequested();
await httpContent.CopyToAsync(stream, context).ConfigureAwait(false);
}
}
#endif
}
Expand Down
6 changes: 4 additions & 2 deletions Signatures.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Signatures

- **Total:** 601
- **Total:** 603
- **Types:** 119
- **Members:** 482
- **Members:** 484

___

Expand Down Expand Up @@ -247,6 +247,8 @@ ___
- [`Task<string> GetStringAsync(string, CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.net.http.httpclient.getstringasync#system-net-http-httpclient-getstringasync(system-string-system-threading-cancellationtoken)) <sup><sub>.NET 5.0</sub></sup>
- [`Task<string> GetStringAsync(Uri, CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.net.http.httpclient.getstringasync#system-net-http-httpclient-getstringasync(system-uri-system-threading-cancellationtoken)) <sup><sub>.NET 5.0</sub></sup>
- `HttpContent`
- [`Task CopyToAsync(Stream, CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.net.http.httpcontent.copytoasync#system-net-http-httpcontent-copytoasync(system-io-stream-system-threading-cancellationtoken)) <sup><sub>.NET 5.0</sub></sup>
- [`Task CopyToAsync(Stream, TransportContext?, CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.net.http.httpcontent.copytoasync#system-net-http-httpcontent-copytoasync(system-io-stream-system-net-transportcontext-system-threading-cancellationtoken)) <sup><sub>.NET 5.0</sub></sup>
- [`Task<byte[]> ReadAsByteArrayAsync(CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.net.http.httpcontent.readasbytearrayasync#system-net-http-httpcontent-readasbytearrayasync(system-threading-cancellationtoken)) <sup><sub>.NET 5.0</sub></sup>
- [`Task<Stream> ReadAsStreamAsync(CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.net.http.httpcontent.readasstreamasync#system-net-http-httpcontent-readasstreamasync(system-threading-cancellationtoken)) <sup><sub>.NET 5.0</sub></sup>
- [`Task<string> ReadAsStringAsync(CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.net.http.httpcontent.readasstringasync#system-net-http-httpcontent-readasstringasync(system-threading-cancellationtoken)) <sup><sub>.NET 5.0</sub></sup>
Expand Down