restxml.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Package restxml provides RESTful XML serialisation of AWS
  2. // requests and responses.
  3. package restxml
  4. //go:generate go run ../../fixtures/protocol/generate.go ../../fixtures/protocol/input/rest-xml.json build_test.go
  5. //go:generate go run ../../fixtures/protocol/generate.go ../../fixtures/protocol/output/rest-xml.json unmarshal_test.go
  6. import (
  7. "bytes"
  8. "encoding/xml"
  9. "github.com/ks3sdklib/aws-sdk-go/aws"
  10. "github.com/ks3sdklib/aws-sdk-go/aws/awsutil"
  11. "github.com/ks3sdklib/aws-sdk-go/internal/apierr"
  12. "github.com/ks3sdklib/aws-sdk-go/internal/protocol/query"
  13. "github.com/ks3sdklib/aws-sdk-go/internal/protocol/rest"
  14. "github.com/ks3sdklib/aws-sdk-go/internal/protocol/xml/xmlutil"
  15. "io/ioutil"
  16. )
  17. // Build builds a request payload for the REST XML protocol.
  18. func Build(r *aws.Request) {
  19. rest.Build(r)
  20. if t := rest.PayloadType(r.Params); t == "structure" || t == "" {
  21. var buf bytes.Buffer
  22. err := xmlutil.BuildXML(r.Params, xml.NewEncoder(&buf))
  23. if err != nil {
  24. r.Error = apierr.New("Marshal", "failed to encode rest XML request", err)
  25. return
  26. }
  27. r.SetBufferBody(buf.Bytes())
  28. if rest.PayloadMd5(r.Params) {
  29. //增加md5
  30. r.HTTPRequest.Header.Set("Content-MD5", awsutil.EncodeAsString(awsutil.ComputeMD5Hash(buf.Bytes())))
  31. }
  32. }
  33. }
  34. // Unmarshal unmarshals a payload response for the REST XML protocol.
  35. func Unmarshal(r *aws.Request) {
  36. if t := rest.PayloadType(r.Data); t == "structure" || t == "" {
  37. defer r.HTTPResponse.Body.Close()
  38. data, err := ioutil.ReadAll(r.HTTPResponse.Body)
  39. if err != nil {
  40. r.Error = apierr.New("ReadBody", "failed to read response body", err)
  41. return
  42. }
  43. decoder := xml.NewDecoder(bytes.NewReader(data))
  44. err = xmlutil.UnmarshalXML(r.Data, decoder, "")
  45. if err != nil {
  46. r.Error = apierr.New("Unmarshal", "failed to decode REST XML response", err)
  47. return
  48. }
  49. return
  50. }
  51. }
  52. // UnmarshalMeta unmarshals response headers for the REST XML protocol.
  53. func UnmarshalMeta(r *aws.Request) {
  54. rest.Unmarshal(r)
  55. }
  56. // UnmarshalError unmarshals a response error for the REST XML protocol.
  57. func UnmarshalError(r *aws.Request) {
  58. query.UnmarshalError(r)
  59. }