]>
Commit | Line | Data |
---|---|---|
bae9f6d2 JC |
1 | package query |
2 | ||
3 | import ( | |
4 | "encoding/xml" | |
5 | "io/ioutil" | |
6 | ||
7 | "github.com/aws/aws-sdk-go/aws/awserr" | |
8 | "github.com/aws/aws-sdk-go/aws/request" | |
9 | ) | |
10 | ||
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"` | |
16 | } | |
17 | ||
18 | type xmlServiceUnavailableResponse struct { | |
19 | XMLName xml.Name `xml:"ServiceUnavailableException"` | |
20 | } | |
21 | ||
22 | // UnmarshalErrorHandler is a name request handler to unmarshal request errors | |
23 | var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalError", Fn: UnmarshalError} | |
24 | ||
25 | // UnmarshalError unmarshals an error response for an AWS Query service. | |
26 | func UnmarshalError(r *request.Request) { | |
27 | defer r.HTTPResponse.Body.Close() | |
28 | ||
29 | bodyBytes, err := ioutil.ReadAll(r.HTTPResponse.Body) | |
30 | if err != nil { | |
107c1cdb ND |
31 | r.Error = awserr.NewRequestFailure( |
32 | awserr.New("SerializationError", "failed to read from query HTTP response body", err), | |
33 | r.HTTPResponse.StatusCode, | |
34 | r.RequestID, | |
35 | ) | |
bae9f6d2 JC |
36 | return |
37 | } | |
38 | ||
39 | // First check for specific error | |
40 | resp := xmlErrorResponse{} | |
41 | decodeErr := xml.Unmarshal(bodyBytes, &resp) | |
42 | if decodeErr == nil { | |
43 | reqID := resp.RequestID | |
44 | if reqID == "" { | |
45 | reqID = r.RequestID | |
46 | } | |
47 | r.Error = awserr.NewRequestFailure( | |
48 | awserr.New(resp.Code, resp.Message, nil), | |
49 | r.HTTPResponse.StatusCode, | |
50 | reqID, | |
51 | ) | |
52 | return | |
53 | } | |
54 | ||
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, | |
62 | r.RequestID, | |
63 | ) | |
64 | return | |
65 | } | |
66 | ||
67 | // Failed to retrieve any error message from the response body | |
107c1cdb ND |
68 | r.Error = awserr.NewRequestFailure( |
69 | awserr.New("SerializationError", | |
70 | "failed to decode query XML error response", decodeErr), | |
71 | r.HTTPResponse.StatusCode, | |
72 | r.RequestID, | |
73 | ) | |
bae9f6d2 | 74 | } |