1package ec2query 2 3//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/output/ec2.json unmarshal_test.go 4 5import ( 6 "encoding/xml" 7 8 "github.com/aws/aws-sdk-go/aws/awserr" 9 "github.com/aws/aws-sdk-go/aws/request" 10 "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil" 11) 12 13// UnmarshalHandler is a named request handler for unmarshaling ec2query protocol requests 14var UnmarshalHandler = request.NamedHandler{Name: "awssdk.ec2query.Unmarshal", Fn: Unmarshal} 15 16// UnmarshalMetaHandler is a named request handler for unmarshaling ec2query protocol request metadata 17var UnmarshalMetaHandler = request.NamedHandler{Name: "awssdk.ec2query.UnmarshalMeta", Fn: UnmarshalMeta} 18 19// UnmarshalErrorHandler is a named request handler for unmarshaling ec2query protocol request errors 20var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.ec2query.UnmarshalError", Fn: UnmarshalError} 21 22// Unmarshal unmarshals a response body for the EC2 protocol. 23func Unmarshal(r *request.Request) { 24 defer r.HTTPResponse.Body.Close() 25 if r.DataFilled() { 26 decoder := xml.NewDecoder(r.HTTPResponse.Body) 27 err := xmlutil.UnmarshalXML(r.Data, decoder, "") 28 if err != nil { 29 r.Error = awserr.NewRequestFailure( 30 awserr.New(request.ErrCodeSerialization, 31 "failed decoding EC2 Query response", err), 32 r.HTTPResponse.StatusCode, 33 r.RequestID, 34 ) 35 return 36 } 37 } 38} 39 40// UnmarshalMeta unmarshals response headers for the EC2 protocol. 41func UnmarshalMeta(r *request.Request) { 42 r.RequestID = r.HTTPResponse.Header.Get("X-Amzn-Requestid") 43 if r.RequestID == "" { 44 // Alternative version of request id in the header 45 r.RequestID = r.HTTPResponse.Header.Get("X-Amz-Request-Id") 46 } 47} 48 49type xmlErrorResponse struct { 50 XMLName xml.Name `xml:"Response"` 51 Code string `xml:"Errors>Error>Code"` 52 Message string `xml:"Errors>Error>Message"` 53 RequestID string `xml:"RequestID"` 54} 55 56// UnmarshalError unmarshals a response error for the EC2 protocol. 57func UnmarshalError(r *request.Request) { 58 defer r.HTTPResponse.Body.Close() 59 60 var respErr xmlErrorResponse 61 err := xmlutil.UnmarshalXMLError(&respErr, r.HTTPResponse.Body) 62 if err != nil { 63 r.Error = awserr.NewRequestFailure( 64 awserr.New(request.ErrCodeSerialization, 65 "failed to unmarshal error message", err), 66 r.HTTPResponse.StatusCode, 67 r.RequestID, 68 ) 69 return 70 } 71 72 r.Error = awserr.NewRequestFailure( 73 awserr.New(respErr.Code, respErr.Message, nil), 74 r.HTTPResponse.StatusCode, 75 respErr.RequestID, 76 ) 77} 78