Skip to content

Fspw 777#11

Open
MichalFrends1 wants to merge 5 commits into
mainfrom
FSPW-777
Open

Fspw 777#11
MichalFrends1 wants to merge 5 commits into
mainfrom
FSPW-777

Conversation

@MichalFrends1

@MichalFrends1 MichalFrends1 commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Please review my changes :)

  • Task version updated (x.x.0)
  • CHANGELOG.md updated
  • Solution builds
  • Warnings resolved (if possible)
  • Typos resolved
  • Tests cover new code
  • Description how to run tests locally added to README.md (if needed)
  • All tests pass locally

Summary by CodeRabbit

  • New Features

    • Added options for message size limits, connection reuse, retries, and configurable ACK acceptance.
    • Added ACK result details to response output, including code and error description.
    • Added optional file-based logging for sent messages, retries, errors, and rejected messages.
  • Bug Fixes

    • Improved handling of negative or invalid acknowledgements.
    • Added support for sending large messages and reconnecting after connection drops.
  • Tests

    • Expanded automated coverage for connection reuse, retries, logging, size limits, and ACK parsing.

@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@MichalFrends1, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 51 minutes and 47 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 94e561d5-eff2-43d1-a819-649a1c890f43

📥 Commits

Reviewing files that changed from the base of the PR and between fb8fe45 and 66f604d.

📒 Files selected for processing (1)
  • Frends.Mllp.Send/Frends.Mllp.Send.Tests/FunctionalTests.cs

Walkthrough

Version 1.5.0 adds message-size enforcement, TCP keep-alive connection caching (MemoryCache), configurable retry logic, HL7 ACK parsing/classification via AckParser, a MessageLogger for file-based event logging, and a ValidationHandler to Frends.Mllp.Send. New public enums, Options properties, and Result fields expose the features, with comprehensive unit and functional tests added.

Changes

Frends.Mllp.Send v1.5.0 Feature Set

