Ejemplo n.º 1
0
        public static async Task WriteErrorToResponse(this IResponse httpRes, IRequest httpReq,
                                                      string contentType, string operationName, string errorMessage, Exception ex, int statusCode)
        {
            if (ex == null)
            {
                ex = new Exception(errorMessage);
            }

            var errorDto = ex.ToErrorResponse();

            httpRes.Dto = errorDto;
            HostContext.AppHost.OnExceptionTypeFilter(ex, errorDto.ResponseStatus);

            if (await HandleCustomErrorHandler(httpRes, httpReq, contentType, statusCode, errorDto, ex))
            {
                return;
            }

            if (!httpRes.HasStarted)
            {
                if ((httpRes.ContentType == null || httpRes.ContentType == MimeTypes.Html) &&
                    contentType != null && contentType != httpRes.ContentType)
                {
                    httpRes.ContentType = contentType;
                }
                if (HostContext.Config.AppendUtf8CharsetOnContentTypes.Contains(contentType))
                {
                    httpRes.ContentType += ContentFormat.Utf8Suffix;
                }

                var hold = httpRes.StatusDescription;
                var hasDefaultStatusDescription = hold == null || hold == "OK";

                httpRes.StatusCode = statusCode;

                httpRes.StatusDescription = hasDefaultStatusDescription
                    ? (errorMessage ?? HttpStatus.GetStatusDescription(statusCode))
                    : hold;

                httpRes.ApplyGlobalResponseHeaders();
            }

            var serializer = HostContext.ContentTypes.GetStreamSerializerAsync(contentType ?? httpRes.ContentType);

            if (serializer != null)
            {
                await serializer(httpReq, errorDto, httpRes.OutputStream);
            }

            httpRes.EndHttpHandlerRequest(skipHeaders: true);
        }
        public static Task WriteErrorToResponse(this IResponse httpRes, IRequest httpReq,
                                                string contentType, string operationName, string errorMessage, Exception ex, int statusCode)
        {
            if (ex == null)
            {
                ex = new Exception(errorMessage);
            }

            var errorDto = ex.ToErrorResponse();

            HostContext.AppHost.OnExceptionTypeFilter(ex, errorDto.ResponseStatus);

            if (HandleCustomErrorHandler(httpRes, httpReq, contentType, statusCode, errorDto))
            {
                return(TypeConstants.EmptyTask);
            }

            if ((httpRes.ContentType == null || httpRes.ContentType == MimeTypes.Html) &&
                contentType != null && contentType != httpRes.ContentType)
            {
                httpRes.ContentType = contentType;
            }
            if (HostContext.Config.AppendUtf8CharsetOnContentTypes.Contains(contentType))
            {
                httpRes.ContentType += ContentFormat.Utf8Suffix;
            }

            var hold = httpRes.StatusDescription;
            var hasDefaultStatusDescription = hold == null || hold == "OK";

            httpRes.StatusCode = statusCode;

            httpRes.StatusDescription = hasDefaultStatusDescription
                ? (errorMessage ?? HttpStatus.GetStatusDescription(statusCode))
                : hold;

            var serializer = HostContext.ContentTypes.GetResponseSerializer(contentType);

            serializer?.Invoke(httpReq, errorDto, httpRes);

            httpRes.EndHttpHandlerRequest(skipHeaders: true);

            return(TypeConstants.EmptyTask);
        }
Ejemplo n.º 3
0
        protected async Task WriteResponseHeadersAsync(IResponse httpRes, CallContext context)
        {
            var res = (GrpcResponse)httpRes;
            var nonSuccessStatus = res.StatusCode >= 300;

            if (!Feature.DisableResponseHeaders || nonSuccessStatus)
            {
                foreach (var header in Feature.IgnoreResponseHeaders)
                {
                    res.Headers.Remove(header);
                }

                if (res.Headers.Count > 0 || nonSuccessStatus)
                {
                    var headers = new global::Grpc.Core.Metadata();
                    if (nonSuccessStatus)
                    {
                        headers.Add(Keywords.HttpStatus, res.StatusCode.ToString());
                    }

                    foreach (var entry in res.Headers)
                    {
                        headers.Add(entry.Key, entry.Value);
                    }

                    if (nonSuccessStatus)
                    {
                        var status = res.Dto.GetResponseStatus();
                        if (status != null)
                        {
                            headers.Add(Keywords.GrpcResponseStatus,
                                        GrpcMarshaller <ResponseStatus> .Instance.Serializer(status));
                        }

                        var desc = status?.ErrorCode ?? res.StatusDescription ??
                                   status?.Message ?? HttpStatus.GetStatusDescription(res.StatusCode);
                        context.ServerCallContext.Status = feature.ToGrpcStatus?.Invoke(httpRes) ?? ToGrpcStatus(res.StatusCode, desc);
                    }

                    await context.ServerCallContext.WriteResponseHeadersAsync(headers);
                }
            }
        }
Ejemplo n.º 4
0
        public static async Task WriteErrorToResponse(this IResponse httpRes, IRequest httpReq,
                                                      string contentType, string operationName, string errorMessage, Exception ex, int statusCode)
        {
            if (ex == null)
            {
                ex = new Exception(errorMessage);
            }

            httpRes.Dto = HostContext.AppHost.CreateErrorResponse(ex, request: httpReq?.Dto);

            if (await HandleCustomErrorHandler(httpRes, httpReq, contentType, statusCode, httpRes.Dto, ex))
            {
                return;
            }

            var hostConfig = HostContext.Config;

            if (!httpRes.HasStarted)
            {
                if ((httpRes.ContentType == null || httpRes.ContentType == MimeTypes.Html) &&
                    contentType != null && contentType != httpRes.ContentType)
                {
                    httpRes.ContentType = contentType;
                }
                if (hostConfig.AppendUtf8CharsetOnContentTypes.Contains(contentType))
                {
                    httpRes.ContentType += ContentFormat.Utf8Suffix;
                }

                var hold = httpRes.StatusDescription;
                var hasDefaultStatusDescription = hold is null or "OK";

                httpRes.StatusCode = statusCode;

                httpRes.StatusDescription = hasDefaultStatusDescription
                    ? (errorMessage ?? HttpStatus.GetStatusDescription(statusCode))
                    : hold;

                httpRes.ApplyGlobalResponseHeaders();
            }

            var callback = httpReq.GetJsonpCallback();
            var doJsonp  = hostConfig.AllowJsonpRequests && !string.IsNullOrEmpty(callback);

            if (doJsonp)
            {
                httpRes.StatusCode = 200;
                await httpRes.OutputStream.WriteAsync(DataCache.CreateJsonpPrefix(callback));
            }

            var serializer = HostContext.ContentTypes.GetStreamSerializerAsync(contentType ?? httpRes.ContentType);

            if (serializer != null)
            {
                var jsconfig = hostConfig.AllowJsConfig ? httpReq?.QueryString[Keywords.JsConfig] : null;
                using (jsconfig != null ? JsConfig.CreateScope(jsconfig) : null)
                {
                    await serializer(httpReq, httpRes.Dto, httpRes.OutputStream);
                }
            }

            if (doJsonp)
            {
                await httpRes.OutputStream.WriteAsync(DataCache.JsonpSuffix);
            }

            httpRes.EndHttpHandlerRequest(skipHeaders: true);
        }