savon 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,11 @@
1
+ ## 2.0.2 (2012-12-20)
2
+
3
+ * Fix: [#297](https://github.com/savonrb/savon/issues/297#issuecomment-11536517) added the global
4
+ `:ssl_verify_mode` and `:ssl_version` options which were missing.
5
+
6
+ * Fix: [#344](https://github.com/savonrb/savon/issues/344) added missing global ssl cert options
7
+ `:ssl_cert_file`, `:ssl_cert_key_file` and `:ssl_ca_cert_file`.
8
+
1
9
  ## 2.0.1 (2012-12-19)
2
10
 
3
11
  * Fix [#342](https://github.com/savonrb/savon/issues/342) fixes an issue where namespaces could
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
1
  source :rubygems
2
2
  gemspec
3
3
 
4
- gem "httpclient", "~> 2.1.5"
4
+ gem "httpclient", "~> 2.3.0"
@@ -180,6 +180,31 @@ module Savon
180
180
  @options[:last_response] = last_response
181
181
  end
182
182
 
183
+ # Specifies the SSL version to use.
184
+ def ssl_version(version)
185
+ @options[:ssl_version] = version
186
+ end
187
+
188
+ # Whether and how to to verify the connection.
189
+ def ssl_verify_mode(verify_mode)
190
+ @options[:ssl_verify_mode] = verify_mode
191
+ end
192
+
193
+ # Sets the cert key file to use.
194
+ def ssl_cert_key_file(file)
195
+ @options[:ssl_cert_key_file] = file
196
+ end
197
+
198
+ # Sets the cert file to use.
199
+ def ssl_cert_file(file)
200
+ @options[:ssl_cert_file] = file
201
+ end
202
+
203
+ # Sets the ca cert file to use.
204
+ def ssl_ca_cert_file(file)
205
+ @options[:ssl_ca_cert_file] = file
206
+ end
207
+
183
208
  # HTTP basic auth credentials.
184
209
  def basic_auth(*credentials)
185
210
  @options[:basic_auth] = credentials.flatten
@@ -36,22 +36,45 @@ module Savon
36
36
 
37
37
  def create_http_client
38
38
  http = HTTPI::Request.new
39
- http.url = @globals[:endpoint] || @wsdl.endpoint
40
39
 
40
+ configure_request(http)
41
+ configure_timeouts(http)
42
+ configure_headers(http)
43
+ configure_ssl(http)
44
+ configure_auth(http)
45
+
46
+ http
47
+ end
48
+
49
+ def configure_request(http)
50
+ http.url = @globals[:endpoint] || @wsdl.endpoint
41
51
  http.proxy = @globals[:proxy] if @globals.include? :proxy
42
52
  http.set_cookies @globals[:last_response] if @globals.include? :last_response
53
+ end
43
54
 
55
+ def configure_timeouts(http)
44
56
  http.open_timeout = @globals[:open_timeout] if @globals.include? :open_timeout
45
57
  http.read_timeout = @globals[:read_timeout] if @globals.include? :read_timeout
58
+ end
46
59
 
60
+ def configure_headers(http)
47
61
  http.headers = @globals[:headers] if @globals.include? :headers
48
62
  http.headers["SOAPAction"] ||= %{"#{soap_action}"} if soap_action
49
63
  http.headers["Content-Type"] = CONTENT_TYPE[@globals[:soap_version]] % @globals[:encoding]
64
+ end
50
65
 
66
+ def configure_ssl(http)
67
+ http.auth.ssl.ssl_version = @globals[:ssl_version] if @globals.include? :ssl_version
68
+ http.auth.ssl.verify_mode = @globals[:ssl_verify_mode] if @globals.include? :ssl_verify_mode
69
+
70
+ http.auth.ssl.cert_key_file = @globals[:ssl_cert_key_file] if @globals.include? :ssl_cert_key_file
71
+ http.auth.ssl.cert_file = @globals[:ssl_cert_file] if @globals.include? :ssl_cert_file
72
+ http.auth.ssl.ca_cert_file = @globals[:ssl_ca_cert_file] if @globals.include? :ssl_ca_cert_file
73
+ end
74
+
75
+ def configure_auth(http)
51
76
  http.auth.basic(*@globals[:basic_auth]) if @globals.include? :basic_auth
52
77
  http.auth.digest(*@globals[:digest_auth]) if @globals.include? :digest_auth
53
-
54
- http
55
78
  end
56
79
 
57
80
  def soap_action
@@ -1,5 +1,5 @@
1
1
  module Savon
2
2
 
3
- VERSION = "2.0.1"
3
+ VERSION = "2.0.2"
4
4
 
5
5
  end
@@ -0,0 +1,16 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIICbTCCAdYCCQDC4v8d04615DANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJE
3
+ RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzEOMAwGA1UEChMF
4
+ aHR0cGkxFDASBgNVBAMTC2V4YW1wbGUuY29tMSIwIAYJKoZIhvcNAQkBFhNleGFt
5
+ cGxlQGV4YW1wbGUuY29tMB4XDTEwMTAxNTE4NTg0N1oXDTExMTAxNTE4NTg0N1ow
6
+ ezELMAkGA1UEBhMCREUxEDAOBgNVBAgTB0hhbWJ1cmcxEDAOBgNVBAcTB0hhbWJ1
7
+ cmcxDjAMBgNVBAoTBWh0dHBpMRQwEgYDVQQDEwtleGFtcGxlLmNvbTEiMCAGCSqG
8
+ SIb3DQEJARYTZXhhbXBsZUBleGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB
9
+ jQAwgYkCgYEAvJiaojIFQAbFczXkBmjxpxra9LbQm0VIESFSl8uBSjmG/gmCBwKg
10
+ 8O94P3tAjDNClC+fEqBLE37KH4qe76yw7upgRruP5jQzUEL1yCaVtA/DoqgaCxZy
11
+ 7VhB2A3f71Zw6kQPt3BOME68fnGsTX65x9XAawCGzGmJSk/Z6wvml1MCAwEAATAN
12
+ BgkqhkiG9w0BAQUFAAOBgQCxOyni9LOKf17vUKVG8Y4TBzRYwm8/hlEdVEU3JKG0
13
+ /aCCwIJLHl+z+3L4r81IN3+YKrHilqx9K0emboJbBRQklYsv/AE+J44Bq3llRiro
14
+ 0e5zwH61jb1j+kxhcxoGiiy8R7hYho24ljuMgFGqtK3kZSP/t9tBLLVp+ItWQ6xX
15
+ 5g==
16
+ -----END CERTIFICATE-----
@@ -0,0 +1,15 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIICXQIBAAKBgQC8mJqiMgVABsVzNeQGaPGnGtr0ttCbRUgRIVKXy4FKOYb+CYIH
3
+ AqDw73g/e0CMM0KUL58SoEsTfsofip7vrLDu6mBGu4/mNDNQQvXIJpW0D8OiqBoL
4
+ FnLtWEHYDd/vVnDqRA+3cE4wTrx+caxNfrnH1cBrAIbMaYlKT9nrC+aXUwIDAQAB
5
+ AoGBAKjrGh1KJg+pwPInA5yGJGMil5h1obRgwmKtcPeKi7u6eOFSDMdQoGwMYKyj
6
+ LTYlt21Yleat8XB9sHW9yAstpq5dU8Id2A4wfbJeaBYpek7u5+QwBENO4UrnulTk
7
+ W0d+jECBVYECn8wCStxfoFcQQRhlGrsOn05379cD8e1odMOJAkEA3o/7CsgXqahG
8
+ 7L1HaWYtKnpFfTS+EQgdGvSahOolByAKTtMA2TUBU1FdlCk+ggWBGorqmWON5Qnm
9
+ 7UDHjOasZQJBANjuPOqa9ubqHccGwHec+72pQz6q5e8f1gf1XPn7EEuXsBzYiMMH
10
+ qEa8zpfF0TmhQ0oWN75Cq709gfVVBfx/bVcCQHan1HN/Ef6FlKqKjxQGQXYwEfQa
11
+ tmpmJP5GAktyeaM+1cAIhp9GvxooeveOtaCkRpxcC48ToIbHrLI4oyrfoHECQQC6
12
+ bAHtmz6TMp5ka2j7Yez1EIC5WiQ/WxyTukgsi5V1YOX35B2jfPEf2SGxTE6BOBSb
13
+ lnxRBPqRpkoIiwiZ9OgBAkBOWKBuHXmXM6wr+0p4KQ/DOeStZiBxUT8rYbX/i1BI
14
+ /9Xo48KNerTx7qoDK+jIslDrilahvcwUz0fuVV7rHy/X
15
+ -----END RSA PRIVATE KEY-----
@@ -16,20 +16,6 @@ describe "RATP example" do
16
16
  end
17
17
 
18
18
  response = client.call(:get_stations) do
19
- # For the corrent values to pass for :from_unit and :to_unit, I searched the WSDL for
20
- # the "FromUnit" type which is a "TemperatureUnit" enumeration that looks like this:
21
- #
22
- # <s:simpleType name="TemperatureUnit">
23
- # <s:restriction base="s:string">
24
- # <s:enumeration value="degreeCelsius"/>
25
- # <s:enumeration value="degreeFahrenheit"/>
26
- # <s:enumeration value="degreeRankine"/>
27
- # <s:enumeration value="degreeReaumur"/>
28
- # <s:enumeration value="kelvin"/>
29
- # </s:restriction>
30
- # </s:simpleType>
31
- #
32
- # Support for XS schema types needs to be improved.
33
19
  message(:station => { :id => 1975 }, :limit => 1)
34
20
  end
35
21
 
@@ -75,18 +75,18 @@ describe "Options" do
75
75
 
76
76
  context "global :encoding" do
77
77
  it "changes the XML instruction" do
78
- client = new_client(:endpoint => @server.url(:repeat), :encoding => "UTF-16")
78
+ client = new_client(:endpoint => @server.url(:repeat), :encoding => "ISO-8859-1")
79
79
  response = client.call(:authenticate)
80
80
 
81
- expect(response.http.body).to match(/<\?xml version="1\.0" encoding="UTF-16"\?>/)
81
+ expect(response.http.body).to match(/<\?xml version="1\.0" encoding="ISO-8859-1"\?>/)
82
82
  end
83
83
 
84
84
  it "changes the Content-Type header" do
85
- client = new_client(:endpoint => @server.url(:inspect_header), :encoding => "UTF-16",
85
+ client = new_client(:endpoint => @server.url(:inspect_header), :encoding => "ISO-8859-1",
86
86
  :headers => { "Inspect" => "CONTENT_TYPE" })
87
87
 
88
88
  response = client.call(:authenticate)
89
- expect(response.http.body).to eq("text/xml;charset=UTF-16")
89
+ expect(response.http.body).to eq("text/xml;charset=ISO-8859-1")
90
90
  end
91
91
  end
92
92
 
@@ -255,6 +255,54 @@ describe "Options" do
255
255
  end
256
256
  end
257
257
 
258
+ context "global :ssl_version" do
259
+ it "sets the SSL version to use" do
260
+ HTTPI::Auth::SSL.any_instance.expects(:ssl_version=).with(:SSLv3)
261
+
262
+ client = new_client(:endpoint => @server.url, :ssl_version => :SSLv3)
263
+ client.call(:authenticate)
264
+ end
265
+ end
266
+
267
+ context "global :ssl_verify_mode" do
268
+ it "sets the verify mode to use" do
269
+ HTTPI::Auth::SSL.any_instance.expects(:verify_mode=).with(:none)
270
+
271
+ client = new_client(:endpoint => @server.url, :ssl_verify_mode => :none)
272
+ client.call(:authenticate)
273
+ end
274
+ end
275
+
276
+ context "global :ssl_cert_key_file" do
277
+ it "sets the cert key file to use" do
278
+ cert_key = File.expand_path("../../fixtures/ssl/client_key.pem", __FILE__)
279
+ HTTPI::Auth::SSL.any_instance.expects(:cert_key_file=).with(cert_key)
280
+
281
+ client = new_client(:endpoint => @server.url, :ssl_cert_key_file => cert_key)
282
+ client.call(:authenticate)
283
+ end
284
+ end
285
+
286
+ context "global :ssl_cert_file" do
287
+ it "sets the cert file to use" do
288
+ cert = File.expand_path("../../fixtures/ssl/client_cert.pem", __FILE__)
289
+ HTTPI::Auth::SSL.any_instance.expects(:cert_file=).with(cert)
290
+
291
+ client = new_client(:endpoint => @server.url, :ssl_cert_file => cert)
292
+ client.call(:authenticate)
293
+ end
294
+ end
295
+
296
+ context "global :ssl_ca_cert_file" do
297
+ it "sets the ca cert file to use" do
298
+ ca_cert = File.expand_path("../../fixtures/ssl/client_cert.pem", __FILE__)
299
+ HTTPI::Auth::SSL.any_instance.expects(:ca_cert_file=).with(ca_cert)
300
+
301
+ client = new_client(:endpoint => @server.url, :ssl_ca_cert_file => ca_cert)
302
+ client.call(:authenticate)
303
+ end
304
+ end
305
+
258
306
  context "global :basic_auth" do
259
307
  it "sets the basic auth credentials" do
260
308
  client = new_client(:endpoint => @server.url(:basic_auth), :basic_auth => ["admin", "secret"])
@@ -410,7 +458,7 @@ describe "Options" do
410
458
  end
411
459
 
412
460
  response = client.call(:find_user) do |locals|
413
- locals.message(user_name: "luke", "pass_word" => "secret")
461
+ locals.message(:user_name => "luke", "pass_word" => "secret")
414
462
  end
415
463
 
416
464
  request = response.http.body
@@ -486,7 +534,10 @@ describe "Options" do
486
534
  context "request :message" do
487
535
  it "accepts a Hash which is passed to Gyoku to be converted to XML" do
488
536
  response = new_client(:endpoint => @server.url(:repeat)).call(:authenticate, :message => { :user => "luke", :password => "secret" })
489
- expect(response.http.body).to include("<tns:authenticate><user>luke</user><password>secret</password></tns:authenticate>")
537
+
538
+ request = response.http.body
539
+ expect(request).to include("<user>luke</user>")
540
+ expect(request).to include("<password>secret</password>")
490
541
  end
491
542
 
492
543
  it "also accepts a String of raw XML" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: savon
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-19 00:00:00.000000000 Z
12
+ date: 2012-12-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nori
@@ -248,6 +248,8 @@ files:
248
248
  - spec/fixtures/response/soap_fault.xml
249
249
  - spec/fixtures/response/soap_fault12.xml
250
250
  - spec/fixtures/response/taxcloud.xml
251
+ - spec/fixtures/ssl/client_cert.pem
252
+ - spec/fixtures/ssl/client_key.pem
251
253
  - spec/fixtures/wsdl/authentication.xml
252
254
  - spec/fixtures/wsdl/lower_camel.xml
253
255
  - spec/fixtures/wsdl/multiple_namespaces.xml
@@ -290,7 +292,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
290
292
  version: '0'
291
293
  segments:
292
294
  - 0
293
- hash: 2358911871960345880
295
+ hash: 2724646448334842614
294
296
  required_rubygems_version: !ruby/object:Gem::Requirement
295
297
  none: false
296
298
  requirements:
@@ -299,7 +301,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
299
301
  version: '0'
300
302
  segments:
301
303
  - 0
302
- hash: 2358911871960345880
304
+ hash: 2724646448334842614
303
305
  requirements: []
304
306
  rubyforge_project: savon
305
307
  rubygems_version: 1.8.24