github.com/aavshr/aws-sdk-go@v1.41.3/private/protocol/query/unmarshal_error.go (about) 1 package query 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 // UnmarshalErrorHandler is a name request handler to unmarshal request errors 13 var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalError", Fn: UnmarshalError} 14 15 type xmlErrorResponse struct { 16 Code string `xml:"Error>Code"` 17 Message string `xml:"Error>Message"` 18 RequestID string `xml:"RequestId"` 19 } 20 21 type xmlResponseError struct { 22 xmlErrorResponse 23 } 24 25 func (e *xmlResponseError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 26 const svcUnavailableTagName = "ServiceUnavailableException" 27 const errorResponseTagName = "ErrorResponse" 28 29 switch start.Name.Local { 30 case svcUnavailableTagName: 31 e.Code = svcUnavailableTagName 32 e.Message = "service is unavailable" 33 return d.Skip() 34 35 case errorResponseTagName: 36 return d.DecodeElement(&e.xmlErrorResponse, &start) 37 38 default: 39 return fmt.Errorf("unknown error response tag, %v", start) 40 } 41 } 42 43 // UnmarshalError unmarshals an error response for an AWS Query service. 44 func UnmarshalError(r *request.Request) { 45 defer r.HTTPResponse.Body.Close() 46 47 var respErr xmlResponseError 48 err := xmlutil.UnmarshalXMLError(&respErr, r.HTTPResponse.Body) 49 if err != nil { 50 r.Error = awserr.NewRequestFailure( 51 awserr.New(request.ErrCodeSerialization, 52 "failed to unmarshal error message", err), 53 r.HTTPResponse.StatusCode, 54 r.RequestID, 55 ) 56 return 57 } 58 59 reqID := respErr.RequestID 60 if len(reqID) == 0 { 61 reqID = r.RequestID 62 } 63 64 r.Error = awserr.NewRequestFailure( 65 awserr.New(respErr.Code, respErr.Message, nil), 66 r.HTTPResponse.StatusCode, 67 reqID, 68 ) 69 }