7 "github.com/aws/aws-sdk-go/aws/awserr"
8 "github.com/aws/aws-sdk-go/aws/request"
11 type xmlErrorResponse struct {
12 XMLName xml.Name `xml:"ErrorResponse"`
13 Code string `xml:"Error>Code"`
14 Message string `xml:"Error>Message"`
15 RequestID string `xml:"RequestId"`
18 type xmlServiceUnavailableResponse struct {
19 XMLName xml.Name `xml:"ServiceUnavailableException"`
22 // UnmarshalErrorHandler is a name request handler to unmarshal request errors
23 var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalError", Fn: UnmarshalError}
25 // UnmarshalError unmarshals an error response for an AWS Query service.
26 func UnmarshalError(r *request.Request) {
27 defer r.HTTPResponse.Body.Close()
29 bodyBytes, err := ioutil.ReadAll(r.HTTPResponse.Body)
31 r.Error = awserr.NewRequestFailure(
32 awserr.New("SerializationError", "failed to read from query HTTP response body", err),
33 r.HTTPResponse.StatusCode,
39 // First check for specific error
40 resp := xmlErrorResponse{}
41 decodeErr := xml.Unmarshal(bodyBytes, &resp)
43 reqID := resp.RequestID
47 r.Error = awserr.NewRequestFailure(
48 awserr.New(resp.Code, resp.Message, nil),
49 r.HTTPResponse.StatusCode,
55 // Check for unhandled error
56 servUnavailResp := xmlServiceUnavailableResponse{}
57 unavailErr := xml.Unmarshal(bodyBytes, &servUnavailResp)
58 if unavailErr == nil {
59 r.Error = awserr.NewRequestFailure(
60 awserr.New("ServiceUnavailableException", "service is unavailable", nil),
61 r.HTTPResponse.StatusCode,
67 // Failed to retrieve any error message from the response body
68 r.Error = awserr.NewRequestFailure(
69 awserr.New("SerializationError",
70 "failed to decode query XML error response", decodeErr),
71 r.HTTPResponse.StatusCode,