Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/public-api-server/pkg/proxy/errors.go
2500 views
1
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package proxy
6
7
import (
8
"context"
9
"errors"
10
"fmt"
11
12
"github.com/bufbuild/connect-go"
13
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
14
"github.com/sourcegraph/jsonrpc2"
15
)
16
17
func ConvertError(err error) error {
18
if err == nil {
19
return nil
20
}
21
22
return categorizeRPCError(err)
23
}
24
25
func categorizeRPCError(err error) *connect.Error {
26
if err == nil {
27
return nil
28
}
29
30
if rpcErr := new(jsonrpc2.Error); errors.As(err, &rpcErr) {
31
switch rpcErr.Code {
32
case 400:
33
return connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("%s", rpcErr.Message))
34
// components/gitpod-protocol/src/messaging/error.ts
35
case 401:
36
return connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("%s", rpcErr.Message))
37
// components/gitpod-protocol/src/messaging/error.ts
38
case 403:
39
return connect.NewError(connect.CodePermissionDenied, fmt.Errorf("%s", rpcErr.Message))
40
// components/gitpod-protocol/src/messaging/error.ts
41
case 404:
42
return connect.NewError(connect.CodeNotFound, fmt.Errorf("%s", rpcErr.Message))
43
// components/gitpod-protocol/src/messaging/error.ts
44
case 409:
45
return connect.NewError(connect.CodeAlreadyExists, fmt.Errorf("%s", rpcErr.Message))
46
case 412:
47
return connect.NewError(connect.CodeFailedPrecondition, fmt.Errorf("%s", rpcErr.Message))
48
case 429:
49
return connect.NewError(connect.CodeResourceExhausted, fmt.Errorf("%s", rpcErr.Message))
50
case 470:
51
return connect.NewError(connect.CodePermissionDenied, fmt.Errorf("%s", rpcErr.Message))
52
case -32603:
53
return connect.NewError(connect.CodeInternal, fmt.Errorf("%s", rpcErr.Message))
54
}
55
// components/gitpod-protocol/src/messaging/error.ts - user errors
56
if rpcErr.Code >= 400 && rpcErr.Code < 500 {
57
return connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("%s", rpcErr.Message))
58
}
59
return connect.NewError(connect.CodeInternal, fmt.Errorf("%s", rpcErr.Message))
60
}
61
62
if errors.Is(err, context.Canceled) {
63
return connect.NewError(connect.CodeDeadlineExceeded, fmt.Errorf("%s", "Request timed out"))
64
}
65
66
if handshakeErr := new(protocol.ErrBadHandshake); errors.As(err, &handshakeErr) {
67
return connect.NewError(connect.CodeUnauthenticated, fmt.Errorf("%s", "Failed to establish caller identity"))
68
}
69
70
return connect.NewError(connect.CodeInternal, err)
71
}
72
73