2022-12-08 13:05:19 -03:00

62 lines
1.9 KiB
Go

// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package proxy
import (
"errors"
"fmt"
"github.com/bufbuild/connect-go"
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
"github.com/sourcegraph/jsonrpc2"
)
func ConvertError(err error) error {
if err == nil {
return nil
}
return categorizeRPCError(err)
}
func categorizeRPCError(err error) *connect.Error {
if err == nil {
return nil
}
if rpcErr := new(jsonrpc2.Error); errors.As(err, &rpcErr) {
switch rpcErr.Code {
case 400:
return connect.NewError(connect.CodeInvalidArgument, fmt.Errorf(rpcErr.Message))
// components/gitpod-protocol/src/messaging/error.ts
case 401:
return connect.NewError(connect.CodePermissionDenied, fmt.Errorf(rpcErr.Message))
// components/gitpod-protocol/src/messaging/error.ts
case 403:
return connect.NewError(connect.CodePermissionDenied, fmt.Errorf(rpcErr.Message))
// components/gitpod-protocol/src/messaging/error.ts
case 404:
return connect.NewError(connect.CodeNotFound, fmt.Errorf(rpcErr.Message))
// components/gitpod-protocol/src/messaging/error.ts
case 409:
return connect.NewError(connect.CodeAlreadyExists, fmt.Errorf(rpcErr.Message))
// components/gitpod-messagebus/src/jsonrpc-server.ts#47
case -32603:
return connect.NewError(connect.CodeInternal, fmt.Errorf(rpcErr.Message))
case 470:
return connect.NewError(connect.CodePermissionDenied, fmt.Errorf(rpcErr.Message))
default:
return connect.NewError(connect.CodeInternal, fmt.Errorf(rpcErr.Message))
}
}
if handshakeErr := new(protocol.ErrBadHandshake); errors.As(err, &handshakeErr) {
return connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("Failed to establish caller identity"))
}
return connect.NewError(connect.CodeInternal, err)
}