unmarshal_error.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package route53
  2. import (
  3. "bytes"
  4. "encoding/xml"
  5. "io/ioutil"
  6. "github.com/aws/aws-sdk-go/aws/awserr"
  7. "github.com/aws/aws-sdk-go/aws/request"
  8. "github.com/aws/aws-sdk-go/private/protocol/restxml"
  9. )
  10. type baseXMLErrorResponse struct {
  11. XMLName xml.Name
  12. }
  13. type standardXMLErrorResponse struct {
  14. XMLName xml.Name `xml:"ErrorResponse"`
  15. Code string `xml:"Error>Code"`
  16. Message string `xml:"Error>Message"`
  17. RequestID string `xml:"RequestId"`
  18. }
  19. type invalidChangeBatchXMLErrorResponse struct {
  20. XMLName xml.Name `xml:"InvalidChangeBatch"`
  21. Messages []string `xml:"Messages>Message"`
  22. }
  23. func unmarshalChangeResourceRecordSetsError(r *request.Request) {
  24. defer r.HTTPResponse.Body.Close()
  25. responseBody, err := ioutil.ReadAll(r.HTTPResponse.Body)
  26. if err != nil {
  27. r.Error = awserr.New("SerializationError", "failed to read Route53 XML error response", err)
  28. return
  29. }
  30. baseError := &baseXMLErrorResponse{}
  31. if err := xml.Unmarshal(responseBody, baseError); err != nil {
  32. r.Error = awserr.New("SerializationError", "failed to decode Route53 XML error response", err)
  33. return
  34. }
  35. switch baseError.XMLName.Local {
  36. case "InvalidChangeBatch":
  37. unmarshalInvalidChangeBatchError(r, responseBody)
  38. default:
  39. r.HTTPResponse.Body = ioutil.NopCloser(bytes.NewReader(responseBody))
  40. restxml.UnmarshalError(r)
  41. }
  42. }
  43. func unmarshalInvalidChangeBatchError(r *request.Request, requestBody []byte) {
  44. resp := &invalidChangeBatchXMLErrorResponse{}
  45. err := xml.Unmarshal(requestBody, resp)
  46. if err != nil {
  47. r.Error = awserr.New("SerializationError", "failed to decode query XML error response", err)
  48. return
  49. }
  50. const errorCode = "InvalidChangeBatch"
  51. errors := []error{}
  52. for _, msg := range resp.Messages {
  53. errors = append(errors, awserr.New(errorCode, msg, nil))
  54. }
  55. r.Error = awserr.NewRequestFailure(
  56. awserr.NewBatchError(errorCode, "ChangeBatch errors occurred", errors),
  57. r.HTTPResponse.StatusCode,
  58. r.RequestID,
  59. )
  60. }