package gateway import ( "context" "net/http" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/segmentio/encoding/json" "google.golang.org/grpc" ) type errorBody struct { Err string `json:"error,omitempty"` } // customErrorHandler implements custom grpc error handler func customErrorHandler(ctx context.Context, _ *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, _ *http.Request, err error) { const fallback = `{"error": "failed to marshal error message"}` w.Header().Set("Content-type", marshaler.ContentType()) w.WriteHeader(runtime.HTTPStatusFromCode(grpc.Code(err))) jErr := json.NewEncoder(w).Encode(errorBody{ Err: grpc.ErrorDesc(err), }) if jErr != nil { w.Write([]byte(fallback)) } }