bilibili-backup/app/admin/main/apm/dao/upload.go
2019-04-22 02:59:20 +00:00

67 lines
1.8 KiB
Go

package dao
import (
"bytes"
"context"
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"hash"
"net/http"
"strconv"
)
func authorize(key, secret, method, bucket string, expire int64) (authorization string) {
var (
content string
hash2 hash.Hash
signature string
template = "%s\n%s\n\n%d\n"
)
content = fmt.Sprintf(template, method, bucket, expire)
hash2 = hmac.New(sha1.New, []byte(secret))
hash2.Write([]byte(content))
signature = base64.StdEncoding.EncodeToString(hash2.Sum(nil))
authorization = fmt.Sprintf("%s:%s:%d", key, signature, expire)
return
}
// UploadProxy upload file to bfs with no filename.
func (d *Dao) UploadProxy(c context.Context, fileType string, expire int64, body []byte) (url string, err error) {
var (
req *http.Request
resp *http.Response
header http.Header
code string
bfs = d.c.Bfs
uploadURL = "/%s"
)
url = fmt.Sprintf(bfs.Addr+uploadURL, bfs.Bucket)
if req, err = http.NewRequest(http.MethodPut, url, bytes.NewReader(body)); err != nil {
err = fmt.Errorf("dao.UploadProxy NewRequest error(%v)", err)
return
}
authorization := authorize(bfs.Key, bfs.Secret, http.MethodPut, bfs.Bucket, expire)
req.Header.Set("Host", bfs.Addr)
req.Header.Add("Date", fmt.Sprint(expire))
req.Header.Add("Authorization", authorization)
req.Header.Add("Content-Type", fileType)
if resp, err = http.DefaultClient.Do(req); err != nil {
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
err = fmt.Errorf("dao.UploadProxy error return_status(%d)", resp.StatusCode)
return
}
header = resp.Header
code = header.Get("Code")
if code != strconv.Itoa(http.StatusOK) {
err = fmt.Errorf("dao.UploadProxy Upload url(%s) return_code(%s)", url, code)
return
}
url = header.Get("Location")
return
}