Layer / File(s) Summary
Public enums, Options properties, and Result fields
Frends.Mllp.Send/Definitions/Enums.cs, Frends.Mllp.Send/Definitions/Options.cs, Frends.Mllp.Send/Definitions/Result.cs
Adds AckResultType and AcceptableAckCodes enums; extends Options with nine new properties for size cap, ACK filtering, keep-alive, retry, and logging; adds AckResultType, AckCodeValue, and AckErrorDescription to Result.
ACK parsing and rejection helpers
Frends.Mllp.Send/Helpers/AckParseResult.cs, Frends.Mllp.Send/Helpers/AckParser.cs, Frends.Mllp.Send/Helpers/AckRejectedException.cs, Frends.Mllp.Send/Helpers/SendOutcome.cs
Adds AckParseResult data container, AckParser using NHapi PipeParser/Terser for MSA-1/MSA-3 extraction and code classification, AckRejectedException for flow control, and SendOutcome as a pipeline result carrier.
ValidationHandler and MessageLogger helpers
Frends.Mllp.Send/Helpers/ValidationHandler.cs, Frends.Mllp.Send/Helpers/MessageLogger.cs
Adds ValidationHandler that aggregates DataAnnotations errors and throws ValidationException; adds MessageLogger with thread-safe file writing, sent/success/failure/retry/rejection event methods, message preview extraction, and HL7 message-type extraction.
Connection keep-alive caching
Frends.Mllp.Send/Helpers/CachedConnection.cs, Frends.Mllp.Send/MtlsMllpWrapper.cs, Frends.Mllp.Send/Frends.Mllp.Send.cs (cache fields), Frends.Mllp.Send/Frends.Mllp.Send.csproj
Adds CachedConnection wrapping MtlsMllpWrapper with a SemaphoreSlim lock; fixes MtlsMllpWrapper namespace; introduces static MemoryCache/CacheLock fields; bumps package version to 1.5.0 and adds System.Runtime.Caching dependency.
Core Send pipeline
Frends.Mllp.Send/Frends.Mllp.Send.cs
Refactors Send to enforce MaxMessageSize, initialize MessageLogger, and delegate to SendWithRetry (retry loop with AckRejectedException fast-path), SendWithWrapper (ACK/send-only dispatch with parser integration), and SendWithKeepAlive (cached-connection locking, IO-failure eviction, single retry).
Unit and functional tests
Frends.Mllp.Send.Tests/AckParserTests.cs, Frends.Mllp.Send.Tests/FunctionalTests.cs, Frends.Mllp.Send.Tests/Helpers.cs
Adds AckParserTests covering parsing, classification, and acceptability; refactors FunctionalTests with async teardown and cache-clearing; adds server helpers for multi-message and multi-connection flows; adds tests for keep-alive reuse, reconnection, size rejection, retry timing, negative ACK, large messages, and file logging.
Changelog
Frends.Mllp.Send/CHANGELOG.md
Documents all new v1.5.0 features.

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant Send
  participant MessageLogger
  participant SendWithRetry
  participant SendWithWrapper
  participant SendWithKeepAlive
  participant MtlsMllpWrapper
  participant AckParser

  Caller->>Send: Send(input, options, token)
  Send->>Send: compute byte size, check MaxMessageSize
  alt size exceeded
    Send->>MessageLogger: LogRejected(reason)
    Send-->>Caller: throw ArgumentException
  end
  Send->>MessageLogger: initialize session log
  Send->>SendWithRetry: loop up to RetryCount+1
  loop attempt
    alt KeepConnectionAlive=true
      SendWithRetry->>SendWithKeepAlive: send via cached CachedConnection
      SendWithKeepAlive->>MtlsMllpWrapper: SendAndReceiveAck / SendOnly
    else
      SendWithRetry->>SendWithWrapper: send via new wrapper
      SendWithWrapper->>MtlsMllpWrapper: SendAndReceiveAck / SendOnly
    end
    MtlsMllpWrapper-->>SendWithWrapper: ack string
    SendWithWrapper->>AckParser: Parse(ackString)
    AckParser-->>SendWithWrapper: AckParseResult
    SendWithWrapper->>AckParser: IsAcceptable(resultType, AcceptableAckCodes)
    alt unacceptable ACK
      SendWithWrapper-->>SendWithRetry: throw AckRejectedException
      SendWithRetry-->>Send: rethrow (no retry)
    else IO/socket error
      SendWithRetry->>MessageLogger: LogRetry(attempt, reason)
      SendWithRetry->>SendWithRetry: sleep RetryIntervalSeconds
    else success
      SendWithWrapper-->>SendWithRetry: SendOutcome
      SendWithRetry-->>Send: SendOutcome
    end
  end
  Send->>MessageLogger: LogSuccess / LogFailure
  Send-->>Caller: Result (AckResultType, AckCodeValue, AckErrorDescription)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • FrendsPlatform/Frends.Mllp#1: Touches the same Frends.Mllp.Send core send pipeline and MtlsMllpWrapper integration that this PR significantly extends.

Suggested reviewers

  • MatteoDelOmbra

🐰 A rabbit hops through the wire,
Counting ACKs as messages fly higher!
Keep-alive caches, retries galore,
Size limits guard the HL7 door.
Now logs tell tales of each send —
v1.5.0 has arrived, no end! 🎉

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title is a ticket-like identifier and does not describe the actual change set. Rename it to a concise summary of the main change, such as adding MLLP ACK handling, retries, and logging options.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch FSPW-777

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Frends.Mllp.Send/Frends.Mllp.Send.Tests/FunctionalTests.cs (1)

36-36: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Load certificate password from environment/.env instead of hardcoding.

Hardcoding _password = "password" in source violates the test-secret handling rule and makes secret rotation harder.

