< Summary

Information
Class: IceRpc.RequestContext.RequestContextMiddleware
Assembly: IceRpc.RequestContext
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.RequestContext/RequestContextMiddleware.cs
Tag: 275_13775359185
Line coverage
100%
Covered lines: 18
Uncovered lines: 0
Coverable lines: 18
Total lines: 42
Line coverage: 100%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
Method coverage
100%
Covered methods: 2
Total methods: 2
Method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
DispatchAsync(...)100%66100%

File(s)

/home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.RequestContext/RequestContextMiddleware.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3using IceRpc.Features;
 4using System.Buffers;
 5using ZeroC.Slice;
 6
 7namespace IceRpc.RequestContext;
 8
 9/// <summary>Represents a middleware that decodes request context fields into request context features.</summary>
 10/// <remarks>Both the ice protocol and the icerpc protocol can transmit request context fields with requests; while
 11/// icerpc can transmit all request fields, ice can only transmit request context fields and idempotent fields.
 12/// </remarks>
 13public class RequestContextMiddleware : IDispatcher
 14{
 15    private readonly IDispatcher _next;
 16
 17    /// <summary>Constructs a request context middleware.</summary>
 18    /// <param name="next">The next dispatcher in the dispatch pipeline.</param>
 1819    public RequestContextMiddleware(IDispatcher next) => _next = next;
 20
 21    /// <inheritdoc/>
 22    public ValueTask<OutgoingResponse> DispatchAsync(IncomingRequest request, CancellationToken cancellationToken)
 8523    {
 24        // Decode Context from Fields and set corresponding feature.
 8525        if (request.Fields.TryGetValue(RequestFieldKey.Context, out ReadOnlySequence<byte> value))
 1326        {
 1327            var decoder = new SliceDecoder(
 1328                value,
 1329                request.Protocol == Protocol.Ice ? SliceEncoding.Slice1 : SliceEncoding.Slice2);
 30
 1331            Dictionary<string, string> context = decoder.DecodeDictionary(
 1332                size => new Dictionary<string, string>(size),
 1333                keyDecodeFunc: (ref SliceDecoder decoder) => decoder.DecodeString(),
 2634                valueDecodeFunc: (ref SliceDecoder decoder) => decoder.DecodeString());
 1335            if (context.Count > 0)
 1336            {
 1337                request.Features = request.Features.With<IRequestContextFeature>(new RequestContextFeature(context));
 1338            }
 1339        }
 8540        return _next.DispatchAsync(request, cancellationToken);
 8541    }
 42}