mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-12-25 18:27:54 +08:00
86d92a42b4
* Added global http client * Added Do func for global http client * Changed the code to use the global http client * Fix http client in volume uploader * Fixed pkg name * Fixed http util funcs * Fixed http client for bench_filer_upload * Fixed http client for stress_filer_upload * Fixed http client for filer_server_handlers_proxy * Fixed http client for command_fs_merge_volumes * Fixed http client for command_fs_merge_volumes and command_volume_fsck * Fixed http client for s3api_server * Added init global client for main funcs * Rename global_client to client * Changed: - fixed NewHttpClient; - added CheckIsHttpsClientEnabled func - updated security.toml in scaffold * Reduce the visibility of some functions in the util/http/client pkg * Added the loadSecurityConfig function * Use util.LoadSecurityConfiguration() in NewHttpClient func
78 lines
2.5 KiB
Go
78 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
"github.com/aws/aws-sdk-go/aws/session"
|
|
"github.com/aws/aws-sdk-go/service/s3"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
|
|
)
|
|
|
|
// Downloads an item from an S3 Bucket in the region configured in the shared config
|
|
// or AWS_REGION environment variable.
|
|
//
|
|
// Usage:
|
|
// go run presigned_put.go
|
|
// For this exampl to work, the domainName is needd
|
|
// weed s3 -domainName=localhost
|
|
func main() {
|
|
util_http.InitGlobalHttpClient()
|
|
|
|
h := md5.New()
|
|
content := strings.NewReader(stringContent)
|
|
content.WriteTo(h)
|
|
|
|
// Initialize a session in us-west-2 that the SDK will use to load
|
|
// credentials from the shared credentials file ~/.aws/credentials.
|
|
sess, err := session.NewSession(&aws.Config{
|
|
Region: aws.String("us-east-1"),
|
|
Endpoint: aws.String("http://localhost:8333"),
|
|
})
|
|
|
|
// Create S3 service client
|
|
svc := s3.New(sess)
|
|
|
|
putRequest, output := svc.PutObjectRequest(&s3.PutObjectInput{
|
|
Bucket: aws.String("dev"),
|
|
Key: aws.String("testKey"),
|
|
})
|
|
fmt.Printf("output: %+v\n", output)
|
|
|
|
md5s := base64.StdEncoding.EncodeToString(h.Sum(nil))
|
|
putRequest.HTTPRequest.Header.Set("Content-MD5", md5s)
|
|
|
|
url, err := putRequest.Presign(15 * time.Minute)
|
|
if err != nil {
|
|
fmt.Println("error presigning request", err)
|
|
return
|
|
}
|
|
|
|
fmt.Println(url)
|
|
|
|
req, err := http.NewRequest("PUT", url, strings.NewReader(stringContent))
|
|
req.Header.Set("Content-MD5", md5s)
|
|
if err != nil {
|
|
fmt.Println("error creating request", url)
|
|
return
|
|
}
|
|
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
fmt.Printf("error put request: %v\n", err)
|
|
return
|
|
}
|
|
defer util_http.CloseResponse(resp)
|
|
fmt.Printf("response: %+v\n", resp)
|
|
}
|
|
|
|
var stringContent = `Generate a Pre-Signed URL for an Amazon S3 PUT Operation with a Specific Payload
|
|
You can generate a pre-signed URL for a PUT operation that checks whether users upload the correct content. When the SDK pre-signs a request, it computes the checksum of the request body and generates an MD5 checksum that is included in the pre-signed URL. Users must upload the same content that produces the same MD5 checksum generated by the SDK; otherwise, the operation fails. This is not the Content-MD5, but the signature. To enforce Content-MD5, simply add the header to the request.
|
|
|
|
The following example adds a Body field to generate a pre-signed PUT operation that requires a specific payload to be uploaded by users.
|
|
`
|