github.com/aavshr/aws-sdk-go@v1.41.3/service/simpledb/unmarshall_error.go (about) 1 package simpledb 2 3 import ( 4 "encoding/xml" 5 "io" 6 "io/ioutil" 7 "strings" 8 9 "github.com/aavshr/aws-sdk-go/aws/awserr" 10 "github.com/aavshr/aws-sdk-go/aws/request" 11 "github.com/aavshr/aws-sdk-go/private/protocol/xml/xmlutil" 12 ) 13 14 type xmlErrorDetail struct { 15 Code string `xml:"Code"` 16 Message string `xml:"Message"` 17 } 18 type xmlErrorMessage struct { 19 XMLName xml.Name `xml:"Response"` 20 Errors []xmlErrorDetail `xml:"Errors>Error"` 21 RequestID string `xml:"RequestID"` 22 } 23 24 type xmlErrorResponse struct { 25 Code string 26 Message string 27 RequestID string 28 OtherErrors []xmlErrorDetail 29 } 30 31 func (r *xmlErrorResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 32 var errResp xmlErrorMessage 33 if err := d.DecodeElement(&errResp, &start); err != nil { 34 return err 35 } 36 37 r.RequestID = errResp.RequestID 38 if len(errResp.Errors) == 0 { 39 r.Code = "MissingError" 40 r.Message = "missing error code in SimpleDB XML error response" 41 } else { 42 r.Code = errResp.Errors[0].Code 43 r.Message = errResp.Errors[0].Message 44 r.OtherErrors = errResp.Errors[1:] 45 } 46 47 return nil 48 } 49 50 func unmarshalError(r *request.Request) { 51 defer r.HTTPResponse.Body.Close() 52 defer io.Copy(ioutil.Discard, r.HTTPResponse.Body) 53 54 if r.HTTPResponse.ContentLength == int64(0) { 55 // No body, use status code to generate an awserr.Error 56 r.Error = awserr.NewRequestFailure( 57 awserr.New(strings.Replace(r.HTTPResponse.Status, " ", "", -1), r.HTTPResponse.Status, nil), 58 r.HTTPResponse.StatusCode, 59 r.RequestID, 60 ) 61 return 62 } 63 64 var errResp xmlErrorResponse 65 err := xmlutil.UnmarshalXMLError(&errResp, r.HTTPResponse.Body) 66 if err != nil { 67 r.Error = awserr.NewRequestFailure( 68 awserr.New(request.ErrCodeSerialization, "failed to unmarshal error message", err), 69 r.HTTPResponse.StatusCode, 70 r.RequestID, 71 ) 72 return 73 } 74 75 var otherErrs []error 76 for _, e := range errResp.OtherErrors { 77 otherErrs = append(otherErrs, awserr.New(e.Code, e.Message, nil)) 78 } 79 80 // If there are multiple error codes, return only the first as the 81 // aws.Error interface only supports one error code. 82 r.Error = awserr.NewRequestFailure( 83 awserr.NewBatchError(errResp.Code, errResp.Message, otherErrs), 84 r.HTTPResponse.StatusCode, 85 errResp.RequestID, 86 ) 87 }