Skip to content

Commit 9952c6b

Browse files
authored
[release/7.0] Add default error response to gRPC transcoding (#43768)
* [release/7.0] Add default error response to gRPC transcoding * Fix * Change error to status * Update
1 parent b1c5e98 commit 9952c6b

File tree

9 files changed

+15
-47
lines changed

9 files changed

+15
-47
lines changed

src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonRequestHelpers.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
using Google.Protobuf;
1111
using Google.Protobuf.Reflection;
1212
using Grpc.Core;
13-
using Grpc.Gateway.Runtime;
1413
using Grpc.Shared;
1514
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;
1615
using Microsoft.AspNetCore.Http;
@@ -96,9 +95,8 @@ public static async ValueTask SendErrorResponse(HttpResponse response, Encoding
9695
response.ContentType = MediaType.ReplaceEncoding("application/json", encoding);
9796
}
9897

99-
var e = new Error
98+
var e = new Google.Rpc.Status
10099
{
101-
Error_ = status.Detail,
102100
Message = status.Detail,
103101
Code = (int)status.StatusCode
104102
};

src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Protos/errors.proto

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Microsoft.AspNetCore.Grpc.JsonTranscoding.csproj

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<Description>HTTP API for gRPC ASP.NET Core</Description>
44
<PackageTags>gRPC RPC HTTP/2 REST</PackageTags>
@@ -27,11 +27,8 @@
2727
<Compile Include="..\Shared\HttpRoutePatternParser.cs" Link="Internal\Shared\HttpRoutePatternParser.cs" />
2828
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" LinkBase="Internal\Shared" />
2929

30-
<Protobuf Include="Internal\Protos\errors.proto" Access="Internal" />
31-
3230
<Reference Include="Google.Api.CommonProtos" />
3331
<Reference Include="Google.Protobuf" />
3432
<Reference Include="Grpc.AspNetCore.Server" />
35-
<Reference Include="Grpc.Tools" PrivateAssets="All" />
3633
</ItemGroup>
3734
</Project>

src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcJsonTranscodingDescriptionProvider.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ private static ApiDescription CreateApiDescription(RouteEndpoint routeEndpoint,
6565
{
6666
// Swagger uses this to group endpoints together.
6767
// Group methods together using the service name.
68-
["controller"] = methodDescriptor.Service.FullName
68+
["controller"] = methodDescriptor.Service.Name
6969
},
7070
EndpointMetadata = routeEndpoint.Metadata.ToList()
7171
};
@@ -77,6 +77,12 @@ private static ApiDescription CreateApiDescription(RouteEndpoint routeEndpoint,
7777
ModelMetadata = new GrpcModelMetadata(ModelMetadataIdentity.ForType(methodDescriptor.OutputType.ClrType)),
7878
StatusCode = 200
7979
});
80+
apiDescription.SupportedResponseTypes.Add(new ApiResponseType
81+
{
82+
ApiResponseFormats = { new ApiResponseFormat { MediaType = "application/json" } },
83+
ModelMetadata = new GrpcModelMetadata(ModelMetadataIdentity.ForType(typeof(Google.Rpc.Status))),
84+
IsDefaultResponse = true
85+
});
8086
var explorerSettings = routeEndpoint.Metadata.GetMetadata<ApiExplorerSettingsAttribute>();
8187
if (explorerSettings != null)
8288
{

src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Microsoft.AspNetCore.Grpc.Swagger.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<Description>Swagger for gRPC ASP.NET Core</Description>
44
<PackageTags>gRPC RPC HTTP/2 REST Swagger OpenAPI</PackageTags>

src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ServerStreamingServerCallHandlerTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ public async Task HandleCallAsync_MessageThenError_MessageThenErrorReturned()
106106
var line2 = await ReadLineAsync(pipe.Reader).DefaultTimeout();
107107
using var responseJson2 = JsonDocument.Parse(line2!);
108108
Assert.Equal("Exception was thrown by handler.", responseJson2.RootElement.GetProperty("message").GetString());
109-
Assert.Equal("Exception was thrown by handler.", responseJson2.RootElement.GetProperty("error").GetString());
110109
Assert.Equal(2, responseJson2.RootElement.GetProperty("code").GetInt32());
111110

112111
await callTask.DefaultTimeout();
@@ -140,7 +139,6 @@ public async Task HandleCallAsync_ErrorWithDetailedErrors_DetailedErrorResponse(
140139
var line = await ReadLineAsync(pipe.Reader).DefaultTimeout();
141140
using var responseJson = JsonDocument.Parse(line!);
142141
Assert.Equal("Exception was thrown by handler. Exception: Exception!", responseJson.RootElement.GetProperty("message").GetString());
143-
Assert.Equal("Exception was thrown by handler. Exception: Exception!", responseJson.RootElement.GetProperty("error").GetString());
144142
Assert.Equal(2, responseJson.RootElement.GetProperty("code").GetInt32());
145143

146144
await callTask.DefaultTimeout();

src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/UnaryServerCallHandlerTests.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,6 @@ public async Task HandleCallAsync_MalformedRequestBody_BadRequestReturned(string
445445
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
446446
using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
447447
Assert.Equal(expectedError, responseJson.RootElement.GetProperty("message").GetString());
448-
Assert.Equal(expectedError, responseJson.RootElement.GetProperty("error").GetString());
449448
Assert.Equal((int)StatusCode.InvalidArgument, responseJson.RootElement.GetProperty("code").GetInt32());
450449
}
451450

@@ -484,7 +483,6 @@ public async Task HandleCallAsync_MalformedRequestBody_RepeatedBody_BadRequestRe
484483
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
485484
using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
486485
Assert.Equal(expectedError, responseJson.RootElement.GetProperty("message").GetString());
487-
Assert.Equal(expectedError, responseJson.RootElement.GetProperty("error").GetString());
488486
Assert.Equal((int)StatusCode.InvalidArgument, responseJson.RootElement.GetProperty("code").GetInt32());
489487
}
490488

@@ -515,7 +513,6 @@ public async Task HandleCallAsync_BadContentType_BadRequestReturned(string conte
515513
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
516514
using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
517515
Assert.Equal(expectedError, responseJson.RootElement.GetProperty("message").GetString());
518-
Assert.Equal(expectedError, responseJson.RootElement.GetProperty("error").GetString());
519516
Assert.Equal((int)StatusCode.InvalidArgument, responseJson.RootElement.GetProperty("code").GetInt32());
520517
}
521518

@@ -540,7 +537,6 @@ public async Task HandleCallAsync_RpcExceptionReturned_StatusReturned()
540537
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
541538
using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
542539
Assert.Equal("Detail!", responseJson.RootElement.GetProperty("message").GetString());
543-
Assert.Equal("Detail!", responseJson.RootElement.GetProperty("error").GetString());
544540
Assert.Equal((int)StatusCode.Unauthenticated, responseJson.RootElement.GetProperty("code").GetInt32());
545541
}
546542

