diff --git a/sdk/client.go b/sdk/client.go index 47bde20..48d55cc 100644 --- a/sdk/client.go +++ b/sdk/client.go @@ -44,6 +44,27 @@ type Client struct { httpProxy string httpsProxy string noProxy string + + header *requests.RefererHeader +} + +func (client *Client) SetRefererHeader(header *requests.RefererHeader) { + client.header = header +} + +func (client *Client) getRefererHeader() map[string]string { + var header *requests.RefererHeader + if client.header == nil { + header = &requests.RefererHeader{ + TraceId: utils.MakeTraceId(), + } + } else { + header = client.header + } + return map[string]string{ + "Referer": header.Referer, + "Traceparent": header.TraceId, + } } func (client *Client) GetNoProxy() string { @@ -216,7 +237,7 @@ func (client *Client) DoAction(request requests.AcsRequest, response responses.A } func (client *Client) DoActionWithSigner(request requests.AcsRequest, response responses.AcsResponse, signer auth.Signer) (err error) { - + request.AddHeaders(client.getRefererHeader()) httpRequest, err := client.buildRequestWithSigner(request, signer) if err != nil { return err diff --git a/sdk/requests/request.go b/sdk/requests/request.go index e6fc33f..740921b 100644 --- a/sdk/requests/request.go +++ b/sdk/requests/request.go @@ -55,6 +55,11 @@ type Host struct { Func func(string, string) string } +type RefererHeader struct { + Referer string + TraceId string +} + var debug utils.Debug func init() { @@ -96,6 +101,7 @@ type AcsRequest interface { GetBodyReader() io.Reader AddHeaderParam(key, value string) + AddHeaders(headers map[string]string) addQueryParam(key, value string) addFormParam(key, value string) addJsonParam(string, interface{}) @@ -236,6 +242,12 @@ func (request *baseRequest) AddHeaderParam(key, val string) { request.Headers[key] = val } +func (request *baseRequest) AddHeaders(headers map[string]string) { + for key, val := range headers { + request.Headers[key] = val + } +} + func (request *baseRequest) addQueryParam(key, val string) { request.QueryParams[key] = val } diff --git a/sdk/utils/random/str_random.go b/sdk/utils/random/str_random.go new file mode 100644 index 0000000..e5c3be6 --- /dev/null +++ b/sdk/utils/random/str_random.go @@ -0,0 +1,69 @@ +package random + +import ( + "math/rand" + "time" + "unsafe" +) + +type Mode int // 随机数模式 + +const ( + Letter Mode = iota + Number + LetterNumber + LetterHex +) + +const ( + letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + numbers = "0123456789" + lettersHex = "0123456789abcdef" + letterIdBit = 6 + letterIdxMask = 1<= 0; { + if remain == 0 { + cache, remain = src.Int63(), letterIdxMax + } + if idx := int(cache & letterIdxMask); idx < len(baseStr) { + b[i] = baseStr[idx] + i-- + } + cache >>= letterIdBit + remain-- + } + return *(*string)(unsafe.Pointer(&b)) +} diff --git a/sdk/utils/utils.go b/sdk/utils/utils.go index c655962..60288fa 100644 --- a/sdk/utils/utils.go +++ b/sdk/utils/utils.go @@ -5,8 +5,8 @@ import ( "crypto/rand" "encoding/hex" "fmt" + "golib.gaore.com/GaoreGo/haiwai-common-sdk-go/sdk/utils/random" "hash" - rand2 "math/rand" "net/url" "reflect" "sort" @@ -36,11 +36,7 @@ func NewUUID() UUID { } func RandStringBytes(n int) string { - b := make([]byte, n) - for i := range b { - b[i] = letterBytes[rand2.Intn(len(letterBytes))] - } - return string(b) + return random.StrRandom(int64(n)) } func newFromHash(h hash.Hash, ns UUID, name string) UUID { @@ -109,3 +105,12 @@ func InitStructWithDefaultTag(bean interface{}) { } } } + +func Md5(data string) string { + s := md5.Sum([]byte(data)) + return hex.EncodeToString(s[:]) +} + +func MakeTraceId() string { + return fmt.Sprintf("00-%s-%s-01", random.Random(32, random.LetterHex), random.Random(16, random.LetterHex)) +} diff --git a/services/ip/client.go b/services/ip/client.go index ca90cec..8506c2d 100644 --- a/services/ip/client.go +++ b/services/ip/client.go @@ -11,7 +11,7 @@ const ( ) var HOST = requests.Host{ - Default: "ip.gaore.com", + Default: "ip.gaore.com.hk", Func: func(s string, area string) string { if area != "" { fmt.Println("ip.gaore.com." + area)