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  }