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  }