Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
2 changes: 1 addition & 1 deletion ArgusTransfer.Tests/ArgusTransfer.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.10.1" />
<PackageReference Include="NUnit" Version="5.0.0" />
<PackageReference Include="NUnit.Console" Version="3.22.0" />
<PackageReference Include="NUnit3TestAdapter" Version="6.3.0">
<PackageReference Include="NUnit3TestAdapter" Version="6.3.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
Expand Down
33 changes: 31 additions & 2 deletions ArgusTransfer/ArgusTransfer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Version>1.2.1</Version>
<Version>1.3.0</Version>
<LangVersion>14.0</LangVersion>
<Company>Sam Geren茅</Company>
<Authors>Sam Geren茅</Authors>
Expand All @@ -23,7 +23,36 @@
<PackageIcon>argus-transfer-ico.png</PackageIcon>
<PackageTags>pipe routing argus protocol</PackageTags>
<PackageReleaseNotes>
[Fix] default pipe ACL also grants the service-running account FullControl so subsequent pipe instances can be created (Authenticated Users alone lack CreateNewInstance, which broke the host loop after the first connection)
[Add] ArgusProblemDetails: structured error responses in the style of RFC 7807 Problem Details; #29
[Add] ArgusRetryPolicy: optional automatic retry of transient named pipe failures in ArgusClient; #30
[Add] Global exception handling middleware, ArgusExceptionHandlerMiddleware; #31
[Add] Content-Encoding support for compressed request and response bodies (gzip); #34
[Add] Authorization header convention for process identity; #35
[Add] Built-in authentication middleware with pluggable handlers; #36
[Add] ArgusPipeHostOptions.MaxRequestHeaderSize: a limit on the size of the header block; #64
[Add] ArgusPipeHostOptions.RequestReadTimeout and MaxConcurrentConnections: a request read timeout and a connection limit for the pipe host; #65
[Add] ArgusClient.MaxResponseBodySize: an optional maximum response body size on the client; #76
[Add] ArgusPipeHostOptions.ResponseWriteTimeout, so a client that does not read its response cannot hold a connection; #85
[Change] Behavior change: ArgusPipeHostOptions validates its values when they are set, so an invalid limit, timeout or PipeName fails at startup with an exception that names the option; use 0 for no body size limit and Timeout.InfiniteTimeSpan for no timeout; #67
[Change] Behavior change: the host answers only request-format violations with 400, through ArgusProtocolException; other failures are server faults; #63
[Change] Behavior change: routes are percent-encoded on the wire and decoded by the host, so a client and a host of different versions disagree on a route that contains %; header names and values are validated; #69
[Change] Behavior change: route templates are validated at registration, so a mistyped template fails at startup instead of never matching; #73
[Change] Behavior change: the response serializer is negotiated from the Accept header, and a new ArgusRequest no longer sets Accept: text/plain; without an Accept header the host uses its default serializer; #75
[Change] Behavior change: the host's built-in 400, 406 and 503 responses are problem details (application/problem+json) instead of plain text; #77
[Change] Behavior change: the protocol version in request and status lines is validated; anything other than ARGUS/1.0 is rejected; #81
[Change] Route templates are parsed and middleware pipelines composed once, instead of for every request; #74
[Change] ArgusClient.SendAsync leaves the caller's request unchanged and validates it; #79
[Change] Documented why IArgusClient is IDisposable and what ArgusClient.Dispose does; #82
[Change] The sample project demonstrates the current feature set and is tested end to end; #57
[Update] Microsoft.Extensions.DependencyInjection, Microsoft.Extensions.Hosting.Abstractions and Microsoft.Extensions.Logging.Abstractions to version 10.0.12
[Fix] Byte-safe message framing for non-ASCII and binary bodies; #33
[Fix] A pipeline that completes without a response is answered with a generic 500 instead of a closed connection; #62
[Fix] The client reads the response while writing the request, so an early rejection by the host does not deadlock; #68
[Fix] The pipe accept loop keeps running after an unexpected exception; #70
[Fix] Shutdown resources are disposed only after all requests have finished; #71
[Fix] AddArgusModules can no longer scan the wrong assembly; #72
[Fix] A null query parameter value is written as an empty value; #78
[Fix] ArgusLoggingMiddleware logs a completion entry when the pipeline throws; #80
</PackageReleaseNotes>
<Nullable>disable</Nullable>
<ImplicitUsings>disable</ImplicitUsings>
Expand Down
17 changes: 10 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

## [Unreleased]

