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); }
/// <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; }
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); }
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); }