As per coding guidelines, tests should “Load secrets via dotenv”.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Frends.Mllp.Send/Frends.Mllp.Send.Tests/FunctionalTests.cs` at line 36, The
`_password` field in the FunctionalTests class is hardcoded with the literal
value "password", which violates security guidelines. Instead, load this
password from an environment variable or .env file using dotenv as per the
test-secret handling guidelines. Replace the hardcoded assignment with code that
reads the password from the environment at test initialization time, ensuring
the secret is not stored in source code.

Source: Coding guidelines

🧹 Nitpick comments (1)
Frends.Mllp.Send/Frends.Mllp.Send.Tests/AckParserTests.cs (1)

11-14: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Add coverage for CA / CE / CR ACK aliases.

AckParser.ClassifyAckCode maps CA/CE/CR too, but those paths are currently untested. Adding them here will protect the ACK mapping contract from regressions.

Suggested test-case additions
         [TestCase("AA", AckResultType.Accept)]
+        [TestCase("CA", AckResultType.Accept)]
         [TestCase("AE", AckResultType.Error)]
+        [TestCase("CE", AckResultType.Error)]
         [TestCase("AR", AckResultType.Reject)]
+        [TestCase("CR", AckResultType.Reject)]
         [TestCase("XX", AckResultType.Invalid)]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Frends.Mllp.Send/Frends.Mllp.Send.Tests/AckParserTests.cs` around lines 11 -
