savon 0.7.6 → 0.7.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +16 -2
- data/README.rdoc +3 -3
- data/Rakefile +0 -1
- data/lib/savon.rb +4 -0
- data/lib/savon/client.rb +22 -3
- data/lib/savon/core_ext/array.rb +2 -2
- data/lib/savon/core_ext/datetime.rb +2 -0
- data/lib/savon/core_ext/hash.rb +9 -4
- data/lib/savon/core_ext/object.rb +2 -5
- data/lib/savon/core_ext/string.rb +12 -9
- data/lib/savon/core_ext/symbol.rb +1 -1
- data/lib/savon/request.rb +4 -3
- data/lib/savon/response.rb +22 -3
- data/lib/savon/version.rb +5 -0
- data/lib/savon/wsdl.rb +3 -3
- data/spec/fixtures/gzip/gzip_response_fixture.rb +7 -0
- data/spec/fixtures/gzip/message.gz +0 -0
- data/spec/savon/client_spec.rb +5 -0
- data/spec/savon/core_ext/array_spec.rb +41 -11
- data/spec/savon/core_ext/datetime_spec.rb +12 -3
- data/spec/savon/core_ext/hash_spec.rb +12 -0
- data/spec/savon/core_ext/object_spec.rb +0 -6
- data/spec/savon/core_ext/string_spec.rb +14 -2
- data/spec/savon/core_ext/symbol_spec.rb +1 -0
- data/spec/savon/request_spec.rb +32 -8
- data/spec/savon/response_spec.rb +48 -6
- data/spec/savon/soap_spec.rb +7 -6
- data/spec/savon/wsdl_spec.rb +5 -0
- metadata +7 -3
data/CHANGELOG
CHANGED
@@ -1,5 +1,20 @@
|
|
1
|
+
== 0.7.7 (2010-05-09)
|
2
|
+
* SOAP requests now start with a proper XML declaration.
|
3
|
+
* Added support for gzipped requests and responses (http://github.com/lucascs). While gzipped SOAP
|
4
|
+
responses are decoded automatically, you have to manually instruct Savon to gzip SOAP requests:
|
5
|
+
|
6
|
+
client = Savon::Client.new "http://example.com/UserService?wsdl", :gzip => true
|
7
|
+
|
8
|
+
* Fix for issue #51. Added the :soap_endpoint option to Savon::Client.new which let's you specify a SOAP
|
9
|
+
endpoint per client instance:
|
10
|
+
|
11
|
+
client = Savon::Client.new "http://example.com/UserService?wsdl",
|
12
|
+
:soap_endpoint => "http://localhost/UserService"
|
13
|
+
|
14
|
+
* Fix for issue #50. Savon still escapes special characters in SOAP request Hash values, but you can now
|
15
|
+
append an exclamation mark to Hash keys specifying that it's value should not be escaped.
|
16
|
+
|
1
17
|
== 0.7.6 (2010-03-21)
|
2
|
-
* Renamed
|
3
18
|
* Moved documentation from the Github Wiki to the actual class files and established a much nicer
|
4
19
|
documentation combining examples and implementation (using Hanna) at: http://savon.rubiii.com
|
5
20
|
* Added Savon::Client#call as a workaround for dispatching calls to SOAP actions named after
|
@@ -153,4 +168,3 @@
|
|
153
168
|
|
154
169
|
== 0.5.0 (2009-11-29)
|
155
170
|
* Complete rewrite.
|
156
|
-
|
data/README.rdoc
CHANGED
@@ -16,7 +16,7 @@ Instantiate Savon::Client, passing in the WSDL of your service.
|
|
16
16
|
|
17
17
|
client = Savon::Client.new "http://example.com/UserService?wsdl"
|
18
18
|
|
19
|
-
For production, it is highly recommended to not use Savon::WSDL. Information on {how to disable the WSDL}[http://savon.rubiii.com/docs/
|
19
|
+
For production, it is highly recommended to not use Savon::WSDL. Information on {how to disable the WSDL}[http://savon.rubiii.com/docs/0.7.7/classes/Savon/WSDL.html].
|
20
20
|
|
21
21
|
== Calling a SOAP action
|
22
22
|
|
@@ -56,9 +56,9 @@ Savon::Response represents the HTTP and SOAP response. It contains and raises er
|
|
56
56
|
== HTTP errors and SOAP faults
|
57
57
|
|
58
58
|
Savon raises a Savon::SOAPFault in case of a SOAP fault and a Savon::HTTPError in case of an HTTP error.
|
59
|
-
More information: {Errors}[http://savon.rubiii.com/docs/
|
59
|
+
More information: {Errors}[http://savon.rubiii.com/docs/0.7.7/classes/Savon/Response.html]
|
60
60
|
|
61
61
|
== Logging
|
62
62
|
|
63
63
|
Savon logs each request and response to STDOUT. But there are a couple of options to change the default behavior.
|
64
|
-
More information: {Logging}[http://savon.rubiii.com/docs/
|
64
|
+
More information: {Logging}[http://savon.rubiii.com/docs/0.7.7/classes/Savon/Request.html]
|
data/Rakefile
CHANGED
data/lib/savon.rb
CHANGED
@@ -14,6 +14,9 @@ require "net/https"
|
|
14
14
|
require "base64"
|
15
15
|
require "digest/sha1"
|
16
16
|
require "rexml/document"
|
17
|
+
require "stringio"
|
18
|
+
require "zlib"
|
19
|
+
require "cgi"
|
17
20
|
|
18
21
|
# gem dependencies
|
19
22
|
require "builder"
|
@@ -29,3 +32,4 @@ require "savon/response"
|
|
29
32
|
require "savon/wsdl_stream"
|
30
33
|
require "savon/wsdl"
|
31
34
|
require "savon/client"
|
35
|
+
require "savon/version"
|
data/lib/savon/client.rb
CHANGED
@@ -27,6 +27,19 @@ module Savon
|
|
27
27
|
#
|
28
28
|
# client = Savon::Client.new "http://example.com/UserService?wsdl", :proxy => "http://proxy.example.com"
|
29
29
|
#
|
30
|
+
# == Forcing a particular SOAP endpoint
|
31
|
+
#
|
32
|
+
# In case you don't want to use the SOAP endpoint specified in the WSDL, you can tell Savon to use
|
33
|
+
# another SOAP endpoint.
|
34
|
+
#
|
35
|
+
# client = Savon::Client.new "http://example.com/UserService?wsdl", :soap_endpoint => "http://localhost/UserService"
|
36
|
+
#
|
37
|
+
# == Gzipped SOAP requests
|
38
|
+
#
|
39
|
+
# Sending gzipped SOAP requests can be specified per client instance.
|
40
|
+
#
|
41
|
+
# client = Savon::Client.new "http://example.com/UserService?wsdl", :gzip => true
|
42
|
+
#
|
30
43
|
# == Savon::WSDL
|
31
44
|
#
|
32
45
|
# You can access Savon::WSDL via:
|
@@ -40,11 +53,17 @@ module Savon
|
|
40
53
|
# client.request
|
41
54
|
class Client
|
42
55
|
|
43
|
-
# Expects a SOAP +endpoint+ string. Also accepts
|
44
|
-
#
|
56
|
+
# Expects a SOAP +endpoint+ string. Also accepts a Hash of +options+.
|
57
|
+
#
|
58
|
+
# ==== Options:
|
59
|
+
#
|
60
|
+
# [proxy] the proxy server to use
|
61
|
+
# [gzip] whether to gzip SOAP requests
|
62
|
+
# [soap_endpoint] force to use this SOAP endpoint
|
45
63
|
def initialize(endpoint, options = {})
|
64
|
+
soap_endpoint = options.delete(:soap_endpoint)
|
46
65
|
@request = Request.new endpoint, options
|
47
|
-
@wsdl = WSDL.new @request
|
66
|
+
@wsdl = WSDL.new @request, soap_endpoint
|
48
67
|
end
|
49
68
|
|
50
69
|
# Returns the Savon::WSDL.
|
data/lib/savon/core_ext/array.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
class Array
|
2
2
|
|
3
3
|
# Translates the Array into SOAP compatible XML. See: Hash.to_soap_xml.
|
4
|
-
def to_soap_xml(key, attributes = {})
|
4
|
+
def to_soap_xml(key, escape_xml = true, attributes = {})
|
5
5
|
xml = Builder::XmlMarkup.new
|
6
6
|
|
7
7
|
each_with_index do |item, index|
|
8
8
|
attrs = tag_attributes attributes, index
|
9
9
|
case item
|
10
10
|
when Hash then xml.tag!(key, attrs) { xml << item.to_soap_xml }
|
11
|
-
else xml.tag!(key, attrs) { xml << item.to_soap_value }
|
11
|
+
else xml.tag!(key, attrs) { xml << (escape_xml ? item.to_soap_value : item.to_soap_value!) }
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
data/lib/savon/core_ext/hash.rb
CHANGED
@@ -35,7 +35,11 @@ class Hash
|
|
35
35
|
# <perform_at>2012-06-11T10:42:21</perform_at>
|
36
36
|
# </magicRequest>
|
37
37
|
#
|
38
|
-
# ====
|
38
|
+
# ==== Escaped XML values
|
39
|
+
#
|
40
|
+
# By default, special characters in XML String values are escaped.
|
41
|
+
#
|
42
|
+
# ==== Fixed order of XML tags
|
39
43
|
#
|
40
44
|
# In case your service requires the tags to be in a specific order (parameterOrder), you have two
|
41
45
|
# options. The first is to specify your body as an XML string. The second is to specify the order
|
@@ -44,7 +48,7 @@ class Hash
|
|
44
48
|
# { :name => "Eve", :id => 123, :order! => [:id, :name] }.to_soap_xml
|
45
49
|
# # => "<id>123</id><name>Eve</name>"
|
46
50
|
#
|
47
|
-
# ====
|
51
|
+
# ==== XML attributes
|
48
52
|
#
|
49
53
|
# If you need attributes, you could either go with an XML string or add another hash under the
|
50
54
|
# +:attributes!+ key.
|
@@ -58,12 +62,13 @@ class Hash
|
|
58
62
|
order.each do |key|
|
59
63
|
attrs = attributes[key] || {}
|
60
64
|
value = self[key]
|
65
|
+
escape_xml = key.to_s[-1, 1] != "!"
|
61
66
|
key = key.to_soap_key
|
62
67
|
|
63
68
|
case value
|
64
|
-
when Array then xml << value.to_soap_xml(key, attrs)
|
69
|
+
when Array then xml << value.to_soap_xml(key, escape_xml, attrs)
|
65
70
|
when Hash then xml.tag!(key, attrs) { xml << value.to_soap_xml }
|
66
|
-
else xml.tag!(key, attrs) { xml << value.to_soap_value }
|
71
|
+
else xml.tag!(key, attrs) { xml << (escape_xml ? value.to_soap_value : value.to_soap_value!) }
|
67
72
|
end
|
68
73
|
end
|
69
74
|
|
@@ -5,15 +5,12 @@ class Object
|
|
5
5
|
respond_to?(:empty?) ? empty? : !self
|
6
6
|
end unless defined? blank?
|
7
7
|
|
8
|
-
# Returns the Object as a SOAP request compliant key.
|
9
|
-
def to_soap_key
|
10
|
-
to_s
|
11
|
-
end
|
12
|
-
|
13
8
|
# Returns the Object as a SOAP request compliant value.
|
14
9
|
def to_soap_value
|
15
10
|
return to_s unless respond_to? :to_datetime
|
16
11
|
to_datetime.to_soap_value
|
17
12
|
end
|
18
13
|
|
14
|
+
alias_method :to_soap_value!, :to_soap_value
|
15
|
+
|
19
16
|
end
|
@@ -51,16 +51,19 @@ class String
|
|
51
51
|
self
|
52
52
|
end
|
53
53
|
|
54
|
-
# Returns the
|
55
|
-
|
54
|
+
# Returns the Object as a SOAP request compliant key.
|
55
|
+
def to_soap_key
|
56
|
+
self[-1, 1] == "!" ? chop : self
|
57
|
+
end
|
58
|
+
|
59
|
+
# Returns the String as a SOAP value. Escapes special characters for XML.
|
56
60
|
def to_soap_value
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
str
|
61
|
+
CGI.escapeHTML self
|
62
|
+
end
|
63
|
+
|
64
|
+
# Convert the String into a SOAP value without escaping special characters.
|
65
|
+
def to_soap_value!
|
66
|
+
self
|
64
67
|
end
|
65
68
|
|
66
69
|
end
|
data/lib/savon/request.rb
CHANGED
@@ -46,11 +46,11 @@ module Savon
|
|
46
46
|
# Content-Types by SOAP version.
|
47
47
|
ContentType = { 1 => "text/xml;charset=UTF-8", 2 => "application/soap+xml;charset=UTF-8" }
|
48
48
|
|
49
|
-
# Expects a SOAP +endpoint+
|
50
|
-
# of +options+ for specifying a proxy server.
|
49
|
+
# Expects a WSDL or SOAP +endpoint+ and accepts a custom +proxy+ address.
|
51
50
|
def initialize(endpoint, options = {})
|
52
51
|
@endpoint = URI endpoint
|
53
|
-
@proxy =
|
52
|
+
@proxy = URI options[:proxy] || ""
|
53
|
+
headers["Accept-encoding"] = "gzip,deflate" if options[:gzip]
|
54
54
|
end
|
55
55
|
|
56
56
|
# Returns the endpoint URI.
|
@@ -135,3 +135,4 @@ module Savon
|
|
135
135
|
|
136
136
|
end
|
137
137
|
end
|
138
|
+
|
data/lib/savon/response.rb
CHANGED
@@ -100,12 +100,12 @@ module Savon
|
|
100
100
|
|
101
101
|
# Returns the SOAP response body as a Hash.
|
102
102
|
def to_hash
|
103
|
-
@
|
103
|
+
@hash ||= (Crack::XML.parse(body) rescue {}).find_soap_body
|
104
104
|
end
|
105
105
|
|
106
106
|
# Returns the SOAP response XML.
|
107
107
|
def to_xml
|
108
|
-
|
108
|
+
body
|
109
109
|
end
|
110
110
|
|
111
111
|
# Returns the HTTP response object.
|
@@ -115,6 +115,24 @@ module Savon
|
|
115
115
|
|
116
116
|
private
|
117
117
|
|
118
|
+
# Returns the response body.
|
119
|
+
def body
|
120
|
+
@body || gzipped_body? ? decoded_body : @http.body
|
121
|
+
end
|
122
|
+
|
123
|
+
# Returns whether the body is gzipped.
|
124
|
+
def gzipped_body?
|
125
|
+
@http["content-encoding"] == "gzip" || @http.body[0..1] == "\x1f\x8b"
|
126
|
+
end
|
127
|
+
|
128
|
+
# Returns the gzip decoded body.
|
129
|
+
def decoded_body
|
130
|
+
gz = Zlib::GzipReader.new StringIO.new(@http.body)
|
131
|
+
gz.read
|
132
|
+
ensure
|
133
|
+
gz.close
|
134
|
+
end
|
135
|
+
|
118
136
|
# Handles SOAP faults. Raises a Savon::SOAPFault unless the default behavior of raising errors
|
119
137
|
# was turned off.
|
120
138
|
def handle_soap_fault
|
@@ -146,10 +164,11 @@ module Savon
|
|
146
164
|
def handle_http_error
|
147
165
|
if @http.code.to_i > MaxNonErrorResponseCode
|
148
166
|
@http_error = "#{@http.message} (#{@http.code})"
|
149
|
-
@http_error << ": #{
|
167
|
+
@http_error << ": #{body}" unless body.empty?
|
150
168
|
raise Savon::HTTPError, http_error if self.class.raise_errors?
|
151
169
|
end
|
152
170
|
end
|
153
171
|
|
154
172
|
end
|
155
173
|
end
|
174
|
+
|
data/lib/savon/wsdl.rb
CHANGED
@@ -71,9 +71,9 @@ module Savon
|
|
71
71
|
# end
|
72
72
|
class WSDL
|
73
73
|
|
74
|
-
#
|
75
|
-
def initialize(request)
|
76
|
-
@request, @enabled = request, true
|
74
|
+
# Expects a Savon::Request and accepts a custom +soap_endpoint+.
|
75
|
+
def initialize(request, soap_endpoint = nil)
|
76
|
+
@request, @enabled, @soap_endpoint = request, true, soap_endpoint
|
77
77
|
end
|
78
78
|
|
79
79
|
# Sets whether to use the WSDL.
|
Binary file
|
data/spec/savon/client_spec.rb
CHANGED
@@ -14,6 +14,11 @@ describe Savon::Client do
|
|
14
14
|
client.request.http.proxy_address == "http://proxy"
|
15
15
|
end
|
16
16
|
|
17
|
+
it "should accept a SOAP endpoint via an optional Hash of options" do
|
18
|
+
client = Savon::Client.new EndpointHelper.wsdl_endpoint, :soap_endpoint => "http://localhost"
|
19
|
+
client.wsdl.soap_endpoint.should == "http://localhost"
|
20
|
+
end
|
21
|
+
|
17
22
|
it "should have a method that returns the Savon::WSDL" do
|
18
23
|
@client.wsdl.should be_a(Savon::WSDL)
|
19
24
|
end
|
@@ -3,17 +3,47 @@ require "spec_helper"
|
|
3
3
|
describe Array do
|
4
4
|
|
5
5
|
describe "to_soap_xml" do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
6
|
+
it "should return the XML for an Array of Hashes" do
|
7
|
+
array = [{ :name => "adam" }, { :name => "eve" }]
|
8
|
+
result = "<user><name>adam</name></user><user><name>eve</name></user>"
|
9
|
+
|
10
|
+
array.to_soap_xml("user").should == result
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should return the XML for an Array of different Objects" do
|
14
|
+
array = [:symbol, "string", 123]
|
15
|
+
result = "<value>symbol</value><value>string</value><value>123</value>"
|
16
|
+
|
17
|
+
array.to_soap_xml("value").should == result
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should default to escape special characters" do
|
21
|
+
array = ["<tag />", "adam & eve"]
|
22
|
+
result = "<value><tag /></value><value>adam & eve</value>"
|
23
|
+
|
24
|
+
array.to_soap_xml("value").should == result
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should not escape special characters when told to" do
|
28
|
+
array = ["<tag />", "adam & eve"]
|
29
|
+
result = "<value><tag /></value><value>adam & eve</value>"
|
30
|
+
|
31
|
+
array.to_soap_xml("value", false).should == result
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should add attributes to a given tag" do
|
35
|
+
array = ["adam", "eve"]
|
36
|
+
result = '<value active="true">adam</value><value active="true">eve</value>'
|
37
|
+
|
38
|
+
array.to_soap_xml("value", :escape_xml, :active => true).should == result
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should add attributes to duplicate tags" do
|
42
|
+
array = ["adam", "eve"]
|
43
|
+
result = '<value id="1">adam</value><value id="2">eve</value>'
|
44
|
+
|
45
|
+
array.to_soap_xml("value", :escape_xml, :id => [1, 2]).should == result
|
16
46
|
end
|
17
47
|
end
|
18
48
|
|
19
|
-
end
|
49
|
+
end
|
@@ -1,11 +1,20 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe DateTime do
|
4
|
+
before do
|
5
|
+
@datetime = DateTime.new 2012, 03, 22, 16, 22, 33
|
6
|
+
@datetime_string = "2012-03-22T16:22:33Z"
|
7
|
+
end
|
4
8
|
|
5
9
|
describe "to_soap_value" do
|
6
|
-
it "
|
7
|
-
|
8
|
-
|
10
|
+
it "should return an xs:dateTime compliant String" do
|
11
|
+
@datetime.to_soap_value.should == @datetime_string
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "to_soap_value!" do
|
16
|
+
it "should act like :to_soap_value" do
|
17
|
+
@datetime.to_soap_value.should == @datetime_string
|
9
18
|
end
|
10
19
|
end
|
11
20
|
|
@@ -85,6 +85,18 @@ describe Hash do
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
+
it "should default to escape special characters" do
|
89
|
+
result = { :some => { :nested => "<tag />" }, :tag => "<tag />" }.to_soap_xml
|
90
|
+
result.should include("<tag><tag /></tag>")
|
91
|
+
result.should include("<some><nested><tag /></nested></some>")
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should not escape special characters for keys marked with an exclamation mark" do
|
95
|
+
result = { :some => { :nested! => "<tag />" }, :tag! => "<tag />" }.to_soap_xml
|
96
|
+
result.should include("<tag><tag /></tag>")
|
97
|
+
result.should include("<some><nested><tag /></nested></some>")
|
98
|
+
end
|
99
|
+
|
88
100
|
it "should preserve the order of Hash keys and values specified through :order!" do
|
89
101
|
hash = { :find_user => { :name => "Lucy", :id => 666, :order! => [:id, :name] } }
|
90
102
|
result = "<findUser><id>666</id><name>Lucy</name></findUser>"
|
@@ -16,12 +16,6 @@ describe Object do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
describe "to_soap_key" do
|
20
|
-
it "calls to_s for every Object" do
|
21
|
-
Object.to_soap_key.should == Object.to_s
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
19
|
describe "to_soap_value" do
|
26
20
|
it "returns an xs:dateTime compliant String for Objects responding to to_datetime" do
|
27
21
|
singleton = Object.new
|
@@ -74,13 +74,25 @@ describe String do
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
+
describe "to_soap_key" do
|
78
|
+
it "removes exclamation marks from the end of the String" do
|
79
|
+
"value".to_soap_key.should == "value"
|
80
|
+
"value!".to_soap_key.should == "value"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
77
84
|
describe "to_soap_value" do
|
78
|
-
it "should return the
|
85
|
+
it "should return the String value and escape special characters" do
|
79
86
|
"string".to_soap_value.should == "string"
|
80
87
|
"<tag>".to_soap_value.should == "<tag>"
|
81
88
|
"at&t".to_soap_value.should == "at&t"
|
82
89
|
'"quotes"'.to_soap_value.should == ""quotes""
|
83
|
-
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "to_soap_value!" do
|
94
|
+
it "should just return the String value without escaping special characters" do
|
95
|
+
"<tag>".to_soap_value!.should == "<tag>"
|
84
96
|
end
|
85
97
|
end
|
86
98
|
|
data/spec/savon/request_spec.rb
CHANGED
@@ -75,14 +75,38 @@ describe Savon::Request do
|
|
75
75
|
wsdl_response.body.should == WSDLFixture.authentication
|
76
76
|
end
|
77
77
|
|
78
|
-
it "executes a SOAP request and returns the Net::HTTP response" do
|
79
|
-
operation = WSDLFixture.authentication(:operations)[:authenticate]
|
80
|
-
action, input = operation[:action], operation[:input]
|
81
|
-
soap = Savon::SOAP.new action, input, EndpointHelper.soap_endpoint
|
82
|
-
soap_response = @request.soap soap
|
83
78
|
|
84
|
-
|
85
|
-
|
79
|
+
describe "when executing a SOAP request" do
|
80
|
+
before :each do
|
81
|
+
operation = WSDLFixture.authentication(:operations)[:authenticate]
|
82
|
+
action, input = operation[:action], operation[:input]
|
83
|
+
@soap = Savon::SOAP.new action, input, EndpointHelper.soap_endpoint
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should return the Net::HTTP response" do
|
87
|
+
soap_response = @request.soap @soap
|
88
|
+
|
89
|
+
soap_response.should be_a(Net::HTTPResponse)
|
90
|
+
soap_response.body.should == ResponseFixture.authentication
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should include Accept-Encoding gzip if it is enabled" do
|
94
|
+
@request = Savon::Request.new EndpointHelper.wsdl_endpoint, :gzip => true
|
95
|
+
a_post = Net::HTTP::Post.new(@soap.endpoint.request_uri, {})
|
96
|
+
|
97
|
+
Net::HTTP::Post.expects(:new).with(anything, has_entry("Accept-encoding" => "gzip,deflate")).returns(a_post)
|
98
|
+
|
99
|
+
@request.soap @soap
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should not include Accept-Encoding gzip if it is not enabled" do
|
103
|
+
@request = Savon::Request.new EndpointHelper.wsdl_endpoint, :gzip => false
|
104
|
+
a_post = Net::HTTP::Post.new(@soap.endpoint.request_uri, {})
|
105
|
+
|
106
|
+
Net::HTTP::Post.expects(:new).with(anything, Not(has_entry("Accept-encoding" => "gzip,deflate"))).returns(a_post)
|
107
|
+
|
108
|
+
@request.soap @soap
|
109
|
+
end
|
86
110
|
end
|
87
111
|
|
88
112
|
it "should not include host when creating HTTP requests" do
|
@@ -90,4 +114,4 @@ describe Savon::Request do
|
|
90
114
|
request.path.should_not include("example.com")
|
91
115
|
end
|
92
116
|
|
93
|
-
end
|
117
|
+
end
|
data/spec/savon/response_spec.rb
CHANGED
@@ -21,13 +21,13 @@ describe Savon::Response do
|
|
21
21
|
it "raises a Savon::SOAPFault in case of a SOAP fault" do
|
22
22
|
lambda { savon_response_with :soap_fault }.should raise_error(Savon::SOAPFault)
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
it "does not raise a Savon::SOAPFault in case the default is turned off" do
|
26
26
|
Savon::Response.raise_errors = false
|
27
27
|
savon_response_with :soap_fault
|
28
28
|
Savon::Response.raise_errors = true
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
it "raises a Savon::HTTPError in case of an HTTP error" do
|
32
32
|
lambda { savon_response_with :http_error }.should raise_error(Savon::HTTPError)
|
33
33
|
end
|
@@ -102,7 +102,7 @@ describe Savon::Response do
|
|
102
102
|
@response = Savon::Response.new http_response_mock(200, ResponseFixture.multi_ref, "OK")
|
103
103
|
|
104
104
|
@response.to_hash[:list_response].should be_a(Hash)
|
105
|
-
@response.to_hash[:multi_ref].should be_an(Array)
|
105
|
+
@response.to_hash[:multi_ref].should be_an(Array)
|
106
106
|
end
|
107
107
|
|
108
108
|
it "should return the raw SOAP response body" do
|
@@ -117,6 +117,44 @@ describe Savon::Response do
|
|
117
117
|
@response.http.should respond_to(:body)
|
118
118
|
end
|
119
119
|
|
120
|
+
describe "GZipped responses" do
|
121
|
+
it "should be decoded if Content-encoding header is gzip" do
|
122
|
+
@response = Savon::Response.new http_response_mock(200, body = "Encoded", "OK", 'content-encoding' => 'gzip')
|
123
|
+
|
124
|
+
should_decode_body body
|
125
|
+
|
126
|
+
@response.to_xml
|
127
|
+
end
|
128
|
+
|
129
|
+
# header logic extracted from http://dev.ctor.org/svn/soap4r/trunk/lib/soap/streamHandler.rb
|
130
|
+
it "should be decoded if body starts with gzip header" do
|
131
|
+
@response = Savon::Response.new http_response_mock(200, body = "\x1f\x8bEncoded", "OK")
|
132
|
+
|
133
|
+
should_decode_body body
|
134
|
+
|
135
|
+
@response.to_xml
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should be decoded when header is set" do
|
139
|
+
@response = Savon::Response.new http_response_mock(200, GzipResponseFixture.message, "OK", 'content-encoding' => 'gzip')
|
140
|
+
@response.to_xml.should == "A short gzip encoded message\n"
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should be decoded when header is not set" do
|
144
|
+
@response = Savon::Response.new http_response_mock(200, GzipResponseFixture.message, "OK")
|
145
|
+
@response.to_xml.should == "A short gzip encoded message\n"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def should_decode_body(body)
|
150
|
+
StringIO.expects(:new).with(body).returns(stream = mock("StringIO"))
|
151
|
+
|
152
|
+
Zlib::GzipReader.expects(:new).with(stream).returns(mock("Zlib::GzipReader") do
|
153
|
+
expects(:read)
|
154
|
+
expects(:close)
|
155
|
+
end)
|
156
|
+
end
|
157
|
+
|
120
158
|
def savon_response_with(error_type)
|
121
159
|
mock = case error_type
|
122
160
|
when :soap_fault then http_response_mock 200, ResponseFixture.soap_fault
|
@@ -126,12 +164,16 @@ describe Savon::Response do
|
|
126
164
|
Savon::Response.new mock
|
127
165
|
end
|
128
166
|
|
129
|
-
def http_response_mock(code = 200, body = nil, message = "OK")
|
167
|
+
def http_response_mock(code = 200, body = nil, message = "OK", headers = {})
|
130
168
|
body ||= ResponseFixture.authentication
|
131
169
|
mock = mock "Net::HTTPResponse"
|
132
|
-
mock.stubs :code => code.to_s, :message => message,
|
133
|
-
|
170
|
+
mock.stubs :code => code.to_s, :message => message, :content_type => "text/html", :body => body
|
171
|
+
|
172
|
+
mock.stubs("[]").with(anything).returns(nil)
|
173
|
+
headers.each { |key, value| mock.stubs("[]").with(key).returns(value) }
|
174
|
+
|
134
175
|
mock
|
135
176
|
end
|
136
177
|
|
137
178
|
end
|
179
|
+
|
data/spec/savon/soap_spec.rb
CHANGED
@@ -49,7 +49,7 @@ describe Savon::SOAP do
|
|
49
49
|
@namespace = { "xmlns:ns" => "http://example.com" }
|
50
50
|
@namespace_string = 'xmlns:ns="http://example.com"'
|
51
51
|
@namespaces = { "xmlns:ns" => "http://ns.example.com", "xmlns:ns2" => "http://ns2.example.com" }
|
52
|
-
|
52
|
+
|
53
53
|
# reset to defaults
|
54
54
|
Savon::SOAP.version = 1
|
55
55
|
Savon::SOAP.header = {}
|
@@ -137,15 +137,15 @@ describe Savon::SOAP do
|
|
137
137
|
it "should merge global and per request headers defined as Hashes" do
|
138
138
|
Savon::SOAP.header = { :key => "value", :key2 => "global value" }
|
139
139
|
@soap.header[:key2] = "request value"
|
140
|
-
@soap.to_xml.should
|
141
|
-
|
140
|
+
@soap.to_xml.should match(
|
141
|
+
/<env:Header>(<key>value<\/key><key2>request value<\/key2>|<key2>request value<\/key2><key>value<\/key>)<\/env:Header>/
|
142
142
|
)
|
143
143
|
end
|
144
144
|
|
145
145
|
it "should use the :header method from a given WSSE object to include a WSSE header" do
|
146
146
|
wsse = "some compliant object"
|
147
147
|
wsse.stubs(:header).returns("<wsse>authentication</wsse>")
|
148
|
-
|
148
|
+
|
149
149
|
@soap.wsse = wsse
|
150
150
|
@soap.to_xml.should include("<env:Header><wsse>authentication</wsse></env:Header>")
|
151
151
|
end
|
@@ -195,7 +195,8 @@ describe Savon::SOAP do
|
|
195
195
|
'<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">' <<
|
196
196
|
'<env:Body><wsdl:authenticate></wsdl:authenticate></env:Body>' <<
|
197
197
|
'</env:Envelope>'
|
198
|
-
)
|
198
|
+
)
|
199
199
|
end
|
200
200
|
end
|
201
|
-
end
|
201
|
+
end
|
202
|
+
|
data/spec/savon/wsdl_spec.rb
CHANGED
@@ -8,6 +8,11 @@ describe Savon::WSDL do
|
|
8
8
|
Savon::WSDL.new Savon::Request.new(EndpointHelper.wsdl_endpoint)
|
9
9
|
end
|
10
10
|
|
11
|
+
it "it accepts a custom SOAP endpoint" do
|
12
|
+
wsdl = Savon::WSDL.new Savon::Request.new(EndpointHelper.wsdl_endpoint), "http://localhost"
|
13
|
+
wsdl.soap_endpoint.should == "http://localhost"
|
14
|
+
end
|
15
|
+
|
11
16
|
it "is enabled by default" do
|
12
17
|
@wsdl.enabled?.should be_true
|
13
18
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 7
|
8
|
-
-
|
9
|
-
version: 0.7.
|
8
|
+
- 7
|
9
|
+
version: 0.7.7
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Daniel Harrington
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-05-09 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -113,12 +113,14 @@ files:
|
|
113
113
|
- lib/savon/request.rb
|
114
114
|
- lib/savon/response.rb
|
115
115
|
- lib/savon/soap.rb
|
116
|
+
- lib/savon/version.rb
|
116
117
|
- lib/savon/wsdl.rb
|
117
118
|
- lib/savon/wsdl_stream.rb
|
118
119
|
- lib/savon/wsse.rb
|
119
120
|
- lib/savon.rb
|
120
121
|
- spec/basic_spec_helper.rb
|
121
122
|
- spec/endpoint_helper.rb
|
123
|
+
- spec/fixtures/gzip/gzip_response_fixture.rb
|
122
124
|
- spec/fixtures/response/response_fixture.rb
|
123
125
|
- spec/fixtures/wsdl/wsdl_fixture.rb
|
124
126
|
- spec/http_stubs.rb
|
@@ -147,6 +149,7 @@ files:
|
|
147
149
|
- spec/fixtures/wsdl/xml/geotrust.xml
|
148
150
|
- spec/fixtures/wsdl/xml/namespaced_actions.xml
|
149
151
|
- spec/fixtures/wsdl/xml/no_namespace.xml
|
152
|
+
- spec/fixtures/gzip/message.gz
|
150
153
|
has_rdoc: true
|
151
154
|
homepage: http://github.com/rubiii/savon
|
152
155
|
licenses: []
|
@@ -184,6 +187,7 @@ summary: Heavy metal Ruby SOAP client library
|
|
184
187
|
test_files:
|
185
188
|
- spec/basic_spec_helper.rb
|
186
189
|
- spec/endpoint_helper.rb
|
190
|
+
- spec/fixtures/gzip/gzip_response_fixture.rb
|
187
191
|
- spec/fixtures/response/response_fixture.rb
|
188
192
|
- spec/fixtures/wsdl/wsdl_fixture.rb
|
189
193
|
- spec/http_stubs.rb
|