c76ad94492
This commit adds a build step to travis to auto-delete unstable archives older than 14 days (our regular release schedule) from Azure via ci.go purge. The commit also pulls in the latest Azure storage code, also switching over from the old import path (github.com/Azure/azure-sdk-for-go) to the new split one (github.com/Azure/azure-storage-go).
86 lines
1.6 KiB
Go
86 lines
1.6 KiB
Go
package storage
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/hmac"
|
|
"crypto/sha256"
|
|
"encoding/base64"
|
|
"encoding/xml"
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
"reflect"
|
|
"time"
|
|
)
|
|
|
|
func (c Client) computeHmac256(message string) string {
|
|
h := hmac.New(sha256.New, c.accountKey)
|
|
h.Write([]byte(message))
|
|
return base64.StdEncoding.EncodeToString(h.Sum(nil))
|
|
}
|
|
|
|
func currentTimeRfc1123Formatted() string {
|
|
return timeRfc1123Formatted(time.Now().UTC())
|
|
}
|
|
|
|
func timeRfc1123Formatted(t time.Time) string {
|
|
return t.Format(http.TimeFormat)
|
|
}
|
|
|
|
func mergeParams(v1, v2 url.Values) url.Values {
|
|
out := url.Values{}
|
|
for k, v := range v1 {
|
|
out[k] = v
|
|
}
|
|
for k, v := range v2 {
|
|
vals, ok := out[k]
|
|
if ok {
|
|
vals = append(vals, v...)
|
|
out[k] = vals
|
|
} else {
|
|
out[k] = v
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
func prepareBlockListRequest(blocks []Block) string {
|
|
s := `<?xml version="1.0" encoding="utf-8"?><BlockList>`
|
|
for _, v := range blocks {
|
|
s += fmt.Sprintf("<%s>%s</%s>", v.Status, v.ID, v.Status)
|
|
}
|
|
s += `</BlockList>`
|
|
return s
|
|
}
|
|
|
|
func xmlUnmarshal(body io.Reader, v interface{}) error {
|
|
data, err := ioutil.ReadAll(body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return xml.Unmarshal(data, v)
|
|
}
|
|
|
|
func xmlMarshal(v interface{}) (io.Reader, int, error) {
|
|
b, err := xml.Marshal(v)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
return bytes.NewReader(b), len(b), nil
|
|
}
|
|
|
|
func headersFromStruct(v interface{}) map[string]string {
|
|
headers := make(map[string]string)
|
|
value := reflect.ValueOf(v)
|
|
for i := 0; i < value.NumField(); i++ {
|
|
key := value.Type().Field(i).Tag.Get("header")
|
|
val := value.Field(i).String()
|
|
if key != "" && val != "" {
|
|
headers[key] = val
|
|
}
|
|
}
|
|
return headers
|
|
}
|