client.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. // This file is auto-generated, don't edit it. Thanks.
  2. package utils
  3. import (
  4. "bytes"
  5. "crypto"
  6. "crypto/hmac"
  7. "crypto/md5"
  8. "crypto/rand"
  9. "crypto/rsa"
  10. "crypto/sha1"
  11. "crypto/sha256"
  12. "crypto/x509"
  13. "encoding/base64"
  14. "encoding/hex"
  15. "encoding/json"
  16. "encoding/pem"
  17. "errors"
  18. "fmt"
  19. "hash"
  20. "io"
  21. "io/ioutil"
  22. mathRand "math/rand"
  23. "net/http"
  24. "net/textproto"
  25. "net/url"
  26. "reflect"
  27. "runtime"
  28. "sort"
  29. "strconv"
  30. "strings"
  31. "sync/atomic"
  32. "time"
  33. models "github.com/alibabacloud-go/darabonba-openapi/v2/models"
  34. "github.com/alibabacloud-go/tea/dara"
  35. "github.com/tjfoc/gmsm/sm3"
  36. )
  37. var defaultUserAgent = fmt.Sprintf("AlibabaCloud (%s; %s) Golang/%s Core/%s TeaDSL/2", runtime.GOOS, runtime.GOARCH, strings.Trim(runtime.Version(), "go"), "0.01")
  38. var seqId int64 = 0
  39. var processStartTime int64 = time.Now().UnixNano() / 1e6
  40. const (
  41. PEM_BEGIN = "-----BEGIN RSA PRIVATE KEY-----\n"
  42. PEM_END = "\n-----END RSA PRIVATE KEY-----"
  43. )
  44. type Config = models.Config
  45. type GlobalParameters = models.GlobalParameters
  46. type Params = models.Params
  47. type OpenApiRequest = models.OpenApiRequest
  48. type Sorter struct {
  49. Keys []string
  50. Vals []string
  51. }
  52. func newSorter(m map[string]string) *Sorter {
  53. hs := &Sorter{
  54. Keys: make([]string, 0, len(m)),
  55. Vals: make([]string, 0, len(m)),
  56. }
  57. for k, v := range m {
  58. hs.Keys = append(hs.Keys, k)
  59. hs.Vals = append(hs.Vals, v)
  60. }
  61. return hs
  62. }
  63. // Sort is an additional function for function SignHeader.
  64. func (hs *Sorter) Sort() {
  65. sort.Sort(hs)
  66. }
  67. // Len is an additional function for function SignHeader.
  68. func (hs *Sorter) Len() int {
  69. return len(hs.Vals)
  70. }
  71. // Less is an additional function for function SignHeader.
  72. func (hs *Sorter) Less(i, j int) bool {
  73. return bytes.Compare([]byte(hs.Keys[i]), []byte(hs.Keys[j])) < 0
  74. }
  75. // Swap is an additional function for function SignHeader.
  76. func (hs *Sorter) Swap(i, j int) {
  77. hs.Vals[i], hs.Vals[j] = hs.Vals[j], hs.Vals[i]
  78. hs.Keys[i], hs.Keys[j] = hs.Keys[j], hs.Keys[i]
  79. }
  80. // Description:
  81. //
  82. // This is for OpenApi Util
  83. // Description:
  84. //
  85. // # Convert all params of body other than type of readable into content
  86. //
  87. // @param body - source Model
  88. //
  89. // @param content - target Model
  90. //
  91. // @return void
  92. func Convert(body interface{}, content interface{}) {
  93. res := make(map[string]interface{})
  94. val := reflect.ValueOf(body).Elem()
  95. dataType := val.Type()
  96. for i := 0; i < dataType.NumField(); i++ {
  97. field := dataType.Field(i)
  98. name, _ := field.Tag.Lookup("json")
  99. name = strings.Split(name, ",omitempty")[0]
  100. _, ok := val.Field(i).Interface().(io.Reader)
  101. if !ok {
  102. res[name] = val.Field(i).Interface()
  103. }
  104. }
  105. byt, _ := json.Marshal(res)
  106. json.Unmarshal(byt, content)
  107. }
  108. // Description:
  109. //
  110. // # Get throttling param
  111. //
  112. // @param the - response headers
  113. //
  114. // @return time left
  115. func GetThrottlingTimeLeft(headers map[string]*string) (_result *int64) {
  116. rateLimitForUserApi := headers["x-ratelimit-user-api"]
  117. rateLimitForUser := headers["x-ratelimit-user"]
  118. timeLeftForUserApi := getTimeLeft(rateLimitForUserApi)
  119. timeLeftForUser := getTimeLeft(rateLimitForUser)
  120. if dara.Int64Value(timeLeftForUserApi) > dara.Int64Value(timeLeftForUser) {
  121. return timeLeftForUserApi
  122. } else {
  123. return timeLeftForUser
  124. }
  125. }
  126. // Description:
  127. //
  128. // # Hash the raw data with signatureAlgorithm
  129. //
  130. // @param raw - hashing data
  131. //
  132. // @param signatureAlgorithm - the autograph method
  133. //
  134. // @return hashed bytes
  135. func Hash(raw []byte, signatureAlgorithm *string) (_result []byte) {
  136. signType := dara.StringValue(signatureAlgorithm)
  137. if signType == "ACS3-HMAC-SHA256" || signType == "ACS3-RSA-SHA256" {
  138. h := sha256.New()
  139. h.Write(raw)
  140. return h.Sum(nil)
  141. } else if signType == "ACS3-HMAC-SM3" {
  142. h := sm3.New()
  143. h.Write(raw)
  144. return h.Sum(nil)
  145. }
  146. return nil
  147. }
  148. func getGID() uint64 {
  149. // https://blog.sgmansfield.com/2015/12/goroutine-ids/
  150. b := make([]byte, 64)
  151. b = b[:runtime.Stack(b, false)]
  152. b = bytes.TrimPrefix(b, []byte("goroutine "))
  153. b = b[:bytes.IndexByte(b, ' ')]
  154. n, _ := strconv.ParseUint(string(b), 10, 64)
  155. return n
  156. }
  157. // Description:
  158. //
  159. // # Generate a nonce string
  160. //
  161. // @return the nonce string
  162. func GetNonce() (_result *string) {
  163. routineId := getGID()
  164. currentTime := time.Now().UnixNano() / 1e6
  165. seq := atomic.AddInt64(&seqId, 1)
  166. randNum := mathRand.Int63()
  167. msg := fmt.Sprintf("%d-%d-%d-%d-%d", processStartTime, routineId, currentTime, seq, randNum)
  168. h := md5.New()
  169. h.Write([]byte(msg))
  170. ret := hex.EncodeToString(h.Sum(nil))
  171. return &ret
  172. }
  173. // Description:
  174. //
  175. // # Get the string to be signed according to request
  176. //
  177. // @param request - which contains signed messages
  178. //
  179. // @return the signed string
  180. func GetStringToSign(request *dara.Request) (_result *string) {
  181. return dara.String(getStringToSign(request))
  182. }
  183. func getStringToSign(request *dara.Request) string {
  184. // sort QueryParams by key
  185. var queryKeys []string
  186. resource := dara.StringValue(request.Pathname)
  187. queryParams := request.Query
  188. for key := range queryParams {
  189. queryKeys = append(queryKeys, key)
  190. }
  191. sort.Strings(queryKeys)
  192. tmp := ""
  193. for i := 0; i < len(queryKeys); i++ {
  194. queryKey := queryKeys[i]
  195. v := dara.StringValue(queryParams[queryKey])
  196. if v != "" {
  197. tmp = tmp + "&" + queryKey + "=" + v
  198. } else {
  199. tmp = tmp + "&" + queryKey
  200. }
  201. }
  202. if tmp != "" {
  203. tmp = strings.TrimLeft(tmp, "&")
  204. resource = resource + "?" + tmp
  205. }
  206. return getSignedStr(request, resource)
  207. }
  208. func getSignedStr(req *dara.Request, canonicalizedResource string) string {
  209. temp := make(map[string]string)
  210. for k, v := range req.Headers {
  211. if strings.HasPrefix(strings.ToLower(k), "x-acs-") {
  212. temp[strings.ToLower(k)] = dara.StringValue(v)
  213. }
  214. }
  215. hs := newSorter(temp)
  216. // Sort the temp by the ascending order
  217. hs.Sort()
  218. // Get the canonicalizedOSSHeaders
  219. canonicalizedOSSHeaders := ""
  220. for i := range hs.Keys {
  221. canonicalizedOSSHeaders += hs.Keys[i] + ":" + hs.Vals[i] + "\n"
  222. }
  223. // Give other parameters values
  224. // when sign URL, date is expires
  225. date := dara.StringValue(req.Headers["date"])
  226. accept := dara.StringValue(req.Headers["accept"])
  227. contentType := dara.StringValue(req.Headers["content-type"])
  228. contentMd5 := dara.StringValue(req.Headers["content-md5"])
  229. signStr := dara.StringValue(req.Method) + "\n" + accept + "\n" + contentMd5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedOSSHeaders + canonicalizedResource
  230. return signStr
  231. }
  232. // Description:
  233. //
  234. // # Get signature according to stringToSign, secret
  235. //
  236. // @param stringToSign - the signed string
  237. //
  238. // @param secret - accesskey secret
  239. //
  240. // @return the signature
  241. func GetROASignature(stringToSign *string, secret *string) (_result *string) {
  242. h := hmac.New(func() hash.Hash { return sha1.New() }, []byte(dara.StringValue(secret)))
  243. io.WriteString(h, dara.StringValue(stringToSign))
  244. signedStr := base64.StdEncoding.EncodeToString(h.Sum(nil))
  245. return dara.String(signedStr)
  246. }
  247. // Description:
  248. //
  249. // # Parse filter into a form string
  250. //
  251. // @param filter - object
  252. //
  253. // @return the string
  254. func ToForm(filter map[string]interface{}) (_result *string) {
  255. tmp := make(map[string]interface{})
  256. byt, _ := json.Marshal(filter)
  257. d := json.NewDecoder(bytes.NewReader(byt))
  258. d.UseNumber()
  259. _ = d.Decode(&tmp)
  260. result := make(map[string]*string)
  261. for key, value := range tmp {
  262. filterValue := reflect.ValueOf(value)
  263. flatRepeatedList(filterValue, result, key)
  264. }
  265. m := make(map[string]interface{})
  266. for key, value := range result {
  267. m[key] = dara.StringValue(value)
  268. }
  269. return dara.String(dara.ToFormString(m))
  270. }
  271. func flatRepeatedList(dataValue reflect.Value, result map[string]*string, prefix string) {
  272. if !dataValue.IsValid() {
  273. return
  274. }
  275. dataType := dataValue.Type()
  276. if dataType.Kind().String() == "slice" {
  277. handleRepeatedParams(dataValue, result, prefix)
  278. } else if dataType.Kind().String() == "map" {
  279. handleMap(dataValue, result, prefix)
  280. } else {
  281. result[prefix] = dara.String(fmt.Sprintf("%v", dataValue.Interface()))
  282. }
  283. }
  284. func handleRepeatedParams(repeatedFieldValue reflect.Value, result map[string]*string, prefix string) {
  285. if repeatedFieldValue.IsValid() && !repeatedFieldValue.IsNil() {
  286. for m := 0; m < repeatedFieldValue.Len(); m++ {
  287. elementValue := repeatedFieldValue.Index(m)
  288. key := prefix + "." + strconv.Itoa(m+1)
  289. fieldValue := reflect.ValueOf(elementValue.Interface())
  290. if fieldValue.Kind().String() == "map" {
  291. handleMap(fieldValue, result, key)
  292. } else {
  293. result[key] = dara.String(fmt.Sprintf("%v", fieldValue.Interface()))
  294. }
  295. }
  296. }
  297. }
  298. func handleMap(valueField reflect.Value, result map[string]*string, prefix string) {
  299. var byt []byte
  300. if valueField.IsValid() && valueField.String() != "" {
  301. valueFieldType := valueField.Type()
  302. if valueFieldType.Kind().String() == "map" {
  303. byt, _ = json.Marshal(valueField.Interface())
  304. cache := make(map[string]interface{})
  305. d := json.NewDecoder(bytes.NewReader(byt))
  306. d.UseNumber()
  307. _ = d.Decode(&cache)
  308. for key, value := range cache {
  309. pre := ""
  310. if prefix != "" {
  311. pre = prefix + "." + key
  312. } else {
  313. pre = key
  314. }
  315. fieldValue := reflect.ValueOf(value)
  316. flatRepeatedList(fieldValue, result, pre)
  317. }
  318. }
  319. }
  320. }
  321. // Description:
  322. //
  323. // # Get timestamp
  324. //
  325. // @return the timestamp string
  326. func GetTimestamp() (_result *string) {
  327. gmt := time.FixedZone("GMT", 0)
  328. return dara.String(time.Now().In(gmt).Format("2006-01-02T15:04:05Z"))
  329. }
  330. // Description:
  331. //
  332. // # Get UTC string
  333. //
  334. // @return the UTC string
  335. func GetDateUTCString() (_result *string) {
  336. return dara.String(time.Now().UTC().Format(http.TimeFormat))
  337. }
  338. // Description:
  339. //
  340. // Parse filter into a object which's type is map[string]string
  341. //
  342. // @param filter - query param
  343. //
  344. // @return the object
  345. func Query(filter interface{}) (_result map[string]*string) {
  346. tmp := make(map[string]interface{})
  347. byt, _ := json.Marshal(filter)
  348. d := json.NewDecoder(bytes.NewReader(byt))
  349. d.UseNumber()
  350. _ = d.Decode(&tmp)
  351. result := make(map[string]*string)
  352. for key, value := range tmp {
  353. filterValue := reflect.ValueOf(value)
  354. flatRepeatedList(filterValue, result, key)
  355. }
  356. return result
  357. }
  358. // Description:
  359. //
  360. // # Get signature according to signedParams, method and secret
  361. //
  362. // @param signedParams - params which need to be signed
  363. //
  364. // @param method - http method e.g. GET
  365. //
  366. // @param secret - AccessKeySecret
  367. //
  368. // @return the signature
  369. func GetRPCSignature(signedParams map[string]*string, method *string, secret *string) (_result *string) {
  370. stringToSign := buildRpcStringToSign(signedParams, dara.StringValue(method))
  371. signature := sign(stringToSign, dara.StringValue(secret), "&")
  372. return dara.String(signature)
  373. }
  374. // Description:
  375. //
  376. // # Parse array into a string with specified style
  377. //
  378. // @param array - the array
  379. //
  380. // @param prefix - the prefix string
  381. //
  382. // @return the string
  383. func ArrayToStringWithSpecifiedStyle(array interface{}, prefix *string, style *string) (_result *string) {
  384. if dara.IsNil(array) {
  385. return dara.String("")
  386. }
  387. sty := dara.StringValue(style)
  388. if sty == "repeatList" {
  389. tmp := map[string]interface{}{
  390. dara.StringValue(prefix): array,
  391. }
  392. return flatRepeatList(tmp)
  393. } else if sty == "simple" || sty == "spaceDelimited" || sty == "pipeDelimited" {
  394. return flatArray(array, sty)
  395. } else if sty == "json" {
  396. return dara.String(dara.Stringify(array))
  397. }
  398. return dara.String("")
  399. }
  400. // Description:
  401. //
  402. // # Get the authorization
  403. //
  404. // @param request - request params
  405. //
  406. // @param signatureAlgorithm - the autograph method
  407. //
  408. // @param payload - the hashed request
  409. //
  410. // @param accessKey - the accessKey string
  411. //
  412. // @param accessKeySecret - the accessKeySecret string
  413. //
  414. // @return authorization string
  415. func GetAuthorization(request *dara.Request, signatureAlgorithm *string, payload *string, accessKey *string, accessKeySecret *string) (_result *string) {
  416. canonicalURI := dara.StringValue(request.Pathname)
  417. if canonicalURI == "" {
  418. canonicalURI = "/"
  419. }
  420. canonicalURI = strings.Replace(canonicalURI, "+", "%20", -1)
  421. canonicalURI = strings.Replace(canonicalURI, "*", "%2A", -1)
  422. canonicalURI = strings.Replace(canonicalURI, "%7E", "~", -1)
  423. method := dara.StringValue(request.Method)
  424. canonicalQueryString := getCanonicalQueryString(request.Query)
  425. canonicalheaders, signedHeaders := getCanonicalHeaders(request.Headers)
  426. canonicalRequest := method + "\n" + canonicalURI + "\n" + canonicalQueryString + "\n" + canonicalheaders + "\n" +
  427. strings.Join(signedHeaders, ";") + "\n" + dara.StringValue(payload)
  428. signType := dara.StringValue(signatureAlgorithm)
  429. StringToSign := signType + "\n" + hex.EncodeToString(Hash([]byte(canonicalRequest), signatureAlgorithm))
  430. signature := hex.EncodeToString(SignatureMethod(dara.StringValue(accessKeySecret), StringToSign, signType))
  431. auth := signType + " Credential=" + dara.StringValue(accessKey) + ",SignedHeaders=" +
  432. strings.Join(signedHeaders, ";") + ",Signature=" + signature
  433. return dara.String(auth)
  434. }
  435. func GetUserAgent(userAgent *string) (_result *string) {
  436. if userAgent != nil && dara.StringValue(userAgent) != "" {
  437. return dara.String(defaultUserAgent + " " + dara.StringValue(userAgent))
  438. }
  439. return dara.String(defaultUserAgent)
  440. }
  441. func SignatureMethod(secret, source, signatureAlgorithm string) []byte {
  442. if signatureAlgorithm == "ACS3-HMAC-SHA256" {
  443. h := hmac.New(sha256.New, []byte(secret))
  444. h.Write([]byte(source))
  445. return h.Sum(nil)
  446. } else if signatureAlgorithm == "ACS3-HMAC-SM3" {
  447. h := hmac.New(sm3.New, []byte(secret))
  448. h.Write([]byte(source))
  449. return h.Sum(nil)
  450. } else if signatureAlgorithm == "ACS3-RSA-SHA256" {
  451. return rsaSign(source, secret)
  452. }
  453. return nil
  454. }
  455. func flatRepeatList(filter map[string]interface{}) (_result *string) {
  456. tmp := make(map[string]interface{})
  457. byt, _ := json.Marshal(filter)
  458. d := json.NewDecoder(bytes.NewReader(byt))
  459. d.UseNumber()
  460. _ = d.Decode(&tmp)
  461. result := make(map[string]*string)
  462. for key, value := range tmp {
  463. filterValue := reflect.ValueOf(value)
  464. flatRepeatedList(filterValue, result, key)
  465. }
  466. res := make(map[string]string)
  467. for k, v := range result {
  468. res[k] = dara.StringValue(v)
  469. }
  470. hs := newSorter(res)
  471. hs.Sort()
  472. // Get the canonicalizedOSSHeaders
  473. t := ""
  474. for i := range hs.Keys {
  475. if i == len(hs.Keys)-1 {
  476. t += hs.Keys[i] + "=" + hs.Vals[i]
  477. } else {
  478. t += hs.Keys[i] + "=" + hs.Vals[i] + "&&"
  479. }
  480. }
  481. return dara.String(t)
  482. }
  483. func flatArray(array interface{}, sty string) *string {
  484. t := reflect.ValueOf(array)
  485. strs := make([]string, 0)
  486. for i := 0; i < t.Len(); i++ {
  487. tmp := t.Index(i)
  488. if tmp.Kind() == reflect.Ptr || tmp.Kind() == reflect.Interface {
  489. tmp = tmp.Elem()
  490. }
  491. if tmp.Kind() == reflect.Ptr {
  492. tmp = tmp.Elem()
  493. }
  494. if tmp.Kind() == reflect.String {
  495. strs = append(strs, tmp.String())
  496. } else {
  497. inter := tmp.Interface()
  498. byt, _ := json.Marshal(inter)
  499. strs = append(strs, string(byt))
  500. }
  501. }
  502. str := ""
  503. if sty == "simple" {
  504. str = strings.Join(strs, ",")
  505. } else if sty == "spaceDelimited" {
  506. str = strings.Join(strs, " ")
  507. } else if sty == "pipeDelimited" {
  508. str = strings.Join(strs, "|")
  509. }
  510. return dara.String(str)
  511. }
  512. func buildRpcStringToSign(signedParam map[string]*string, method string) (stringToSign string) {
  513. signParams := make(map[string]string)
  514. for key, value := range signedParam {
  515. signParams[key] = dara.StringValue(value)
  516. }
  517. stringToSign = getUrlFormedMap(signParams)
  518. stringToSign = strings.Replace(stringToSign, "+", "%20", -1)
  519. stringToSign = strings.Replace(stringToSign, "*", "%2A", -1)
  520. stringToSign = strings.Replace(stringToSign, "%7E", "~", -1)
  521. stringToSign = url.QueryEscape(stringToSign)
  522. stringToSign = method + "&%2F&" + stringToSign
  523. return
  524. }
  525. func getUrlFormedMap(source map[string]string) (urlEncoded string) {
  526. urlEncoder := url.Values{}
  527. for key, value := range source {
  528. urlEncoder.Add(key, value)
  529. }
  530. urlEncoded = urlEncoder.Encode()
  531. return
  532. }
  533. func sign(stringToSign, accessKeySecret, secretSuffix string) string {
  534. secret := accessKeySecret + secretSuffix
  535. signedBytes := shaHmac1(stringToSign, secret)
  536. signedString := base64.StdEncoding.EncodeToString(signedBytes)
  537. return signedString
  538. }
  539. func shaHmac1(source, secret string) []byte {
  540. key := []byte(secret)
  541. hmac := hmac.New(sha1.New, key)
  542. hmac.Write([]byte(source))
  543. return hmac.Sum(nil)
  544. }
  545. func getTimeLeft(rateLimit *string) (_result *int64) {
  546. if rateLimit != nil {
  547. pairs := strings.Split(dara.StringValue(rateLimit), ",")
  548. for _, pair := range pairs {
  549. kv := strings.Split(pair, ":")
  550. if len(kv) == 2 {
  551. key, value := kv[0], kv[1]
  552. if key == "TimeLeft" {
  553. timeLeftValue, err := strconv.ParseInt(value, 10, 64)
  554. if err != nil {
  555. return nil
  556. }
  557. return dara.Int64(timeLeftValue)
  558. }
  559. }
  560. }
  561. }
  562. return nil
  563. }
  564. func rsaSign(content, secret string) []byte {
  565. h := crypto.SHA256.New()
  566. h.Write([]byte(content))
  567. hashed := h.Sum(nil)
  568. priv, err := parsePrivateKey(secret)
  569. if err != nil {
  570. return nil
  571. }
  572. sign, err := rsa.SignPKCS1v15(rand.Reader, priv, crypto.SHA256, hashed)
  573. if err != nil {
  574. return nil
  575. }
  576. return sign
  577. }
  578. func parsePrivateKey(privateKey string) (*rsa.PrivateKey, error) {
  579. privateKey = formatPrivateKey(privateKey)
  580. block, _ := pem.Decode([]byte(privateKey))
  581. if block == nil {
  582. return nil, errors.New("PrivateKey is invalid")
  583. }
  584. priKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
  585. if err != nil {
  586. return nil, err
  587. }
  588. switch priKey.(type) {
  589. case *rsa.PrivateKey:
  590. return priKey.(*rsa.PrivateKey), nil
  591. default:
  592. return nil, nil
  593. }
  594. }
  595. func formatPrivateKey(privateKey string) string {
  596. if !strings.HasPrefix(privateKey, PEM_BEGIN) {
  597. privateKey = PEM_BEGIN + privateKey
  598. }
  599. if !strings.HasSuffix(privateKey, PEM_END) {
  600. privateKey += PEM_END
  601. }
  602. return privateKey
  603. }
  604. func getCanonicalHeaders(headers map[string]*string) (string, []string) {
  605. tmp := make(map[string]string)
  606. tmpHeader := http.Header{}
  607. for k, v := range headers {
  608. if strings.HasPrefix(strings.ToLower(k), "x-acs-") || strings.ToLower(k) == "host" ||
  609. strings.ToLower(k) == "content-type" {
  610. tmp[strings.ToLower(k)] = strings.TrimSpace(dara.StringValue(v))
  611. tmpHeader.Add(strings.ToLower(k), strings.TrimSpace(dara.StringValue(v)))
  612. }
  613. }
  614. hs := newSorter(tmp)
  615. // Sort the temp by the ascending order
  616. hs.Sort()
  617. canonicalheaders := ""
  618. for _, key := range hs.Keys {
  619. vals := tmpHeader[textproto.CanonicalMIMEHeaderKey(key)]
  620. sort.Strings(vals)
  621. canonicalheaders += key + ":" + strings.Join(vals, ",") + "\n"
  622. }
  623. return canonicalheaders, hs.Keys
  624. }
  625. func getCanonicalQueryString(query map[string]*string) string {
  626. canonicalQueryString := ""
  627. if dara.IsNil(query) {
  628. return canonicalQueryString
  629. }
  630. tmp := make(map[string]string)
  631. for k, v := range query {
  632. tmp[k] = dara.StringValue(v)
  633. }
  634. hs := newSorter(tmp)
  635. // Sort the temp by the ascending order
  636. hs.Sort()
  637. for i := range hs.Keys {
  638. if hs.Vals[i] != "" {
  639. canonicalQueryString += "&" + hs.Keys[i] + "=" + url.QueryEscape(hs.Vals[i])
  640. } else {
  641. canonicalQueryString += "&" + hs.Keys[i] + "="
  642. }
  643. }
  644. canonicalQueryString = strings.Replace(canonicalQueryString, "+", "%20", -1)
  645. canonicalQueryString = strings.Replace(canonicalQueryString, "*", "%2A", -1)
  646. canonicalQueryString = strings.Replace(canonicalQueryString, "%7E", "~", -1)
  647. if canonicalQueryString != "" {
  648. canonicalQueryString = strings.TrimLeft(canonicalQueryString, "&")
  649. }
  650. return canonicalQueryString
  651. }
  652. func ParseToMap(in interface{}) map[string]interface{} {
  653. if dara.IsNil(in) {
  654. return nil
  655. }
  656. tmp := make(map[string]interface{})
  657. byt, _ := json.Marshal(in)
  658. d := json.NewDecoder(bytes.NewReader(byt))
  659. d.UseNumber()
  660. err := d.Decode(&tmp)
  661. if err != nil {
  662. return nil
  663. }
  664. return tmp
  665. }
  666. func GetEndpointRules(product, regionId, endpointType, network, suffix *string) (_result *string, _err error) {
  667. if dara.StringValue(endpointType) == "regional" {
  668. if dara.StringValue(regionId) == "" {
  669. _err = fmt.Errorf("RegionId is empty, please set a valid RegionId")
  670. return dara.String(""), _err
  671. }
  672. _result = dara.String(strings.Replace("<product><suffix><network>.<region_id>.aliyuncs.com",
  673. "<region_id>", dara.StringValue(regionId), 1))
  674. } else {
  675. _result = dara.String("<product><suffix><network>.aliyuncs.com")
  676. }
  677. _result = dara.String(strings.Replace(dara.StringValue(_result),
  678. "<product>", strings.ToLower(dara.StringValue(product)), 1))
  679. if dara.StringValue(network) == "" || dara.StringValue(network) == "public" {
  680. _result = dara.String(strings.Replace(dara.StringValue(_result), "<network>", "", 1))
  681. } else {
  682. _result = dara.String(strings.Replace(dara.StringValue(_result),
  683. "<network>", "-"+dara.StringValue(network), 1))
  684. }
  685. if dara.StringValue(suffix) == "" {
  686. _result = dara.String(strings.Replace(dara.StringValue(_result), "<suffix>", "", 1))
  687. } else {
  688. _result = dara.String(strings.Replace(dara.StringValue(_result),
  689. "<suffix>", "-"+dara.StringValue(suffix), 1))
  690. }
  691. return _result, nil
  692. }
  693. func ToArray(in interface{}) []map[string]interface{} {
  694. tmp := make([]map[string]interface{}, 0)
  695. if dara.IsNil(in) {
  696. return nil
  697. }
  698. byt, _ := json.Marshal(in)
  699. d := json.NewDecoder(bytes.NewReader(byt))
  700. d.UseNumber()
  701. err := d.Decode(&tmp)
  702. if err != nil {
  703. return nil
  704. }
  705. return tmp
  706. }
  707. func GetEndpoint(endpoint *string, server *bool, endpointType *string) *string {
  708. if dara.StringValue(endpointType) == "internal" {
  709. strs := strings.Split(dara.StringValue(endpoint), ".")
  710. strs[0] += "-internal"
  711. endpoint = dara.String(strings.Join(strs, "."))
  712. }
  713. if dara.BoolValue(server) && dara.StringValue(endpointType) == "accelerate" {
  714. return dara.String("oss-accelerate.aliyuncs.com")
  715. }
  716. return endpoint
  717. }
  718. func toJSONString(a interface{}) *string {
  719. switch v := a.(type) {
  720. case *string:
  721. return v
  722. case string:
  723. return dara.String(v)
  724. case []byte:
  725. return dara.String(string(v))
  726. case io.Reader:
  727. byt, err := ioutil.ReadAll(v)
  728. if err != nil {
  729. return nil
  730. }
  731. return dara.String(string(byt))
  732. }
  733. byt := bytes.NewBuffer([]byte{})
  734. jsonEncoder := json.NewEncoder(byt)
  735. jsonEncoder.SetEscapeHTML(false)
  736. if err := jsonEncoder.Encode(a); err != nil {
  737. return nil
  738. }
  739. return dara.String(string(bytes.TrimSpace(byt.Bytes())))
  740. }
  741. func StringifyMapValue(a map[string]interface{}) map[string]*string {
  742. res := make(map[string]*string)
  743. for key, value := range a {
  744. if value != nil {
  745. res[key] = toJSONString(value)
  746. }
  747. }
  748. return res
  749. }