restxml.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Package restxml provides RESTful XML serialization of AWS
  2. // requests and responses.
  3. package restxml
  4. //go:generate go run -tags codegen ../../../models/protocol_tests/generate.go ../../../models/protocol_tests/input/rest-xml.json build_test.go
  5. //go:generate go run -tags codegen ../../../models/protocol_tests/generate.go ../../../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("SerializationError", "failed to encode rest XML request", err),
  32. r.HTTPResponse.StatusCode,
  33. r.RequestID,
  34. )
  35. return
  36. }
  37. r.SetBufferBody(buf.Bytes())
  38. }
  39. }
  40. // Unmarshal unmarshals a payload response for the REST XML protocol.
  41. func Unmarshal(r *request.Request) {
  42. if t := rest.PayloadType(r.Data); t == "structure" || t == "" {
  43. defer r.HTTPResponse.Body.Close()
  44. decoder := xml.NewDecoder(r.HTTPResponse.Body)
  45. err := xmlutil.UnmarshalXML(r.Data, decoder, "")
  46. if err != nil {
  47. r.Error = awserr.NewRequestFailure(
  48. awserr.New("SerializationError", "failed to decode REST XML response", err),
  49. r.HTTPResponse.StatusCode,
  50. r.RequestID,
  51. )
  52. return
  53. }
  54. } else {
  55. rest.Unmarshal(r)
  56. }
  57. }
  58. // UnmarshalMeta unmarshals response headers for the REST XML protocol.
  59. func UnmarshalMeta(r *request.Request) {
  60. rest.UnmarshalMeta(r)
  61. }
  62. // UnmarshalError unmarshals a response error for the REST XML protocol.
  63. func UnmarshalError(r *request.Request) {
  64. query.UnmarshalError(r)
  65. }