not use internal protobuf to transfer error

Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
Василий Толстов 2020-10-08 13:18:23 +03:00
parent 4cfa421f97
commit a41e085d18
7 changed files with 2 additions and 412 deletions

View File

@ -6,7 +6,6 @@ import (
"net/http" "net/http"
"os" "os"
pb "github.com/unistack-org/micro-server-grpc/internal/errors"
"github.com/unistack-org/micro/v3/errors" "github.com/unistack-org/micro/v3/errors"
"google.golang.org/grpc/codes" "google.golang.org/grpc/codes"
) )
@ -64,8 +63,6 @@ func microError(err error) codes.Code {
switch verr := err.(type) { switch verr := err.(type) {
case *errors.Error: case *errors.Error:
ec = verr.Code ec = verr.Code
case *pb.Error:
ec = verr.Code
} }
if code, ok := errMapping[ec]; ok { if code, ok := errMapping[ec]; ok {
@ -74,16 +71,3 @@ func microError(err error) codes.Code {
return codes.Unknown return codes.Unknown
} }
func pbError(err error) *pb.Error {
switch verr := err.(type) {
case nil:
return nil
case *errors.Error:
return &pb.Error{Id: verr.Id, Code: verr.Code, Detail: verr.Detail, Status: verr.Status}
case *pb.Error:
return verr
default:
return &pb.Error{Code: 500, Detail: err.Error()}
}
}

View File

@ -1,17 +0,0 @@
package grpc_test
import (
"testing"
pb "github.com/unistack-org/micro-server-grpc/internal/errors"
"google.golang.org/protobuf/types/known/anypb"
)
func TestErrors(t *testing.T) {
any, err := anypb.New(&pb.Error{})
if err != nil {
t.Fatal(err)
}
t.Logf("srv any: %#+v\n", any)
}

View File

@ -1,3 +0,0 @@
package grpc
//go:generate protoc -I./internal/errors -I. --go_out=paths=source_relative:./internal/errors internal/errors/server_errors.proto

29
grpc.go
View File

@ -15,7 +15,6 @@ import (
"time" "time"
oldproto "github.com/golang/protobuf/proto" oldproto "github.com/golang/protobuf/proto"
pberr "github.com/unistack-org/micro-server-grpc/internal/errors"
"github.com/unistack-org/micro/v3/broker" "github.com/unistack-org/micro/v3/broker"
"github.com/unistack-org/micro/v3/errors" "github.com/unistack-org/micro/v3/errors"
"github.com/unistack-org/micro/v3/logger" "github.com/unistack-org/micro/v3/logger"
@ -456,22 +455,10 @@ func (g *grpcServer) processRequest(stream grpc.ServerStream, service *service,
if appErr := fn(ctx, r, replyv.Interface()); appErr != nil { if appErr := fn(ctx, r, replyv.Interface()); appErr != nil {
var errStatus *status.Status var errStatus *status.Status
switch verr := appErr.(type) { switch verr := appErr.(type) {
case *pberr.Error:
perr := pbError(verr)
statusCode = microError(verr)
statusDesc = verr.Error()
errStatus, err = status.New(statusCode, statusDesc).WithDetails(perr)
if err != nil {
return err
}
case *errors.Error: case *errors.Error:
perr := pbError(verr)
statusCode = microError(verr) statusCode = microError(verr)
statusDesc = verr.Error() statusDesc = verr.Error()
errStatus, err = status.New(statusCode, statusDesc).WithDetails(perr) errStatus = status.New(statusCode, statusDesc)
if err != nil {
return err
}
case oldproto.Message: case oldproto.Message:
// user defined error that proto based we can attach it to grpc status // user defined error that proto based we can attach it to grpc status
statusCode = convertCode(appErr) statusCode = convertCode(appErr)
@ -587,22 +574,10 @@ func (g *grpcServer) processStream(stream grpc.ServerStream, service *service, m
var err error var err error
var errStatus *status.Status var errStatus *status.Status
switch verr := appErr.(type) { switch verr := appErr.(type) {
case *pberr.Error:
perr := pbError(verr)
statusCode = microError(verr)
statusDesc = verr.Error()
errStatus, err = status.New(statusCode, statusDesc).WithDetails(perr)
if err != nil {
return err
}
case *errors.Error: case *errors.Error:
perr := pbError(verr)
statusCode = microError(verr) statusCode = microError(verr)
statusDesc = verr.Error() statusDesc = verr.Error()
errStatus, err = status.New(statusCode, statusDesc).WithDetails(perr) errStatus = status.New(statusCode, statusDesc)
if err != nil {
return err
}
case oldproto.Message: case oldproto.Message:
// user defined error that proto based we can attach it to grpc status // user defined error that proto based we can attach it to grpc status
statusCode = convertCode(appErr) statusCode = convertCode(appErr)

View File

@ -1,159 +0,0 @@
package errors
import (
"fmt"
)
func (e *Error) Error() string {
return fmt.Sprintf(`{"id":"%s","code":%d,"detail":"%s","status":"%s"}`, e.Id, e.Code, e.Detail, e.Status)
}
// New generates a custom error.
func New(id, detail string, code int32) error {
return &Error{
Id: id,
Code: code,
Detail: detail,
// Status: http.StatusText(int(code)),
}
}
// BadRequest generates a 400 error.
func BadRequest(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 400,
Detail: fmt.Sprintf(format, a...),
// Status: http.StatusText(400),
}
}
// Unauthorized generates a 401 error.
func Unauthorized(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 401,
Detail: fmt.Sprintf(format, a...),
// Status: http.StatusText(401),
}
}
// Forbidden generates a 403 error.
func Forbidden(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 403,
Detail: fmt.Sprintf(format, a...),
// Status: http.StatusText(403),
}
}
// NotFound generates a 404 error.
func NotFound(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 404,
Detail: fmt.Sprintf(format, a...),
// Status: http.StatusText(404),
}
}
// MethodNotAllowed generates a 405 error.
func MethodNotAllowed(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 405,
Detail: fmt.Sprintf(format, a...),
//Status: http.StatusText(405),
}
}
// Timeout generates a 408 error.
func Timeout(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 408,
Detail: fmt.Sprintf(format, a...),
//Status: http.StatusText(408),
}
}
// Conflict generates a 409 error.
func Conflict(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 409,
Detail: fmt.Sprintf(format, a...),
//Status: http.StatusText(409),
}
}
// InternalServerError generates a 500 error.
func InternalServerError(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 500,
Detail: fmt.Sprintf(format, a...),
//Status: http.StatusText(500),
}
}
// NotImplemented generates a 501 error
func NotImplemented(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 501,
Detail: fmt.Sprintf(format, a...),
//Status: http.StatusText(501),
}
}
// BadGateway generates a 502 error
func BadGateway(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 502,
Detail: fmt.Sprintf(format, a...),
// Status: http.StatusText(502),
}
}
// ServiceUnavailable generates a 503 error
func ServiceUnavailable(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 503,
Detail: fmt.Sprintf(format, a...),
//Status: http.StatusText(503),
}
}
// GatewayTimeout generates a 504 error
func GatewayTimeout(id, format string, a ...interface{}) error {
return &Error{
Id: id,
Code: 504,
Detail: fmt.Sprintf(format, a...),
//Status: http.StatusText(504),
}
}
// Equal tries to compare errors
func Equal(err1 error, err2 error) bool {
verr1, ok1 := err1.(*Error)
verr2, ok2 := err2.(*Error)
if ok1 != ok2 {
return false
}
if !ok1 {
return err1 == err2
}
if verr1.Code != verr2.Code {
return false
}
return true
}

