fix bug
Signed-off-by: jagger <cossjie@foxmail.com> Former-commit-id: 1178ca75f5121fac9b359c005d8e2a34da5dca00
This commit is contained in:
parent
48a3fc718e
commit
21f5919396
|
@ -2,12 +2,12 @@ package inference
|
||||||
|
|
||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
"APIGW-go-sdk/core"
|
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/JCCE-nudt/apigw-go-sdk/core"
|
||||||
"github.com/go-resty/resty/v2"
|
"github.com/go-resty/resty/v2"
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/schedulers/option"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/schedulers/option"
|
||||||
|
|
1
go.mod
1
go.mod
|
@ -7,6 +7,7 @@ toolchain go1.22.4
|
||||||
retract v0.1.20-0.20240319015239-6ae13da05255
|
retract v0.1.20-0.20240319015239-6ae13da05255
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/JCCE-nudt/apigw-go-sdk v0.0.0-20230525025609-34159d6f2818
|
||||||
github.com/Masterminds/squirrel v1.5.4
|
github.com/Masterminds/squirrel v1.5.4
|
||||||
github.com/bwmarrin/snowflake v0.3.0
|
github.com/bwmarrin/snowflake v0.3.0
|
||||||
github.com/ghodss/yaml v1.0.0
|
github.com/ghodss/yaml v1.0.0
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -38,6 +38,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
|
||||||
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
|
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
|
||||||
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
|
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
|
||||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||||
|
github.com/JCCE-nudt/apigw-go-sdk v0.0.0-20230525025609-34159d6f2818 h1:QLulhUyxPDs9FFieVZwmKAnUBLeRDhsVNehotAAL/FE=
|
||||||
|
github.com/JCCE-nudt/apigw-go-sdk v0.0.0-20230525025609-34159d6f2818/go.mod h1:j+am5/1URgsvyhOAyURFR9vH3malaW7Tq6d33OyPsnM=
|
||||||
github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM=
|
github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM=
|
||||||
github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
|
github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
|
||||||
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
|
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
// based on https://github.com/golang/go/blob/master/src/net/url/url.go
|
||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package core
|
||||||
|
|
||||||
|
func shouldEscape(c byte) bool {
|
||||||
|
if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '_' || c == '-' || c == '~' || c == '.' {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
func escape(s string) string {
|
||||||
|
hexCount := 0
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
c := s[i]
|
||||||
|
if shouldEscape(c) {
|
||||||
|
hexCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if hexCount == 0 {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
t := make([]byte, len(s)+2*hexCount)
|
||||||
|
j := 0
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
switch c := s[i]; {
|
||||||
|
case shouldEscape(c):
|
||||||
|
t[j] = '%'
|
||||||
|
t[j+1] = "0123456789ABCDEF"[c>>4]
|
||||||
|
t[j+2] = "0123456789ABCDEF"[c&15]
|
||||||
|
j += 3
|
||||||
|
default:
|
||||||
|
t[j] = s[i]
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return string(t)
|
||||||
|
}
|
|
@ -0,0 +1,201 @@
|
||||||
|
// HWS API Gateway Signature
|
||||||
|
// based on https://github.com/datastream/aws/blob/master/signv4.go
|
||||||
|
// Copyright (c) 2014, Xianjie
|
||||||
|
|
||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/hmac"
|
||||||
|
"crypto/sha256"
|
||||||
|
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
DateFormat = "20060102T150405Z"
|
||||||
|
SignAlgorithm = "SDK-HMAC-SHA256"
|
||||||
|
HeaderXDateTime = "X-Sdk-Date"
|
||||||
|
HeaderXHost = "host"
|
||||||
|
HeaderXAuthorization = "Authorization"
|
||||||
|
HeaderXContentSha256 = "X-Sdk-Content-Sha256"
|
||||||
|
)
|
||||||
|
|
||||||
|
func hmacsha256(keyByte []byte, dataStr string) ([]byte, error) {
|
||||||
|
hm := hmac.New(sha256.New, []byte(keyByte))
|
||||||
|
if _, err := hm.Write([]byte(dataStr)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return hm.Sum(nil), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build a CanonicalRequest from a regular request string
|
||||||
|
func CanonicalRequest(request *http.Request, signedHeaders []string) (string, error) {
|
||||||
|
var hexencode string
|
||||||
|
var err error
|
||||||
|
if hex := request.Header.Get(HeaderXContentSha256); hex != "" {
|
||||||
|
hexencode = hex
|
||||||
|
} else {
|
||||||
|
bodyData, err := RequestPayload(request)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
hexencode, err = HexEncodeSHA256Hash(bodyData)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s", request.Method, CanonicalURI(request), CanonicalQueryString(request), CanonicalHeaders(request, signedHeaders), strings.Join(signedHeaders, ";"), hexencode), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CanonicalURI returns request uri
|
||||||
|
func CanonicalURI(request *http.Request) string {
|
||||||
|
pattens := strings.Split(request.URL.Path, "/")
|
||||||
|
var uriSlice []string
|
||||||
|
for _, v := range pattens {
|
||||||
|
uriSlice = append(uriSlice, escape(v))
|
||||||
|
}
|
||||||
|
urlpath := strings.Join(uriSlice, "/")
|
||||||
|
if len(urlpath) == 0 || urlpath[len(urlpath)-1] != '/' {
|
||||||
|
urlpath = urlpath + "/"
|
||||||
|
}
|
||||||
|
return urlpath
|
||||||
|
}
|
||||||
|
|
||||||
|
// CanonicalQueryString
|
||||||
|
func CanonicalQueryString(request *http.Request) string {
|
||||||
|
var keys []string
|
||||||
|
queryMap := request.URL.Query()
|
||||||
|
for key := range queryMap {
|
||||||
|
keys = append(keys, key)
|
||||||
|
}
|
||||||
|
sort.Strings(keys)
|
||||||
|
var query []string
|
||||||
|
for _, key := range keys {
|
||||||
|
k := escape(key)
|
||||||
|
sort.Strings(queryMap[key])
|
||||||
|
for _, v := range queryMap[key] {
|
||||||
|
kv := fmt.Sprintf("%s=%s", k, escape(v))
|
||||||
|
query = append(query, kv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
queryStr := strings.Join(query, "&")
|
||||||
|
request.URL.RawQuery = queryStr
|
||||||
|
return queryStr
|
||||||
|
}
|
||||||
|
|
||||||
|
// CanonicalHeaders
|
||||||
|
func CanonicalHeaders(request *http.Request, signerHeaders []string) string {
|
||||||
|
var canonicalHeaders []string
|
||||||
|
header := make(map[string][]string)
|
||||||
|
for k, v := range request.Header {
|
||||||
|
header[strings.ToLower(k)] = v
|
||||||
|
}
|
||||||
|
for _, key := range signerHeaders {
|
||||||
|
value := header[key]
|
||||||
|
if strings.EqualFold(key, HeaderXHost) {
|
||||||
|
value = []string{request.Host}
|
||||||
|
}
|
||||||
|
sort.Strings(value)
|
||||||
|
for _, v := range value {
|
||||||
|
canonicalHeaders = append(canonicalHeaders, key+":"+strings.TrimSpace(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s\n", strings.Join(canonicalHeaders, "\n"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// SignedHeaders
|
||||||
|
func SignedHeaders(r *http.Request) []string {
|
||||||
|
var signedHeaders []string
|
||||||
|
for key := range r.Header {
|
||||||
|
signedHeaders = append(signedHeaders, strings.ToLower(key))
|
||||||
|
}
|
||||||
|
sort.Strings(signedHeaders)
|
||||||
|
return signedHeaders
|
||||||
|
}
|
||||||
|
|
||||||
|
// RequestPayload
|
||||||
|
func RequestPayload(request *http.Request) ([]byte, error) {
|
||||||
|
if request.Body == nil {
|
||||||
|
return []byte(""), nil
|
||||||
|
}
|
||||||
|
bodyByte, err := ioutil.ReadAll(request.Body)
|
||||||
|
if err != nil {
|
||||||
|
return []byte(""), err
|
||||||
|
}
|
||||||
|
request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyByte))
|
||||||
|
return bodyByte, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a "String to Sign".
|
||||||
|
func StringToSign(canonicalRequest string, t time.Time) (string, error) {
|
||||||
|
hashStruct := sha256.New()
|
||||||
|
_, err := hashStruct.Write([]byte(canonicalRequest))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s\n%s\n%x",
|
||||||
|
SignAlgorithm, t.UTC().Format(DateFormat), hashStruct.Sum(nil)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the HWS Signature.
|
||||||
|
func SignStringToSign(stringToSign string, signingKey []byte) (string, error) {
|
||||||
|
hmsha, err := hmacsha256(signingKey, stringToSign)
|
||||||
|
return fmt.Sprintf("%x", hmsha), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// HexEncodeSHA256Hash returns hexcode of sha256
|
||||||
|
func HexEncodeSHA256Hash(body []byte) (string, error) {
|
||||||
|
hashStruct := sha256.New()
|
||||||
|
if len(body) == 0 {
|
||||||
|
body = []byte("")
|
||||||
|
}
|
||||||
|
_, err := hashStruct.Write(body)
|
||||||
|
return fmt.Sprintf("%x", hashStruct.Sum(nil)), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the finalized value for the "Authorization" header. The signature parameter is the output from SignStringToSign
|
||||||
|
func AuthHeaderValue(signatureStr, accessKeyStr string, signedHeaders []string) string {
|
||||||
|
return fmt.Sprintf("%s Access=%s, SignedHeaders=%s, Signature=%s", SignAlgorithm, accessKeyStr, strings.Join(signedHeaders, ";"), signatureStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Signature HWS meta
|
||||||
|
type Signer struct {
|
||||||
|
Key string
|
||||||
|
Secret string
|
||||||
|
}
|
||||||
|
|
||||||
|
// SignRequest set Authorization header
|
||||||
|
func (s *Signer) Sign(request *http.Request) error {
|
||||||
|
var t time.Time
|
||||||
|
var err error
|
||||||
|
var date string
|
||||||
|
if date = request.Header.Get(HeaderXDateTime); date != "" {
|
||||||
|
t, err = time.Parse(DateFormat, date)
|
||||||
|
}
|
||||||
|
if err != nil || date == "" {
|
||||||
|
t = time.Now()
|
||||||
|
request.Header.Set(HeaderXDateTime, t.UTC().Format(DateFormat))
|
||||||
|
}
|
||||||
|
signedHeaders := SignedHeaders(request)
|
||||||
|
canonicalRequest, err := CanonicalRequest(request, signedHeaders)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
stringToSignStr, err := StringToSign(canonicalRequest, t)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
signatureStr, err := SignStringToSign(stringToSignStr, []byte(s.Secret))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
authValueStr := AuthHeaderValue(signatureStr, s.Key, signedHeaders)
|
||||||
|
request.Header.Set(HeaderXAuthorization, authValueStr)
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -2,6 +2,9 @@
|
||||||
## explicit; go 1.20
|
## explicit; go 1.20
|
||||||
filippo.io/edwards25519
|
filippo.io/edwards25519
|
||||||
filippo.io/edwards25519/field
|
filippo.io/edwards25519/field
|
||||||
|
# github.com/JCCE-nudt/apigw-go-sdk v0.0.0-20230525025609-34159d6f2818
|
||||||
|
## explicit; go 1.17
|
||||||
|
github.com/JCCE-nudt/apigw-go-sdk/core
|
||||||
# github.com/Masterminds/squirrel v1.5.4
|
# github.com/Masterminds/squirrel v1.5.4
|
||||||
## explicit; go 1.14
|
## explicit; go 1.14
|
||||||
github.com/Masterminds/squirrel
|
github.com/Masterminds/squirrel
|
||||||
|
|
Loading…
Reference in New Issue