func New(cfg aws.Config, clientInfo metadata.ClientInfo, handlers Handlers,
	retryer Retryer, operation *Operation, params interface{}, data interface{}) *Request {
	if retryer == nil {
		retryer = noOpRetryer{}
	}
	method := operation.HTTPMethod
	if method == "" {
		method = "POST"
	}
	httpReq, _ := http.NewRequest(method, "", nil)
	var err error
	httpReq.URL, err = url.Parse(clientInfo.Endpoint + operation.HTTPPath)
	if err != nil {
		httpReq.URL = &url.URL{}
		err = awserr.New("InvalidEndpointURL", "invalid endpoint uri", err)
	}
	r := &Request{
		Config:     cfg,
		ClientInfo: clientInfo,
		Handlers:   handlers.Copy(),
		Retryer:     retryer,
		Time:        time.Now(),
		ExpireTime:  0,
		Operation:   operation,
		HTTPRequest: httpReq,
		Body:        nil,
		Params:      params,
		Error:       err,
		Data:        data,
	}
	r.SetBufferBody([]byte{})
	return r
}
New returns a new Request pointer for the service API operation and
parameters.

A Retryer should be provided to direct how the request is retried. If
Retryer is nil, a default no retry value will be used. You can use
NoOpRetryer in the Client package to disable retry behavior directly.

Params is any value of input parameters to be the request payload.
Data is pointer value to an object which the request's response
payload will be deserialized to.
package request
import (
	"bytes"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"reflect"
	"strings"
	"time"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awserr"
	"github.com/aws/aws-sdk-go/aws/client/metadata"
	"github.com/aws/aws-sdk-go/internal/sdkio"
)
const (
	ErrCodeSerialization = "SerializationError"
	ErrCodeRead = "ReadError"
	ErrCodeResponseTimeout = "ResponseTimeout"
	ErrCodeInvalidPresignExpire = "InvalidPresignExpireError"
	CanceledErrorCode = "RequestCanceled"
	ErrCodeRequestError = "RequestError"
)
type Request struct {
	Config     aws.Config
	ClientInfo metadata.ClientInfo
	Handlers   Handlers
	Retryer
	AttemptTime            time.Time
	Time                   time.Time
	Operation              *Operation
	HTTPRequest            *http.Request
	HTTPResponse           *http.Response
	Body                   io.ReadSeeker
	streamingBody          io.ReadCloser
	BodyStart              int64  
	Params                 interface{}
	Error                  error
	Data                   interface{}
	RequestID              string
	RetryCount             int
	Retryable              *bool
	RetryDelay             time.Duration
	NotHoist               bool
	SignedHeaderVals       http.Header
	LastSignedAt           time.Time
	DisableFollowRedirects bool
	RetryErrorCodes []string
	ThrottleErrorCodes []string
	ExpireTime time.Duration
	context aws.Context
	built bool
	safeBody *offsetReader
}
type Operation struct {
	Name       string
	HTTPMethod string
	HTTPPath   string
	*Paginator
	BeforePresignFn func(r *Request) error
}