You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.7 KiB
63 lines
1.7 KiB
package query
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io/ioutil"
|
|
|
|
"github.com/aws/smithy-go/middleware"
|
|
smithyhttp "github.com/aws/smithy-go/transport/http"
|
|
)
|
|
|
|
// AddAsGetRequestMiddleware adds a middleware to the Serialize stack after the
|
|
// operation serializer that will convert the query request body to a GET
|
|
// operation with the query message in the HTTP request querystring.
|
|
func AddAsGetRequestMiddleware(stack *middleware.Stack) error {
|
|
return stack.Serialize.Insert(&asGetRequest{}, "OperationSerializer", middleware.After)
|
|
}
|
|
|
|
type asGetRequest struct{}
|
|
|
|
func (*asGetRequest) ID() string { return "Query:AsGetRequest" }
|
|
|
|
func (m *asGetRequest) HandleSerialize(
|
|
ctx context.Context, input middleware.SerializeInput, next middleware.SerializeHandler,
|
|
) (
|
|
out middleware.SerializeOutput, metadata middleware.Metadata, err error,
|
|
) {
|
|
req, ok := input.Request.(*smithyhttp.Request)
|
|
if !ok {
|
|
return out, metadata, fmt.Errorf("expect smithy HTTP Request, got %T", input.Request)
|
|
}
|
|
|
|
req.Method = "GET"
|
|
|
|
// If the stream is not set, nothing else to do.
|
|
stream := req.GetStream()
|
|
if stream == nil {
|
|
return next.HandleSerialize(ctx, input)
|
|
}
|
|
|
|
// Clear the stream since there will not be any body.
|
|
req.Header.Del("Content-Type")
|
|
req, err = req.SetStream(nil)
|
|
if err != nil {
|
|
return out, metadata, fmt.Errorf("unable update request body %w", err)
|
|
}
|
|
input.Request = req
|
|
|
|
// Update request query with the body's query string value.
|
|
delim := ""
|
|
if len(req.URL.RawQuery) != 0 {
|
|
delim = "&"
|
|
}
|
|
|
|
b, err := ioutil.ReadAll(stream)
|
|
if err != nil {
|
|
return out, metadata, fmt.Errorf("unable to get request body %w", err)
|
|
}
|
|
req.URL.RawQuery += delim + string(b)
|
|
|
|
return next.HandleSerialize(ctx, input)
|
|
}
|