github.com/aavshr/aws-sdk-go@v1.41.3/private/protocol/restxml/restxml.go (about)

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