diff --git a/ArgusTransfer.Tests/ArgusTransfer.Tests.csproj b/ArgusTransfer.Tests/ArgusTransfer.Tests.csproj index f0f5d0f..5ba1b23 100644 --- a/ArgusTransfer.Tests/ArgusTransfer.Tests.csproj +++ b/ArgusTransfer.Tests/ArgusTransfer.Tests.csproj @@ -21,7 +21,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/ArgusTransfer/ArgusTransfer.csproj b/ArgusTransfer/ArgusTransfer.csproj index 34397cb..66ad7b5 100644 --- a/ArgusTransfer/ArgusTransfer.csproj +++ b/ArgusTransfer/ArgusTransfer.csproj @@ -2,7 +2,7 @@ net10.0 - 1.2.1 + 1.3.0 14.0 Sam Gerené Sam Gerené @@ -23,7 +23,36 @@ argus-transfer-ico.png pipe routing argus protocol - [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 disable disable diff --git a/CHANGELOG.md b/CHANGELOG.md index b3e7510..5b9f40b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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)). @@ -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)). @@ -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