@@ -565,7 +561,6 @@ public async Task HandleCallAsync_RpcExceptionThrown_StatusReturned()
565561
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
566562
using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
567563
Assert.Equal("Detail!", responseJson.RootElement.GetProperty("message").GetString());
568-
Assert.Equal("Detail!", responseJson.RootElement.GetProperty("error").GetString());
569564
Assert.Equal((int)StatusCode.Unauthenticated, responseJson.RootElement.GetProperty("code").GetInt32());
570565
}
571566

@@ -591,7 +586,6 @@ public async Task HandleCallAsync_StatusSet_StatusReturned()
591586
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
592587
using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
593588
Assert.Equal(@"Detail!", responseJson.RootElement.GetProperty("message").GetString());
594-
Assert.Equal(@"Detail!", responseJson.RootElement.GetProperty("error").GetString());
595589
Assert.Equal((int)StatusCode.Unauthenticated, responseJson.RootElement.GetProperty("code").GetInt32());
596590
}
597591

@@ -1000,7 +994,6 @@ public async Task HandleCallAsync_ExceptionThrown_StatusReturned()
1000994
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
1001995
using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
1002996
Assert.Equal("Exception was thrown by handler.", responseJson.RootElement.GetProperty("message").GetString());
1003-
Assert.Equal("Exception was thrown by handler.", responseJson.RootElement.GetProperty("error").GetString());
1004997
Assert.Equal((int)StatusCode.Unknown, responseJson.RootElement.GetProperty("code").GetInt32());
1005998
}
1006999

src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.Swagger.Tests/GrpcSwaggerServiceExtensionsTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ public void AddGrpcSwagger_GrpcServiceRegistered_ReturnSwaggerWithGrpcOperation(
4545
Assert.Single(swagger.Paths);
4646

4747
var path = swagger.Paths["/v1/greeter/{name}"];
48-
Assert.True(path.Operations.ContainsKey(OperationType.Get));
48+
Assert.True(path.Operations.TryGetValue(OperationType.Get, out var operation));
49+
Assert.Equal("Success", operation.Responses["200"].Description);
50+
Assert.Equal("Error", operation.Responses["default"].Description);
4951
}
5052

5153
[Fact]

src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.Swagger.Tests/XmlComments/XmlDocumentationIntegrationTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public void ServiceDescription_ModelHasXmlDocs_UseXmlDocs()
3030
var swagger = GetOpenApiDocument<XmlDocServiceWithComments>();
3131

3232
// Assert
33-
Assert.Equal("xmldoc.XmlDoc", swagger.Tags[0].Name);
33+
Assert.Equal("XmlDoc", swagger.Tags[0].Name);
3434
Assert.Equal("XmlDocServiceWithComments XML comment!", swagger.Tags[0].Description);
3535
}
3636

@@ -41,7 +41,7 @@ public void ServiceDescription_ModelDoesntHaveXmlDocs_UseProtoDocs()
4141
var swagger = GetOpenApiDocument<XmlDocService>();
4242

4343
// Assert
44-
Assert.Equal("xmldoc.XmlDoc", swagger.Tags[0].Name);
44+
Assert.Equal("XmlDoc", swagger.Tags[0].Name);
4545
Assert.Equal("XmlDoc!", swagger.Tags[0].Description);
4646
}
4747

0 commit comments

Comments
 (0)