Skip to content

Commit 6f4d171

Browse files
authored
Merge pull request #37 from Rigor/rs-better-querystrings
Introduce a new pattern for passing querystring values as a hash
2 parents 919dd13 + d7b2cfd commit 6f4d171

File tree

4 files changed

+33
-14
lines changed

4 files changed

+33
-14
lines changed

lib/fog/aliyun/compute.rb

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,20 @@ def defaultAliyunUri(action, sigNonce, time)
351351
'?Format=JSON&AccessKeyId=' + @aliyun_accesskey_id + '&Action=' + action + '&SignatureMethod=HMAC-SHA1&RegionId=' + @aliyun_region_id + '&SignatureNonce=' + sigNonce + '&SignatureVersion=1.0&Version=2014-05-26&Timestamp=' + urlTimeFormat
352352
end
353353

354+
def defaultAliyunQueryParameters(action, sigNonce, time)
355+
{
356+
Format: 'JSON',
357+
AccessKeyId: @aliyun_accesskey_id,
358+
Action: action,
359+
SignatureMethod: 'HMAC-SHA1',
360+
RegionId: @aliyun_region_id,
361+
SignatureNonce: sigNonce,
362+
SignatureVersion: '1.0',
363+
Version: '2014-05-26',
364+
Timestamp: time.strftime('%Y-%m-%dT%H:%M:%SZ')
365+
}
366+
end
367+
354368
def defaultAliyunVPCUri(action, sigNonce, time)
355369
parTimeFormat = time.strftime('%Y-%m-%dT%H:%M:%SZ')
356370
urlTimeFormat = URI.encode(parTimeFormat, ':')
@@ -399,7 +413,14 @@ def defalutVPCParameters(action, sigNonce, time)
399413
end
400414

401415
# compute signature
416+
# This method should be considered deprecated and replaced with sign_without_encoding, which is better for using querystring hashes and not
417+
# building querystrings with string concatination.
402418
def sign(accessKeySecret, parameters)
419+
signature = sign_without_encoding(accessKeySecret, parameters)
420+
URI.encode(signature, '/[^!*\'()\;?:@#&%=+$,{}[]<>`" ')
421+
end
422+
423+
def sign_without_encoding(accessKeySecret, parameters)
403424
sortedParameters = parameters.sort
404425
canonicalizedQueryString = ''
405426
sortedParameters.each do |k, v|
@@ -414,9 +435,7 @@ def sign(accessKeySecret, parameters)
414435
digest = OpenSSL::HMAC.digest(digVer, key, stringToSign)
415436
signature = Base64.encode64(digest)
416437
signature[-1] = ''
417-
encodedSig = URI.encode(signature, '/[^!*\'()\;?:@#&%=+$,{}[]<>`" ')
418-
419-
encodedSig
438+
signature
420439
end
421440
end
422441
end

lib/fog/aliyun/models/compute/server.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class Server < Fog::Compute::Server
3636
attribute :expired_at, aliases: 'ExpiredTime'
3737

3838
def image
39-
requires image_id
39+
requires :image_id
4040
Fog::Compute::Aliyun::Image.new(service: service).all(imageId: image_id)[0]
4141
end
4242

lib/fog/aliyun/requests/compute/list_server_types.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def get_instance_type(cpuCount, memorySize)
4141
)
4242

4343
_InstanceTypeId = nil
44-
_InstanceTypeList = Fog::JSON.decode(response.body)['InstanceTypes']['InstanceType']
44+
_InstanceTypeList = response.body['InstanceTypes']['InstanceType']
4545
_InstanceTypeList.each do |instance_type|
4646
next unless (instance_type['CpuCoreCount'] == cpuCount) && (instance_type['MemorySize'] == memorySize)
4747
_InstanceTypeId = instance_type['InstanceTypeId']

lib/fog/aliyun/requests/compute/list_servers.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def list_servers(options = {})
1111
_time = Time.new.utc
1212

1313
_parameters = defalutParameters(_action, _sigNonce, _time)
14-
_pathURL = defaultAliyunUri(_action, _sigNonce, _time)
14+
_query_parameters = defaultAliyunQueryParameters(_action, _sigNonce, _time)
1515

1616
_InstanceId = options[:instanceId]
1717
_VpcId = options[:vpcId]
@@ -22,35 +22,35 @@ def list_servers(options = {})
2222
unless _InstanceId.nil?
2323
_InstanceStr = "[\"#{_InstanceId}\"]"
2424
_parameters['InstanceIds'] = _InstanceStr
25-
_pathURL += '&InstanceIds=' + _InstanceStr
25+
_query_parameters[:InstanceIds] = _InstanceStr
2626
end
2727

2828
unless _VpcId.nil?
2929
_parameters['VpcId'] = _VpcId
30-
_pathURL += '&VpcId=' + _VpcId
30+
_query_parameters[:VpcId] = _VpcId
3131
end
3232

3333
unless _SecurityGroupId.nil?
3434
_parameters['SecurityGroupId'] = _SecurityGroupId
35-
_pathURL += '&SecurityGroupId=' + _SecurityGroupId
35+
_query_parameters[:SecurityGroupId] = _SecurityGroupId
3636
end
3737

3838
unless _PageNumber.nil?
3939
_parameters['PageNumber'] = _PageNumber
40-
_pathURL += '&PageNumber=' + _PageNumber
40+
_query_parameters[:PageNumber] = _PageNumber
4141
end
4242

4343
_PageSize ||= '50'
4444
_parameters['PageSize'] = _PageSize
45-
_pathURL += '&PageSize=' + _PageSize
45+
_query_parameters[:PageSize] = _PageSize
4646

47-
_signature = sign(@aliyun_accesskey_secret, _parameters)
48-
_pathURL += '&Signature=' + _signature
47+
_signature = sign_without_encoding(@aliyun_accesskey_secret, _parameters)
48+
_query_parameters[:Signature] = _signature
4949

5050
request(
5151
expects: [200, 203],
5252
method: 'GET',
53-
path: _pathURL
53+
query: _query_parameters
5454
)
5555
end
5656
end

0 commit comments

Comments
 (0)