feat: convert grpc errors to http status codes (#1997)
* feat: convert grpc errors to http status codes * chore: circuit break include unimplemented grpc error * chore: add reference link in comments
This commit is contained in:
55
rest/internal/errcode/grpc.go
Normal file
55
rest/internal/errcode/grpc.go
Normal file
@@ -0,0 +1,55 @@
|
||||
package errcode
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
// CodeFromGrpcError converts the gRPC error to an HTTP status code.
|
||||
// See: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
|
||||
func CodeFromGrpcError(err error) int {
|
||||
code := status.Code(err)
|
||||
switch code {
|
||||
case codes.OK:
|
||||
return http.StatusOK
|
||||
case codes.InvalidArgument, codes.FailedPrecondition, codes.OutOfRange:
|
||||
return http.StatusBadRequest
|
||||
case codes.Unauthenticated:
|
||||
return http.StatusUnauthorized
|
||||
case codes.PermissionDenied:
|
||||
return http.StatusForbidden
|
||||
case codes.NotFound:
|
||||
return http.StatusNotFound
|
||||
case codes.Canceled:
|
||||
return http.StatusRequestTimeout
|
||||
case codes.AlreadyExists, codes.Aborted:
|
||||
return http.StatusConflict
|
||||
case codes.ResourceExhausted:
|
||||
return http.StatusTooManyRequests
|
||||
case codes.Internal, codes.DataLoss, codes.Unknown:
|
||||
return http.StatusInternalServerError
|
||||
case codes.Unimplemented:
|
||||
return http.StatusNotImplemented
|
||||
case codes.Unavailable:
|
||||
return http.StatusServiceUnavailable
|
||||
case codes.DeadlineExceeded:
|
||||
return http.StatusGatewayTimeout
|
||||
}
|
||||
|
||||
return http.StatusInternalServerError
|
||||
}
|
||||
|
||||
// IsGrpcError checks if the error is a gRPC error.
|
||||
func IsGrpcError(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
_, ok := err.(interface {
|
||||
GRPCStatus() *status.Status
|
||||
})
|
||||
|
||||
return ok
|
||||
}
|
||||
Reference in New Issue
Block a user