github.com/artpar/rclone@v1.67.3/backend/imagekit/client/url.go (about) 1 package client 2 3 import ( 4 "crypto/hmac" 5 "crypto/sha1" 6 "encoding/hex" 7 "fmt" 8 neturl "net/url" 9 "strconv" 10 "strings" 11 "time" 12 ) 13 14 // URLParam represents parameters for generating url 15 type URLParam struct { 16 Path string 17 Src string 18 URLEndpoint string 19 Signed bool 20 ExpireSeconds int64 21 QueryParameters map[string]string 22 } 23 24 // URL generates url from URLParam 25 func (ik *ImageKit) URL(params URLParam) (string, error) { 26 var resultURL string 27 var url *neturl.URL 28 var err error 29 var endpoint = params.URLEndpoint 30 31 if endpoint == "" { 32 endpoint = ik.URLEndpoint 33 } 34 35 endpoint = strings.TrimRight(endpoint, "/") + "/" 36 37 if params.QueryParameters == nil { 38 params.QueryParameters = make(map[string]string) 39 } 40 41 if url, err = neturl.Parse(params.Src); err != nil { 42 return "", err 43 } 44 45 query := url.Query() 46 47 for k, v := range params.QueryParameters { 48 query.Set(k, v) 49 } 50 url.RawQuery = query.Encode() 51 resultURL = url.String() 52 53 if params.Signed { 54 now := time.Now().Unix() 55 56 var expires = strconv.FormatInt(now+params.ExpireSeconds, 10) 57 var path = strings.Replace(resultURL, endpoint, "", 1) 58 59 path = path + expires 60 mac := hmac.New(sha1.New, []byte(ik.PrivateKey)) 61 mac.Write([]byte(path)) 62 signature := hex.EncodeToString(mac.Sum(nil)) 63 64 if strings.Contains(resultURL, "?") { 65 resultURL = resultURL + "&" + fmt.Sprintf("ik-t=%s&ik-s=%s", expires, signature) 66 } else { 67 resultURL = resultURL + "?" + fmt.Sprintf("ik-t=%s&ik-s=%s", expires, signature) 68 } 69 } 70 71 return resultURL, nil 72 }