// Sign requests with signature version 2. // // Will sign the requests with the service config's Credentials object // Signing is skipped if the credentials is the credentials.AnonymousCredentials // object. func Sign(req *request.Request) { // If the request does not need to be signed ignore the signing of the // request if the AnonymousCredentials object is used. if req.Config.Credentials == credentials.AnonymousCredentials { return } if req.HTTPRequest.Method != "POST" && req.HTTPRequest.Method != "GET" { // The V2 signer only supports GET and POST req.Error = errInvalidMethod return } v2 := signer{ Request: req.HTTPRequest, Time: req.Time, Credentials: req.Config.Credentials, Debug: req.Config.LogLevel.Value(), Logger: req.Config.Logger, } req.Error = v2.Sign() if req.Error != nil { return } if req.HTTPRequest.Method == "POST" { // Set the body of the request based on the modified query parameters req.SetStringBody(v2.Query.Encode()) // Now that the body has changed, remove any Content-Length header, // because it will be incorrect req.HTTPRequest.ContentLength = 0 req.HTTPRequest.Header.Del("Content-Length") } else { req.HTTPRequest.URL.RawQuery = v2.Query.Encode() } }
func buildBody(r *request.Request, v reflect.Value) { if field, ok := v.Type().FieldByName("_"); ok { if payloadName := field.Tag.Get("payload"); payloadName != "" { pfield, _ := v.Type().FieldByName(payloadName) if ptag := pfield.Tag.Get("type"); ptag != "" && ptag != "structure" { payload := reflect.Indirect(v.FieldByName(payloadName)) if payload.IsValid() && payload.Interface() != nil { switch reader := payload.Interface().(type) { case io.ReadSeeker: r.SetReaderBody(reader) case []byte: r.SetBufferBody(reader) case string: r.SetStringBody(reader) default: r.Error = awserr.New("SerializationError", "failed to encode REST request", fmt.Errorf("unknown payload type %s", payload.Type())) } } } } } }