14, The test cases for AckParser.ClassifyAckCode are missing coverage for the
CA/CE/CR ACK aliases that the method handles. Add three additional [TestCase]
attributes to the test method in AckParserTests.cs: one for CA mapping to
AckResultType.Accept, one for CE mapping to AckResultType.Error, and one for CR
mapping to AckResultType.Reject. These additions will complete the test coverage
for all ACK code paths and prevent regressions in the ACK mapping contract.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Frends.Mllp.Send/Frends.Mllp.Send.Tests/FunctionalTests.cs`:
- Around line 871-877: The X509Certificate2 instance created in the serverCert
variable is not being disposed after use, which leaks unmanaged certificate
handles and is problematic during repeated test runs. Wrap the serverCert
certificate in a using statement to ensure it is properly disposed after the
SslStream authentication completes. Apply the same fix to the other TLS handler
location mentioned in the comment (around lines 940-947) where a similar
certificate is created and used in AuthenticateAsServerAsync or related TLS
operations.
- Around line 900-903: The bare catch blocks in the test helper methods (around
the catch block at lines 900-903 and the other instances at lines 925-927 and
984-987) are swallowing all exceptions indiscriminately, masking server-side
failures and creating false-positive tests. Replace these bare catch statements
with explicit exception handling that only catches expected exceptions like
OperationCanceledException, and allow all other exceptions to propagate through
_serverTask so they surface as test failures when the server encounters
unexpected errors.
- Around line 675-680: The test initializes and stops a stopwatch but never
asserts on the elapsed time, so it cannot verify that no retry delay occurred.
After the stopwatch.Stop() call, add an assertion that checks the elapsed time
is minimal (for example, using stopwatch.ElapsedMilliseconds to verify it
completes quickly without retry delays). This ensures the zero-retry test
properly validates that retry-delay logic does not regress.
- Line 510: The test is hanging or flapping because _serverTask is being awaited
without proper cancellation while keep-alive is enabled, causing the server
logic in SetupServerLogicMultiMessage to continue reading indefinitely on the
open socket. To fix this, ensure the server cancellation token is canceled
before or during the await of _serverTask in the keep-alive test, or add a
timeout to prevent the test from blocking indefinitely. This ensures that
SetupServerLogicMultiMessage stops reading when the test completes rather than
waiting for the socket to close naturally.

In `@Frends.Mllp.Send/Frends.Mllp.Send.Tests/Helpers.cs`:
- Around line 103-105: The calculation of targetBytes using int multiplication
sizeInMb * 1024 * 1024 can overflow for large inputs without clear error
reporting. Add parameter validation to ensure sizeInMb is within reasonable
bounds before the multiplication, then wrap the arithmetic in a checked block to
explicitly detect and handle overflow conditions. If overflow is detected or
sizeInMb exceeds the validated bounds, throw an appropriate exception with a
descriptive message to prevent silent failures and aid debugging.

In `@Frends.Mllp.Send/Frends.Mllp.Send/Definitions/Options.cs`:
- Around line 103-111: The documentation for the LogFilePath property states
that a default location is used when the path is unspecified, but the RequiredIf
validation attribute makes LogFilePath mandatory when EnableLogging is true.
Update the XML documentation summary for the LogFilePath property to clarify
that the path is required when logging is enabled, removing the reference to a
default location that does not actually exist when validation is enforced.

In `@Frends.Mllp.Send/Frends.Mllp.Send/Frends.Mllp.Send.cs`:
- Around line 295-299: The keep-alive wrapper cache key is not including
encoding information, which allows wrappers with different encodings to be
incorrectly reused for the same host/port combination. Include the encoding
value (obtained via GetEncoding(connection) or connection.EncodingInString) in
the cache key construction for the CreateWrapper method and any other related
caching logic (also at lines 352-353) to ensure that different encodings are
treated as separate cache entries and prevent incompatible wrapper reuse.
- Around line 283-287: The RemovedCallback lambda in the ConnectionCache is
skipping disposal of CachedConnection objects when RemovedReason equals Removed,
which causes resource leaks. In the RemovedCallback (around lines 283-287), the
condition `if (args.RemovedReason != CacheEntryRemovedReason.Removed)` prevents
disposal during explicit cache removal operations. Change the logic to dispose
CachedConnection when RemovedReason == Removed by inverting the condition or
removing the condition check entirely so that disposal happens for all cache
removal scenarios. Apply this same fix to the second occurrence at lines
333-346.
- Around line 138-140: The Thread.Sleep call in the retry logic blocks
uninterruptibly and does not respond to cancellation requests that arrive during
the wait period. Replace the
Thread.Sleep(TimeSpan.FromSeconds(options.RetryIntervalSeconds)) call with an
await-based cancellation-aware delay operation that passes the cancellation
token, allowing the wait to be interrupted immediately if cancellation is
requested rather than blocking until the sleep completes.

In `@Frends.Mllp.Send/Frends.Mllp.Send/Helpers/RequiredIfAttribute.cs`:
- Around line 18-21: The RequiredIfAttribute validation silently skips when the
dependentProperty name is invalid because GetProperty returns null and the
subsequent null-conditional operator hides this. Add a null check immediately
after the GetProperty call for the property variable in the RequiredIfAttribute
class and throw an appropriate exception if the property is not found, ensuring
that misspelled or invalid dependent property names fail fast and surface the
configuration error instead of silently bypassing validation.

---

Outside diff comments:
In `@Frends.Mllp.Send/Frends.Mllp.Send.Tests/FunctionalTests.cs`:
- Line 36: The `_password` field in the FunctionalTests class is hardcoded with
the literal value "password", which violates security guidelines. Instead, load
this password from an environment variable or .env file using dotenv as per the
test-secret handling guidelines. Replace the hardcoded assignment with code that
reads the password from the environment at test initialization time, ensuring
the secret is not stored in source code.

---

Nitpick comments:
In `@Frends.Mllp.Send/Frends.Mllp.Send.Tests/AckParserTests.cs`:
- Around line 11-14: The test cases for AckParser.ClassifyAckCode are missing
coverage for the CA/CE/CR ACK aliases that the method handles. Add three
additional [TestCase] attributes to the test method in AckParserTests.cs: one
for CA mapping to AckResultType.Accept, one for CE mapping to
AckResultType.Error, and one for CR mapping to AckResultType.Reject. These
additions will complete the test coverage for all ACK code paths and prevent
regressions in the ACK mapping contract.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e8fb4d7f-6d3b-464b-a9aa-af99406e93c2

📥 Commits

Reviewing files that changed from the base of the PR and between 52ad83f and 42e2847.

📒 Files selected for processing (19)
  • Frends.Mllp.Send/CHANGELOG.md
  • Frends.Mllp.Send/Frends.Mllp.Send.Tests/AckParserTests.cs
  • Frends.Mllp.Send/Frends.Mllp.Send.Tests/FunctionalTests.cs
  • Frends.Mllp.Send/Frends.Mllp.Send.Tests/Helpers.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Definitions/Enums.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Definitions/Options.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Definitions/Result.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Frends.Mllp.Send.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Frends.Mllp.Send.csproj
  • Frends.Mllp.Send/Frends.Mllp.Send/Helpers/AckParseResult.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Helpers/AckParser.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Helpers/AckRejectedException.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Helpers/CachedConnection.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Helpers/MessageLogger.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Helpers/RequiredIfAttribute.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Helpers/SendOutcome.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Helpers/ValidIpAddressAttribute.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/Helpers/ValidationHandler.cs
  • Frends.Mllp.Send/Frends.Mllp.Send/MtlsMllpWrapper.cs

Comment thread Frends.Mllp.Send/Frends.Mllp.Send.Tests/FunctionalTests.cs
Comment on lines +675 to +680
var stopwatch = Stopwatch.StartNew();
var result = Mllp.Send(input, connection, options, CancellationToken.None);
stopwatch.Stop();

Assert.That(result.Success, Is.False);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

The zero-retry test doesn’t currently verify “no retry delay.”

A stopwatch is started/stopped, but elapsed time is never asserted. This means the test can still pass even if retry-delay logic regresses.

Suggested assertion
         Assert.That(result.Success, Is.False);
+        Assert.That(stopwatch.Elapsed.TotalSeconds, Is.LessThan(4),
+            "RetryCount=0 should not incur RetryIntervalSeconds delay.");
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
var stopwatch = Stopwatch.StartNew();
var result = Mllp.Send(input, connection, options, CancellationToken.None);
stopwatch.Stop();
Assert.That(result.Success, Is.False);
}
var stopwatch = Stopwatch.StartNew();
var result = Mllp.Send(input, connection, options, CancellationToken.None);
stopwatch.Stop();
Assert.That(result.Success, Is.False);
Assert.That(stopwatch.Elapsed.TotalSeconds, Is.LessThan(4),
"RetryCount=0 should not incur RetryIntervalSeconds delay.");
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Frends.Mllp.Send/Frends.Mllp.Send.Tests/FunctionalTests.cs` around lines 675
- 680, The test initializes and stops a stopwatch but never asserts on the
elapsed time, so it cannot verify that no retry delay occurred. After the
stopwatch.Stop() call, add an assertion that checks the elapsed time is minimal
(for example, using stopwatch.ElapsedMilliseconds to verify it completes quickly
without retry delays). This ensures the zero-retry test properly validates that
retry-delay logic does not regress.

