-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patherror.go
More file actions
66 lines (55 loc) · 1.2 KB
/
error.go
File metadata and controls
66 lines (55 loc) · 1.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package sidecar
import (
"errors"
"net/http"
"strconv"
"github.com/agentio/sidecar/codes"
)
type Error struct {
err error
code codes.Code
}
func NewError(err error, code codes.Code) *Error {
return &Error{
err: err, code: code,
}
}
func (s Error) Error() string {
return s.err.Error()
}
func (s Error) Code() codes.Code {
return s.code
}
func (s Error) Unwrap() error {
return s.err
}
func ErrorCode(err error) int {
if err == nil {
return int(codes.OK)
}
code := codes.Internal
if e, ok := err.(Error); ok {
code = e.Code()
}
return int(code)
}
func WriteTrailer(w http.ResponseWriter, err error) {
if err == nil {
w.Header().Set("Trailer:Grpc-Status", strconv.Itoa(0))
return
}
w.Header().Set("Trailer:Grpc-Status", strconv.Itoa(ErrorCode(err)))
w.Header().Set("Trailer:Grpc-Message", err.Error())
}
func ErrorForTrailer(trailer http.Header) error {
status := trailer.Get("Grpc-Status")
if status == "0" || status == "" {
return nil
}
code, _ := strconv.Atoi(status)
message := trailer.Get("Grpc-Message")
return NewError(errors.New(message), codes.Code(code))
}
func ErrorForCode(code codes.Code) error {
return NewError(errors.New(codes.Name(code)), codes.Code(code))
}