github.com/akamai/AkamaiOPEN-edgegrid-golang/v5@v5.0.0/pkg/edgeworkers/errors.go (about) 1 package edgeworkers 2 3 import ( 4 "encoding/json" 5 "errors" 6 "fmt" 7 "io/ioutil" 8 "net/http" 9 ) 10 11 type ( 12 // Error is an edgeworkers error implementation 13 // For details on possible error types, refer to: https://techdocs.akamai.com/edgeworkers/reference/api-errors 14 Error struct { 15 Type string `json:"type,omitempty"` 16 Title string `json:"title,omitempty"` 17 Detail string `json:"detail,omitempty"` 18 Instance string `json:"instance,omitempty"` 19 Status int `json:"status,omitempty"` 20 ErrorCode string `json:"errorCode,omitempty"` 21 Method string `json:"method,omitempty"` 22 ServerIP string `json:"serverIp,omitempty"` 23 ClientIP string `json:"clientIp,omitempty"` 24 RequestID string `json:"requestId,omitempty"` 25 RequestTime string `json:"requestTime,omitempty"` 26 AuthzRealm string `json:"authzRealm,omitempty"` 27 AdditionalDetail Additional `json:"additionalDetail,omitempty"` 28 } 29 30 // Additional holds request_id for edgekv errors 31 Additional struct { 32 RequestID string `json:"requestId,omitempty"` 33 } 34 ) 35 36 const ( 37 errorCodeNotFound = "EKV_9000" 38 errorCodeVersionIsBeingDeactivated = "EW1031" 39 errorCodeVersionAlreadyDeactivated = "EW1032" 40 ) 41 42 var ( 43 // ErrNotFound is returned when edgeKV resource does not exist 44 ErrNotFound = errors.New("specified edgeKV resource does not exist") 45 // ErrVersionBeingDeactivated is returned when edgeworkers version is currently being deactivated 46 ErrVersionBeingDeactivated = errors.New("version is being deactivated") 47 // ErrVersionAlreadyDeactivated is returned when edgeworkers version is already deactivated 48 ErrVersionAlreadyDeactivated = errors.New("version is already deactivated") 49 ) 50 51 // Error parses an error from the response 52 func (e *edgeworkers) Error(r *http.Response) error { 53 var result Error 54 var body []byte 55 body, err := ioutil.ReadAll(r.Body) 56 if err != nil { 57 e.Log(r.Request.Context()).Errorf("reading error response body: %s", err) 58 result.Status = r.StatusCode 59 result.Title = "Failed to read error body" 60 result.Detail = err.Error() 61 return &result 62 } 63 64 if err := json.Unmarshal(body, &result); err != nil { 65 e.Log(r.Request.Context()).Errorf("could not unmarshal API error: %s", err) 66 result.Title = string(body) 67 result.Status = r.StatusCode 68 } 69 return &result 70 } 71 72 func (e *Error) Error() string { 73 msg, err := json.MarshalIndent(e, "", "\t") 74 if err != nil { 75 return fmt.Sprintf("error marshaling API error: %s", err) 76 } 77 return fmt.Sprintf("API error: \n%s", msg) 78 } 79 80 // Is handles error comparisons 81 func (e *Error) Is(target error) bool { 82 if errors.Is(target, ErrNotFound) { 83 return e.Status == http.StatusNotFound && e.ErrorCode == errorCodeNotFound 84 } 85 if errors.Is(target, ErrVersionBeingDeactivated) { 86 return e.ErrorCode == errorCodeVersionIsBeingDeactivated 87 } 88 if errors.Is(target, ErrVersionAlreadyDeactivated) { 89 return e.ErrorCode == errorCodeVersionAlreadyDeactivated 90 } 91 92 var t *Error 93 if !errors.As(target, &t) { 94 return false 95 } 96 97 if e == t { 98 return true 99 } 100 101 if e.Status != t.Status { 102 return false 103 } 104 105 return e.Error() == t.Error() 106 }