| package protocol |
| |
| import ( |
| "net/http" |
| |
| "github.com/aws/aws-sdk-go/aws/awserr" |
| "github.com/aws/aws-sdk-go/aws/request" |
| ) |
| |
| // UnmarshalErrorHandler provides unmarshaling errors API response errors for |
| // both typed and untyped errors. |
| type UnmarshalErrorHandler struct { |
| unmarshaler ErrorUnmarshaler |
| } |
| |
| // ErrorUnmarshaler is an abstract interface for concrete implementations to |
| // unmarshal protocol specific response errors. |
| type ErrorUnmarshaler interface { |
| UnmarshalError(*http.Response, ResponseMetadata) (error, error) |
| } |
| |
| // NewUnmarshalErrorHandler returns an UnmarshalErrorHandler |
| // initialized for the set of exception names to the error unmarshalers |
| func NewUnmarshalErrorHandler(unmarshaler ErrorUnmarshaler) *UnmarshalErrorHandler { |
| return &UnmarshalErrorHandler{ |
| unmarshaler: unmarshaler, |
| } |
| } |
| |
| // UnmarshalErrorHandlerName is the name of the named handler. |
| const UnmarshalErrorHandlerName = "awssdk.protocol.UnmarshalError" |
| |
| // NamedHandler returns a NamedHandler for the unmarshaler using the set of |
| // errors the unmarshaler was initialized for. |
| func (u *UnmarshalErrorHandler) NamedHandler() request.NamedHandler { |
| return request.NamedHandler{ |
| Name: UnmarshalErrorHandlerName, |
| Fn: u.UnmarshalError, |
| } |
| } |
| |
| // UnmarshalError will attempt to unmarshal the API response's error message |
| // into either a generic SDK error type, or a typed error corresponding to the |
| // errors exception name. |
| func (u *UnmarshalErrorHandler) UnmarshalError(r *request.Request) { |
| defer r.HTTPResponse.Body.Close() |
| |
| respMeta := ResponseMetadata{ |
| StatusCode: r.HTTPResponse.StatusCode, |
| RequestID: r.RequestID, |
| } |
| |
| v, err := u.unmarshaler.UnmarshalError(r.HTTPResponse, respMeta) |
| if err != nil { |
| r.Error = awserr.NewRequestFailure( |
| awserr.New(request.ErrCodeSerialization, |
| "failed to unmarshal response error", err), |
| respMeta.StatusCode, |
| respMeta.RequestID, |
| ) |
| return |
| } |
| |
| r.Error = v |
| } |