func downloadFile(downConfig DownloadConfig, fileKey string) (err error) { localFilePath := filepath.Join(downConfig.DestDir, fileKey) ldx := strings.LastIndex(localFilePath, string(os.PathSeparator)) if ldx != -1 { localFileDir := localFilePath[:ldx] mkdirErr := os.MkdirAll(localFileDir, 0775) if mkdirErr != nil { err = mkdirErr log.Error("MkdirAll failed for", localFileDir, mkdirErr.Error()) return } } log.Info("Downloading", fileKey, "=>", localFilePath, "...") downUrl := strings.Join([]string{downConfig.Domain, fileKey}, "/") if downConfig.IsPrivate { now := time.Now().Add(time.Second * 3600 * 24) downUrl = fmt.Sprintf("%s?e=%d", downUrl, now.Unix()) mac := digest.Mac{downConfig.AccessKey, []byte(downConfig.SecretKey)} token := digest.Sign(&mac, []byte(downUrl)) downUrl = fmt.Sprintf("%s&token=%s", downUrl, token) } resp, respErr := rpc.DefaultClient.Get(nil, downUrl) if respErr != nil { err = respErr log.Error("Download", fileKey, "failed by url", downUrl, respErr.Error()) return } defer resp.Body.Close() if resp.StatusCode == 200 { localFp, openErr := os.Create(localFilePath) if openErr != nil { err = openErr log.Error("Open local file", localFilePath, "failed", openErr.Error()) return } defer localFp.Close() _, cpErr := io.Copy(localFp, resp.Body) if cpErr != nil { err = cpErr log.Error("Download", fileKey, "failed", cpErr.Error()) return } } else { err = errors.New("download failed") log.Error("Download", fileKey, "failed by url", downUrl, resp.Status) return } return }
func (r GetPolicy) MakeRequest(baseUrl string, mac *digest.Mac) (privateUrl string) { expires := r.Expires if expires == 0 { expires = 3600 } deadline := time.Now().Unix() + int64(expires) if strings.Contains(baseUrl, "?") { baseUrl += "&e=" } else { baseUrl += "?e=" } baseUrl += strconv.FormatInt(deadline, 10) token := digest.Sign(mac, []byte(baseUrl)) return baseUrl + "&token=" + token }