View File

@ -1,179 +0,0 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.25.0-devel
// protoc v3.6.1
// source: server_errors.proto
package errors
import (
proto "github.com/golang/protobuf/proto"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4
type Error struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
Detail string `protobuf:"bytes,3,opt,name=detail,proto3" json:"detail,omitempty"`
Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"`
}
func (x *Error) Reset() {
*x = Error{}
if protoimpl.UnsafeEnabled {
mi := &file_server_errors_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Error) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Error) ProtoMessage() {}
func (x *Error) ProtoReflect() protoreflect.Message {
mi := &file_server_errors_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Error.ProtoReflect.Descriptor instead.
func (*Error) Descriptor() ([]byte, []int) {
return file_server_errors_proto_rawDescGZIP(), []int{0}
}
func (x *Error) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (x *Error) GetCode() int32 {
if x != nil {
return x.Code
}
return 0
}
func (x *Error) GetDetail() string {
if x != nil {
return x.Detail
}
return ""
}
func (x *Error) GetStatus() string {
if x != nil {
return x.Status
}
return ""
}
var File_server_errors_proto protoreflect.FileDescriptor
var file_server_errors_proto_rawDesc = []byte{
0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x6f, 0x72, 0x67, 0x2e, 0x75, 0x6e, 0x69, 0x73, 0x74,
0x61, 0x63, 0x6b, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73,
0x22, 0x5b, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a,
0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64,
0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x3b, 0x5a,
0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x75, 0x6e, 0x69, 0x73,
0x74, 0x61, 0x63, 0x6b, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x2d, 0x73,
0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
0x6e, 0x61, 0x6c, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x33,
}
var (
file_server_errors_proto_rawDescOnce sync.Once
file_server_errors_proto_rawDescData = file_server_errors_proto_rawDesc
)
func file_server_errors_proto_rawDescGZIP() []byte {
file_server_errors_proto_rawDescOnce.Do(func() {
file_server_errors_proto_rawDescData = protoimpl.X.CompressGZIP(file_server_errors_proto_rawDescData)
})
return file_server_errors_proto_rawDescData
}
var file_server_errors_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_server_errors_proto_goTypes = []interface{}{
(*Error)(nil), // 0: org.unistack.micro.errors.Error
}
var file_server_errors_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
0, // [0:0] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
func init() { file_server_errors_proto_init() }
func file_server_errors_proto_init() {
if File_server_errors_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_server_errors_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Error); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_server_errors_proto_rawDesc,
NumEnums: 0,
NumMessages: 1,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_server_errors_proto_goTypes,
DependencyIndexes: file_server_errors_proto_depIdxs,
MessageInfos: file_server_errors_proto_msgTypes,
}.Build()
File_server_errors_proto = out.File
file_server_errors_proto_rawDesc = nil
file_server_errors_proto_goTypes = nil
file_server_errors_proto_depIdxs = nil
}

View File

@ -1,11 +0,0 @@
syntax = "proto3";
option go_package = "github.com/unistack-org/micro-server-grpc/internal/errors";
package org.unistack.micro.errors;
message Error {
string id = 1;
int32 code = 2;
string detail = 3;
string status = 4;
};