Comment thread Frends.Mllp.Send/Frends.Mllp.Send.Tests/FunctionalTests.cs Outdated
Comment thread Frends.Mllp.Send/Frends.Mllp.Send.Tests/FunctionalTests.cs Outdated
Comment thread Frends.Mllp.Send/Frends.Mllp.Send.Tests/Helpers.cs
Comment thread Frends.Mllp.Send/Frends.Mllp.Send/Definitions/Options.cs
Comment thread Frends.Mllp.Send/Frends.Mllp.Send/Frends.Mllp.Send.cs
Comment thread Frends.Mllp.Send/Frends.Mllp.Send/Frends.Mllp.Send.cs
Comment thread Frends.Mllp.Send/Frends.Mllp.Send/Frends.Mllp.Send.cs
Comment thread Frends.Mllp.Send/Frends.Mllp.Send/Helpers/RequiredIfAttribute.cs Outdated

namespace Frends.Mllp.Send.Helpers
{
internal sealed class ValidIpAddressAttribute : ValidationAttribute

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is it used anywhere?


namespace Frends.Mllp.Send.Helpers
{
internal sealed class RequiredIfAttribute : ValidationAttribute

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it used anywhere?

{
cancellationToken.ThrowIfCancellationRequested();

ValidateParameters(input, connection);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I dont see any validation attributes used - if none is used, remove this line and whole ValidationHandler, if its unused

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants