internal void ProcessHandlerError(Exception ex, string method)
        {
            if (ex is RpcException rpcException)
            {
                Log.RpcConnectionError(_logger, rpcException.StatusCode, ex);

                // There are two sources of metadata entries on the server-side:
                // 1. serverCallContext.ResponseTrailers
                // 2. trailers in RpcException thrown by user code in server side handler.
                // As metadata allows duplicate keys, the logical thing to do is
                // to just merge trailers from RpcException into serverCallContext.ResponseTrailers.
                foreach (var entry in rpcException.Trailers)
                {
                    ResponseTrailers.Add(entry);
                }

                _status = rpcException.Status;
            }
            else
            {
                Log.ErrorExecutingServiceMethod(_logger, method, ex);

                var message = ErrorMessageHelper.BuildErrorMessage("Exception was thrown by handler.", ex, ServiceOptions.EnableDetailedErrors);
                _status = new Status(StatusCode.Unknown, message);
            }

            HttpContext.Response.ConsolidateTrailers(this);
        }
Esempio n. 2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="GrpcAgentResult"/> class that is considered unsuccessful.
        /// </summary>
        /// <param name="rex">The <see cref="RpcException"/>.</param>
        /// <param name="request">The gRPC request value.</param>
        public GrpcAgentResult(RpcException rex, IMessage?request)
        {
            Exception        = Check.NotNull(rex, nameof(rex));
            Status           = Exception.Status;
            ErrorMessage     = Exception.Status.Detail;
            ResponseTrailers = Exception.Trailers;
            Request          = request;

            if (ResponseTrailers.Count > 0)
            {
                var t = ResponseTrailers.Where(x => x.Key == GrpcConsts.ErrorTypeHeaderName).SingleOrDefault();
                if (System.Enum.TryParse <ErrorType>(t.Value, out var et))
                {
                    ErrorType = et;
                }
            }

            IsSuccess = false;
        }
Esempio n. 3
0
        public override int GetHashCode()
        {
            int hash = 1;

            if (TraceId != 0UL)
            {
                hash ^= TraceId.GetHashCode();
            }
            if (messagePieceCase_ == MessagePieceOneofCase.RequestHeaders)
            {
                hash ^= RequestHeaders.GetHashCode();
            }
            if (messagePieceCase_ == MessagePieceOneofCase.RequestBodyChunk)
            {
                hash ^= RequestBodyChunk.GetHashCode();
            }
            if (messagePieceCase_ == MessagePieceOneofCase.RequestTrailers)
            {
                hash ^= RequestTrailers.GetHashCode();
            }
            if (messagePieceCase_ == MessagePieceOneofCase.ResponseHeaders)
            {
                hash ^= ResponseHeaders.GetHashCode();
            }
            if (messagePieceCase_ == MessagePieceOneofCase.ResponseBodyChunk)
            {
                hash ^= ResponseBodyChunk.GetHashCode();
            }
            if (messagePieceCase_ == MessagePieceOneofCase.ResponseTrailers)
            {
                hash ^= ResponseTrailers.GetHashCode();
            }
            hash ^= (int)messagePieceCase_;
            if (_unknownFields != null)
            {
                hash ^= _unknownFields.GetHashCode();
            }
            return(hash);
        }
Esempio n. 4
0
        public void MergeFrom(HttpStreamedTraceSegment other)
        {
            if (other == null)
            {
                return;
            }
            if (other.TraceId != 0UL)
            {
                TraceId = other.TraceId;
            }
            switch (other.MessagePieceCase)
            {
            case MessagePieceOneofCase.RequestHeaders:
                if (RequestHeaders == null)
                {
                    RequestHeaders = new global::Envoy.Api.V2.Core.HeaderMap();
                }
                RequestHeaders.MergeFrom(other.RequestHeaders);
                break;

            case MessagePieceOneofCase.RequestBodyChunk:
                if (RequestBodyChunk == null)
                {
                    RequestBodyChunk = new global::Envoy.Data.Tap.V2Alpha.Body();
                }
                RequestBodyChunk.MergeFrom(other.RequestBodyChunk);
                break;

            case MessagePieceOneofCase.RequestTrailers:
                if (RequestTrailers == null)
                {
                    RequestTrailers = new global::Envoy.Api.V2.Core.HeaderMap();
                }
                RequestTrailers.MergeFrom(other.RequestTrailers);
                break;

            case MessagePieceOneofCase.ResponseHeaders:
                if (ResponseHeaders == null)
                {
                    ResponseHeaders = new global::Envoy.Api.V2.Core.HeaderMap();
                }
                ResponseHeaders.MergeFrom(other.ResponseHeaders);
                break;

            case MessagePieceOneofCase.ResponseBodyChunk:
                if (ResponseBodyChunk == null)
                {
                    ResponseBodyChunk = new global::Envoy.Data.Tap.V2Alpha.Body();
                }
                ResponseBodyChunk.MergeFrom(other.ResponseBodyChunk);
                break;

            case MessagePieceOneofCase.ResponseTrailers:
                if (ResponseTrailers == null)
                {
                    ResponseTrailers = new global::Envoy.Api.V2.Core.HeaderMap();
                }
                ResponseTrailers.MergeFrom(other.ResponseTrailers);
                break;
            }

            _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
        }