@@ -36,7 +36,8 @@ type Signer struct {
36
36
AccessKeyID string
37
37
SecretAccessKey string
38
38
39
- BuiltURL string
39
+ BuiltURL string
40
+ BuiltForm string
40
41
}
41
42
42
43
// WriteSignature calculates signature and write it to http request.
@@ -47,11 +48,12 @@ func (is *Signer) WriteSignature(request *http.Request) error {
47
48
}
48
49
49
50
newRequest , err := http .NewRequest (request .Method ,
50
- request .URL .Scheme + "://" + request .URL .Host + is .BuiltURL , nil )
51
+ request .URL .Scheme + "://" + request .URL .Host + is .BuiltURL , strings . NewReader ( is . BuiltForm ) )
51
52
if err != nil {
52
53
return err
53
54
}
54
55
request .URL = newRequest .URL
56
+ request .Body = newRequest .Body
55
57
56
58
logger .Info (fmt .Sprintf (
57
59
"Signed QingCloud request: [%d] %s" ,
@@ -79,42 +81,52 @@ func (is *Signer) BuildSignature(request *http.Request) (string, error) {
79
81
"QingCloud signature: [%d] %s" ,
80
82
utils .StringToUnixInt (request .Header .Get ("Date" ), "RFC 822" ),
81
83
signature ))
82
-
83
- is .BuiltURL += "&signature=" + signature
84
+ if request .Method == "GET" {
85
+ is .BuiltURL += "&signature=" + signature
86
+ } else if request .Method == "POST" {
87
+ is .BuiltForm += "&signature=" + signature
88
+ }
84
89
85
90
return signature , nil
86
91
}
87
92
88
93
// BuildStringToSign build the string to sign.
89
94
func (is * Signer ) BuildStringToSign (request * http.Request ) (string , error ) {
90
- query := request .URL .Query ()
91
-
92
- query .Set ("access_key_id" , is .AccessKeyID )
93
- query .Set ("signature_method" , "HmacSHA256" )
94
- query .Set ("signature_version" , "1" )
95
+ if request .Method == "GET" {
96
+ return is .BuildStringToSignByValues (request .Header .Get ("Date" ), request .Method , request .URL .Path , request .URL .Query ())
97
+ } else if request .Method == "POST" {
98
+ return is .BuildStringToSignByValues (request .Header .Get ("Date" ), request .Method , request .URL .Path , request .Form )
99
+ }
100
+ return "" , fmt .Errorf ("Requset Type Not Support For Sign " )
101
+ }
102
+ // BuildStringToSignByValues build the string to sign.
103
+ func (is * Signer ) BuildStringToSignByValues (requestDate string , requestMethod string , requestPath string , requestParams url.Values ) (string , error ) {
104
+ requestParams .Set ("access_key_id" , is .AccessKeyID )
105
+ requestParams .Set ("signature_method" , "HmacSHA256" )
106
+ requestParams .Set ("signature_version" , "1" )
95
107
96
108
var timeValue time.Time
97
- if request . Header . Get ( "Date" ) != "" {
109
+ if requestDate != "" {
98
110
var err error
99
- timeValue , err = utils .StringToTime (request . Header . Get ( "Date" ) , "RFC 822" )
111
+ timeValue , err = utils .StringToTime (requestDate , "RFC 822" )
100
112
if err != nil {
101
113
return "" , err
102
114
}
103
115
} else {
104
116
timeValue = time .Now ()
105
117
}
106
- query .Set ("time_stamp" , utils .TimeToString (timeValue , "ISO 8601" ))
118
+ requestParams .Set ("time_stamp" , utils .TimeToString (timeValue , "ISO 8601" ))
107
119
108
120
keys := []string {}
109
- for key := range query {
121
+ for key := range requestParams {
110
122
keys = append (keys , key )
111
123
}
112
124
113
125
sort .Strings (keys )
114
126
115
127
parts := []string {}
116
128
for _ , key := range keys {
117
- values := query [key ]
129
+ values := requestParams [key ]
118
130
if len (values ) > 0 {
119
131
if values [0 ] != "" {
120
132
value := strings .TrimSpace (strings .Join (values , "" ))
@@ -131,14 +143,19 @@ func (is *Signer) BuildStringToSign(request *http.Request) (string, error) {
131
143
132
144
urlParams := strings .Join (parts , "&" )
133
145
134
- stringToSign := request . Method + "\n " + request . URL . Path + "\n " + urlParams
146
+ stringToSign := requestMethod + "\n " + requestPath + "\n " + urlParams
135
147
136
148
logger .Debug (fmt .Sprintf (
137
- "QingCloud string to sign: [%d] %s" ,
138
- utils .StringToUnixInt (request .Header .Get ("Date" ), "RFC 822" ),
149
+ "QingCloud string to sign: %s" ,
139
150
stringToSign ))
140
151
141
- is .BuiltURL = request .URL .Path + "?" + urlParams
152
+ if requestMethod == "GET" {
153
+ is .BuiltURL = requestPath + "?" + urlParams
154
+ is .BuiltForm = ""
155
+ } else if requestMethod == "POST" {
156
+ is .BuiltURL = requestPath
157
+ is .BuiltForm = urlParams
158
+ }
142
159
143
160
return stringToSign , nil
144
161
}
0 commit comments