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