restxml.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Package restxml provides RESTful XML serialization of AWS
  2. // requests and responses.
  3. package restxml
  4. //go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/input/rest-xml.json build_test.go
  5. //go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/output/rest-xml.json unmarshal_test.go
  6. import (
  7. "bytes"
  8. "encoding/xml"
  9. "github.com/aws/aws-sdk-go/aws/awserr"
  10. "github.com/aws/aws-sdk-go/aws/request"
  11. "github.com/aws/aws-sdk-go/private/protocol/query"
  12. "github.com/aws/aws-sdk-go/private/protocol/rest"
  13. "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil"
  14. )
  15. // BuildHandler is a named request handler for building restxml protocol requests
  16. var BuildHandler = request.NamedHandler{Name: "awssdk.restxml.Build", Fn: Build}
  17. // UnmarshalHandler is a named request handler for unmarshaling restxml protocol requests
  18. var UnmarshalHandler = request.NamedHandler{Name: "awssdk.restxml.Unmarshal", Fn: Unmarshal}
  19. // UnmarshalMetaHandler is a named request handler for unmarshaling restxml protocol request metadata
  20. var UnmarshalMetaHandler = request.NamedHandler{Name: "awssdk.restxml.UnmarshalMeta", Fn: UnmarshalMeta}
  21. // UnmarshalErrorHandler is a named request handler for unmarshaling restxml protocol request errors
  22. var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.restxml.UnmarshalError", Fn: UnmarshalError}
  23. // Build builds a request payload for the REST XML protocol.
  24. func Build(r *request.Request) {
  25. rest.Build(r)
  26. if t := rest.PayloadType(r.Params); t == "structure" || t == "" {
  27. var buf bytes.Buffer
  28. err := xmlutil.BuildXML(r.Params, xml.NewEncoder(&buf))
  29. if err != nil {
  30. r.Error = awserr.NewRequestFailure(
  31. awserr.New(request.ErrCodeSerialization,
  32. "failed to encode rest XML request", err),
  33. 0,
  34. r.RequestID,
  35. )
  36. return
  37. }
  38. r.SetBufferBody(buf.Bytes())
  39. }
  40. }
  41. // Unmarshal unmarshals a payload response for the REST XML protocol.
  42. func Unmarshal(r *request.Request) {
  43. if t := rest.PayloadType(r.Data); t == "structure" || t == "" {
  44. defer r.HTTPResponse.Body.Close()
  45. decoder := xml.NewDecoder(r.HTTPResponse.Body)
  46. err := xmlutil.UnmarshalXML(r.Data, decoder, "")
  47. if err != nil {
  48. r.Error = awserr.NewRequestFailure(
  49. awserr.New(request.ErrCodeSerialization,
  50. "failed to decode REST XML response", err),
  51. r.HTTPResponse.StatusCode,
  52. r.RequestID,
  53. )
  54. return
  55. }
  56. } else {
  57. rest.Unmarshal(r)
  58. }
  59. }
  60. // UnmarshalMeta unmarshals response headers for the REST XML protocol.
  61. func UnmarshalMeta(r *request.Request) {
  62. rest.UnmarshalMeta(r)
  63. }
  64. // UnmarshalError unmarshals a response error for the REST XML protocol.
  65. func UnmarshalError(r *request.Request) {
  66. query.UnmarshalError(r)
  67. }