From cf2084c7597c41afb09c5a89e0466cc6bd8bb4d4 Mon Sep 17 00:00:00 2001 From: Jacob Bednarz Date: Mon, 17 Oct 2022 13:11:20 +1100 Subject: [PATCH] cloudflare: update `RequestError` to expose `Messages` The messages field isn't really used broadly in the API as it was designed for informational feedback as opposed to errors, however, the page rules endpoint uses it to communicate validation failures. For these messages to be raised in other tools, namely the Terraform provider, it needs a dedicated field on the struct and to be included in the `Error()` method. Closes cloudflare/terraform-provider-cloudflare#1579 --- cloudflare.go | 4 ++-- errors.go | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/cloudflare.go b/cloudflare.go index 68576c025a..9219f72399 100644 --- a/cloudflare.go +++ b/cloudflare.go @@ -5,6 +5,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" "io/ioutil" @@ -16,8 +17,6 @@ import ( "strings" "time" - "errors" - "golang.org/x/time/rate" ) @@ -347,6 +346,7 @@ func (api *API) makeRequestWithAuthTypeAndHeadersComplete(ctx context.Context, m Errors: errBody.Errors, ErrorCodes: errCodes, ErrorMessages: errMsgs, + Messages: errBody.Messages, } switch resp.StatusCode { diff --git a/errors.go b/errors.go index 14e045474e..9b92d1dcaf 100644 --- a/errors.go +++ b/errors.go @@ -70,6 +70,9 @@ type Error struct { // ErrorMessages is a list of all the error codes. ErrorMessages []string + // Messages is a list of informational messages provided by the endpoint. + Messages []ResponseInfo + // RayID is the internal identifier for the request that was made. RayID string } @@ -90,7 +93,21 @@ func (e Error) Error() string { errMessages = append(errMessages, m) } - return errString + strings.Join(errMessages, ", ") + msgs := []string{} + for _, m := range e.Messages { + msgs = append(msgs, m.Message) + } + + errString += strings.Join(errMessages, ", ") + + // `Messages` is primarily used for additional validation failure notes in + // page rules. This shouldn't be used going forward but instead, use the + // error fields appropriately. + if len(msgs) > 0 { + errString += "\n" + strings.Join(msgs, " \n") + } + + return errString } // RequestError is for 4xx errors that we encounter not covered elsewhere @@ -119,6 +136,10 @@ func (e RequestError) InternalErrorCodeIs(code int) bool { return e.cloudflareError.InternalErrorCodeIs(code) } +func (e RequestError) Messages() []ResponseInfo { + return e.cloudflareError.Messages +} + func (e RequestError) RayID() string { return e.cloudflareError.RayID }