]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blob - vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go
Upgrade to 0.12
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / aws / aws-sdk-go / private / protocol / query / unmarshal_error.go
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 {
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 )
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
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 )
74 }