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  }