Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit afa47fe

Browse files
fix signature error when value contains spaces
1 parent 0178f86 commit afa47fe

File tree

3 files changed

+28
-23
lines changed

3 files changed

+28
-23
lines changed

‎lib/rpc_client.rb‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,23 @@ def request(action:, params: {}, opts: {})
3636
signature = Base64.encode64(OpenSSL::HMAC.digest('sha1', key, string_to_sign)).strip
3737
normalized.push(['Signature', encode(signature)])
3838

39-
uri = opts[:method] == 'POST' ? '/' : "/?#{canonicalize(normalized)}"
39+
querystring = canonicalize(normalized)
40+
41+
uri = opts[:method] == 'POST' ? '/' : "/?#{querystring}"
42+
4043
response = connection.send(method.downcase, uri) do |request|
4144
if opts[:method] == 'POST'
4245
request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
43-
request.body = canonicalize(normalized)
46+
request.body = querystring
4447
end
4548
end
49+
4650
response_body = JSON.parse(response.body)
4751
if response_body['Code'] && !self.codes.include?(response_body['Code'])
4852
raise StandardError, "#{response_body['Message']}, URL: #{uri}"
4953
end
50-
response
54+
55+
response_body
5156
end
5257

5358
private
@@ -71,7 +76,8 @@ def default_params
7176
end
7277

7378
def encode(string)
74-
CGI.escape string
79+
encoded = CGI.escape string
80+
encoded.gsub(/[\+]/, '%20')
7581
end
7682

7783
def format_params(param_hash)

‎spec/rpc_client_integration_spec.rb‎

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,24 @@
1919
params = { key: (1..11).to_a.map(&:to_s) }
2020
request_option = { method: 'POST', timeout: 15000 }
2121
response = rpc_client.request(action: 'DescribeRegions', params: params, opts: request_option)
22-
response_body = JSON.parse(response.body)
23-
expect(response_body.keys.include?('Regions')).to be true
24-
expect(response_body.keys.include?('RequestId')).to be true
22+
expect(response.keys.include?('Regions')).to be true
23+
expect(response.keys.include?('RequestId')).to be true
2524
end
2625

2726
it 'should ok with repeat list less 10 item' do
2827
params = { key: (1..9).to_a.map(&:to_s) }
2928
request_option = { method: 'POST', timeout: 15000 }
3029
response = rpc_client.request(action: 'DescribeRegions', params: params, opts: request_option)
31-
response_body = JSON.parse(response.body)
32-
expect(response_body.keys.include?('Regions')).to be true
33-
expect(response_body.keys.include?('RequestId')).to be true
30+
expect(response.keys.include?('Regions')).to be true
31+
expect(response.keys.include?('RequestId')).to be true
3432
end
33+
34+
it 'should ok with space' do
35+
params = { key: 'the string with spaces' }
36+
request_option = { method: 'POST', timeout: 15000 }
37+
response = rpc_client.request(action: 'DescribeRegions', params: params, opts: request_option)
38+
expect(response.keys.include?('Regions')).to be true
39+
expect(response.keys.include?('RequestId')).to be true
40+
end
41+
3542
end

‎spec/rpc_client_spec.rb‎

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
access_key_secret: 'access_key_secret',
109109
)
110110
stub_request(:get, /https:\/\/ecs.aliyuncs.com/).to_return(status: 200, body: {}.to_json)
111-
expect(rpc_client.request(action: 'action').body).to eq({}.to_json)
111+
expect(rpc_client.request(action: 'action')).to eql({})
112112
end
113113
end
114114

@@ -126,33 +126,25 @@
126126

127127
it 'should ok' do
128128
stub_request(:get, /https:\/\/ecs.aliyuncs.com/).to_return(status: 200, body: {}.to_json)
129-
expect(rpc_client.request(action: 'action').body).to eq({}.to_json)
129+
expect(rpc_client.request(action: 'action')).to eql({})
130130
end
131131

132132
it 'should ok with format_action' do
133133
stub_request(:get, /https:\/\/ecs.aliyuncs.com/).to_return(status: 200, body: {}.to_json)
134134
response = rpc_client.request(action: 'action', opts: { format_action: false })
135-
expect(response.body).to eq({}.to_json)
135+
expect(response).to eql({})
136136
end
137137

138138
it 'should ok with format_params' do
139139
stub_request(:get, /https:\/\/ecs.aliyuncs.com/).to_return(status: 200, body: {}.to_json)
140140
response = rpc_client.request(action: 'action', opts: { format_params: false })
141-
expect(response.body).to eq({}.to_json)
141+
expect(response).to eql({})
142142
end
143143

144144
it 'get with raw body should ok' do
145145
stub_request(:post, "https://ecs.aliyuncs.com").to_return(status: 200, body: {}.to_json)
146146
response = rpc_client.request(action: 'action', opts: { method: 'POST' })
147-
expect(response.body).to eq({}.to_json)
148-
end
149-
150-
it 'get with verbose should ok' do
151-
stub_request(:get, /https:\/\/ecs.aliyuncs.com/).to_return(status: 200, body: {}.to_json)
152-
response = rpc_client.request(action: 'action')
153-
expect(response.status).to eq 200
154-
expect(response.success?).to be true
155-
expect(response.body).to eq({}.to_json)
147+
expect(response).to eql({})
156148
end
157149
end
158150

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /