servicetalk grpc错误代码Map

f8rj6qna  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(292)

我们已经实施了 StreamingHttpServiceFilter 它对每个请求执行身份验证。
在身份验证失败时,我们使用以下代码返回401 unauthorized error:

private StreamingHttpResponse createUnauthorizedResponse(final StreamingHttpResponseFactory responseFactory) {
        return responseFactory.unauthorized();
    }

当过滤器返回一个错误时,在客户端我们得到以下消息
grpcstatus{code=internal,cause=null,description='http status code:401 unauthorized invalid content type:null headers:nettyh2headerstohttpheaders[transfer encoding:]'}
如您所见,grpcstatus code=INTERNAL ,这意味着客户端需要解析 description ,并找出错误代码。
在准备来自筛选器的响应时,是否可以添加任何其他元数据,以便可以删除代码 UNAUTHENTICATED 或者是否有任何客户端util可以读取描述并转换为http状态码?

vqlkdk9b

vqlkdk9b1#

grpc协议通常不太关注http响应状态码 200 OK . 其他状态代码将Map到 INTERNAL grpc代码。相反,它依赖于 grpc-status 以及 grpc-message 作为http/2响应消息的尾部(或者在没有有效负载主体的情况下作为头)出现。参见grpc over http2 doc中的回复部分。
当您处于http级别并编写 StreamingHttpServiceFilter ,您负责根据grpc协议生成响应。最小的React是 Trailers-Only 并包含 HTTP-Status Content-Type Status [Status-Message] *Custom-Metadata .
对于所描述的用例,手动生成适当的响应应该很容易。
另一种方法是 GrpcStatusException 从grpc级别:从服务端点或从grpc筛选器。然后servicetalk将把这个异常Map到一个适当的http/2响应,其中包含所有必需的头字段。

// Throws GrpcStatusException:
throw new GrpcStatus(GrpcStatusCode.UNAUTHENTICATED, null, "Your message for the client")
        .asException();

但是,在您的情况下,从中传输身份验证信息可能会有额外的复杂性 StreamingHttpServiceFilter 液位至grpc过滤器 AsyncContext . 可能不值得。

相关问题