github.com/aavshr/aws-sdk-go@v1.41.3/service/route53/unmarshal_error.go (about) 1 package route53 2 3 import ( 4 "encoding/xml" 5 "fmt" 6 7 "github.com/aavshr/aws-sdk-go/aws/awserr" 8 "github.com/aavshr/aws-sdk-go/aws/request" 9 "github.com/aavshr/aws-sdk-go/private/protocol/xml/xmlutil" 10 ) 11 12 const errorRespTag = "ErrorResponse" 13 const invalidChangeTag = "InvalidChangeBatch" 14 15 type standardXMLErrorResponse struct { 16 Code string `xml:"Error>Code"` 17 Message string `xml:"Error>Message"` 18 RequestID string `xml:"RequestId"` 19 } 20 21 func (e standardXMLErrorResponse) FillCommon(c *xmlErrorResponse) { 22 c.Code = e.Code 23 c.Message = e.Message 24 c.RequestID = e.RequestID 25 } 26 27 type invalidChangeBatchXMLErrorResponse struct { 28 Messages []string `xml:"Messages>Message"` 29 RequestID string `xml:"RequestId"` 30 } 31 32 func (e invalidChangeBatchXMLErrorResponse) FillCommon(c *xmlErrorResponse) { 33 c.Code = invalidChangeTag 34 c.Message = "ChangeBatch errors occurred" 35 c.Messages = e.Messages 36 c.RequestID = e.RequestID 37 } 38 39 type xmlErrorResponse struct { 40 Code string 41 Message string 42 Messages []string 43 RequestID string 44 } 45 46 func (e *xmlErrorResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 47 type commonFiller interface { 48 FillCommon(*xmlErrorResponse) 49 } 50 51 var errResp commonFiller 52 switch start.Name.Local { 53 case errorRespTag: 54 errResp = &standardXMLErrorResponse{} 55 56 case invalidChangeTag: 57 errResp = &invalidChangeBatchXMLErrorResponse{} 58 59 default: 60 return fmt.Errorf("unknown error message, %v", start.Name.Local) 61 } 62 63 if err := d.DecodeElement(errResp, &start); err != nil { 64 return err 65 } 66 67 errResp.FillCommon(e) 68 return nil 69 } 70 71 func unmarshalChangeResourceRecordSetsError(r *request.Request) { 72 defer r.HTTPResponse.Body.Close() 73 74 var errResp xmlErrorResponse 75 err := xmlutil.UnmarshalXMLError(&errResp, r.HTTPResponse.Body) 76 if err != nil { 77 r.Error = awserr.NewRequestFailure( 78 awserr.New(request.ErrCodeSerialization, 79 "failed to unmarshal error message", err), 80 r.HTTPResponse.StatusCode, 81 r.RequestID, 82 ) 83 return 84 } 85 86 var baseErr awserr.Error 87 if len(errResp.Messages) != 0 { 88 var errs []error 89 for _, msg := range errResp.Messages { 90 errs = append(errs, awserr.New(invalidChangeTag, msg, nil)) 91 } 92 baseErr = awserr.NewBatchError(errResp.Code, errResp.Message, errs) 93 } else { 94 baseErr = awserr.New(errResp.Code, errResp.Message, nil) 95 } 96 97 reqID := errResp.RequestID 98 if len(reqID) == 0 { 99 reqID = r.RequestID 100 } 101 r.Error = awserr.NewRequestFailure( 102 baseErr, 103 r.HTTPResponse.StatusCode, 104 reqID, 105 ) 106 }