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 := `` for _, v := range blocks { s += fmt.Sprintf("<%s>%s", v.Status, v.ID, v.Status) } s += `` 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 }