< Summary

Information
Class: Ice.Internal.ObserverMiddleware
Assembly: Ice
File(s): /_/csharp/src/Ice/Internal/ObserverMiddleware.cs
Tag: 91_21789722663
Line coverage
100%
Covered lines: 22
Uncovered lines: 0
Coverable lines: 22
Total lines: 73
Line coverage: 100%
Branch coverage
90%
Covered branches: 9
Total branches: 10
Branch coverage: 90%
Method coverage
100%
Covered methods: 3
Total methods: 3
Method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
dispatchAsync(...)100%22100%
performDispatchAsync()87.5%88100%
.ctor(...)100%11100%

File(s)

/_/csharp/src/Ice/Internal/ObserverMiddleware.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3#nullable enable
 4
 5using Ice.Instrumentation;
 6
 7namespace Ice.Internal;
 8
 9/// <summary>
 10/// A middleware that observes dispatches.
 11/// </summary>
 12internal sealed class ObserverMiddleware : Object
 13{
 14    private readonly Object _next;
 15    private readonly CommunicatorObserver _communicatorObserver;
 16
 17    public ValueTask<OutgoingResponse> dispatchAsync(IncomingRequest request)
 18    {
 119        return _communicatorObserver.getDispatchObserver(request.current, request.size) is DispatchObserver observer ?
 120            performDispatchAsync(observer) :
 121            _next.dispatchAsync(request);
 22
 23        async ValueTask<OutgoingResponse> performDispatchAsync(DispatchObserver observer)
 24        {
 125            observer.attach();
 26            try
 27            {
 28                OutgoingResponse response;
 29                try
 30                {
 131                    response = await _next.dispatchAsync(request).ConfigureAwait(false);
 132                }
 133                catch (System.Exception ex)
 34                {
 35                    // We need to marshal the exception into the response immediately to observe the response size.
 136                    response = request.current.createOutgoingResponse(ex);
 137                }
 38
 139                switch (response.replyStatus)
 40                {
 41                    case ReplyStatus.Ok:
 42                        // don't do anything
 43                        break;
 44
 45                    case ReplyStatus.UserException:
 146                        observer.userException();
 147                        break;
 48
 49                    default:
 150                        observer.failed(response.exceptionId ?? "");
 51                        break;
 52                }
 53
 154                if (request.current.requestId != 0)
 55                {
 156                    observer.reply(response.size);
 57                }
 58
 159                return response;
 60            }
 61            finally
 62            {
 163                observer.detach();
 64            }
 165        }
 66    }
 67
 168    internal ObserverMiddleware(Object next, CommunicatorObserver communicatorObserver)
 69    {
 170        _next = next;
 171        _communicatorObserver = communicatorObserver;
 172    }
 73}