## [1.3.0] - 2026-10-11

### Added

- `ArgusProblemDetails`: a structured error response format in the style of RFC 7807 Problem Details ([#29](https://github.com/samgerene/ArgusTransfer/issues/29)).
Expand All @@ -22,14 +24,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
### Changed

- **Behavior change:** `ArgusPipeHostOptions` validates its values when they are set. A host configured with a zero or negative limit, a request timeout shorter than one millisecond, a negative `ShutdownDrainTimeout`, a timeout longer than about 49.7 days or an empty `PipeName` now fails at startup with an exception that names the option, instead of failing later. A negative `MaxRequestBodySize` is rejected; use `0` for no limit. Use `Timeout.InfiniteTimeSpan` for no timeout ([#67](https://github.com/samgerene/ArgusTransfer/issues/67)).
- The host answers only request-format violations with 400, through `ArgusProtocolException`; other failures are server faults ([#63](https://github.com/samgerene/ArgusTransfer/issues/63)).
- Routes are percent-encoded on the wire, and header names and values are validated ([#69](https://github.com/samgerene/ArgusTransfer/issues/69)).
- Route templates are validated at registration, so a mistyped template fails at startup ([#73](https://github.com/samgerene/ArgusTransfer/issues/73)).
- **Behavior change:** The host answers only request-format violations with 400, through `ArgusProtocolException`; other failures are server faults ([#63](https://github.com/samgerene/ArgusTransfer/issues/63)).
- **Behavior change:** Routes are percent-encoded on the wire and decoded by the host, so a client and a host of different versions disagree on a route that contains `%`. Header names and values are validated ([#69](https://github.com/samgerene/ArgusTransfer/issues/69)).
- **Behavior change:** Route templates are validated at registration, so a mistyped template fails at startup instead of never matching ([#73](https://github.com/samgerene/ArgusTransfer/issues/73)).
- Route templates are parsed and middleware pipelines composed once, instead of for every request ([#74](https://github.com/samgerene/ArgusTransfer/issues/74)).
- The response serializer is negotiated from the `Accept` header ([#75](https://github.com/samgerene/ArgusTransfer/issues/75)).
- The host's built-in 400, 406 and 503 responses are problem details ([#77](https://github.com/samgerene/ArgusTransfer/issues/77)).
- **Behavior change:** The response serializer is negotiated from the `Accept` header, and a new `ArgusRequest` no longer sets `Accept: text/plain`; without an `Accept` header the host uses its default serializer ([#75](https://github.com/samgerene/ArgusTransfer/issues/75)).
- **Behavior change:** The host's built-in 400, 406 and 503 responses are problem details (`application/problem+json`) instead of plain text ([#77](https://github.com/samgerene/ArgusTransfer/issues/77)).
- `ArgusClient.SendAsync` leaves the caller's request unchanged and validates it ([#79](https://github.com/samgerene/ArgusTransfer/issues/79)).
- The protocol version in request and status lines is validated ([#81](https://github.com/samgerene/ArgusTransfer/issues/81)).
- **Behavior change:** The protocol version in request and status lines is validated; anything other than `ARGUS/1.0` is rejected ([#81](https://github.com/samgerene/ArgusTransfer/issues/81)).
- Documented why `IArgusClient` is `IDisposable` and what `ArgusClient.Dispose` does ([#82](https://github.com/samgerene/ArgusTransfer/issues/82)).
- The README is restructured into a landing page with a verified quick start ([#61](https://github.com/samgerene/ArgusTransfer/issues/61)).
- The sample project demonstrates the current feature set: JSON with a `Content-Type`, problem details for invalid input (a malformed body returns 400 instead of 500), the exception handler, authentication, a retry policy and compression. The tests run it end to end ([#57](https://github.com/samgerene/ArgusTransfer/issues/57)).
Expand Down Expand Up @@ -130,7 +132,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

- Initial version.

[Unreleased]: https://github.com/samgerene/ArgusTransfer/compare/1.2.1...development
[Unreleased]: https://github.com/samgerene/ArgusTransfer/compare/1.3.0...development
[1.3.0]: https://github.com/samgerene/ArgusTransfer/compare/1.2.1...1.3.0
[1.2.1]: https://github.com/samgerene/ArgusTransfer/compare/1.2.0...1.2.1
[1.2.0]: https://github.com/samgerene/ArgusTransfer/compare/1.1.0...1.2.0
[1.1.0]: https://github.com/samgerene/ArgusTransfer/compare/1.0.2...1.1.0
Expand Down
Loading