savon 2.0.3 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/CHANGELOG.md +38 -6
- data/Gemfile +1 -0
- data/lib/savon.rb +3 -3
- data/lib/savon/builder.rb +14 -3
- data/lib/savon/client.rb +22 -9
- data/lib/savon/operation.rb +70 -2
- data/lib/savon/options.rb +26 -20
- data/lib/savon/qualified_message.rb +2 -6
- data/lib/savon/request.rb +52 -79
- data/lib/savon/version.rb +1 -1
- data/savon.gemspec +11 -2
- data/savon.sublime-workspace +494 -0
- data/spec/fixtures/ssl/client_encrypted_key.pem +30 -0
- data/spec/fixtures/ssl/client_encrypted_key_cert.pem +24 -0
- data/spec/integration/support/application.rb +10 -8
- data/spec/savon/client_spec.rb +27 -18
- data/spec/savon/operation_spec.rb +112 -7
- data/spec/savon/options_spec.rb +126 -28
- data/spec/savon/request_spec.rb +404 -84
- data/spec/spec_helper.rb +11 -0
- metadata +25 -6
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,41 @@
|
|
1
|
-
|
1
|
+
### 2.1.0 (2013-02-03)
|
2
|
+
|
3
|
+
* Feature: [#372](https://github.com/savonrb/savon/pull/372) added global `ssl_cert_key_password` option.
|
4
|
+
|
5
|
+
* Feature: [#361](https://github.com/savonrb/savon/issues/361) added the local `:attributes`
|
6
|
+
option to allow adding XML attributes to the SOAP message tag.
|
7
|
+
|
8
|
+
* Improvement: [#363](https://github.com/savonrb/savon/issues/363) Savon 2.0 remembers the cookies from
|
9
|
+
the last response and passes it to the next request, which is not a proper way to handle cookies.
|
10
|
+
I removed this behavior and introduced an easy way to handle cookies manually instead.
|
11
|
+
|
12
|
+
* Improvement: [#380](https://github.com/savonrb/savon/pull/380) changed the gemspec to not rely on git.
|
13
|
+
|
14
|
+
* Fix: [#378](https://github.com/savonrb/savon/pull/378) use the proxy option for WSDL requests.
|
15
|
+
|
16
|
+
* Fix: [#369](https://github.com/savonrb/savon/pull/369) use HTTP basic and digest authentication
|
17
|
+
credentials to retrieve WSDL files.
|
18
|
+
Fixes [#367](https://github.com/savonrb/savon/issues/367#issuecomment-12720307).
|
19
|
+
|
20
|
+
* Fix: [#349](https://github.com/savonrb/savon/issues/349) global timeout and SSL options are
|
21
|
+
now used to retrieve a remote WSDL document.
|
22
|
+
|
23
|
+
* Fix: [#353](https://github.com/savonrb/savon/issues/353) simplified logging. the global `:log`
|
24
|
+
option is now only used to store whether Savon should log instead of creating a new `Logger`
|
25
|
+
and changing its logdev to `$stdout` or `/dev/null` depending on the what was passed.
|
26
|
+
|
27
|
+
This also fixes [rubiii/savon#2](https://github.com/rubiii/savon/issues/2) and
|
28
|
+
[#379](https://github.com/savonrb/savon/issues/379).
|
29
|
+
|
30
|
+
* Fix: [#376](https://github.com/savonrb/savon/issues/376) added a global `namespaces` option
|
31
|
+
for adding namespaces to the SOAP envelope.
|
32
|
+
|
33
|
+
### 2.0.3 (2013-01-19)
|
2
34
|
|
3
35
|
* Upgraded Nori dependency to prevent people from using a version that is vulnerable to
|
4
36
|
the recent [remote code execution bug](https://gist.github.com/4532291).
|
5
37
|
|
6
|
-
|
38
|
+
### 2.0.2 (2012-12-20)
|
7
39
|
|
8
40
|
* Fix: [#297](https://github.com/savonrb/savon/issues/297#issuecomment-11536517) added the global
|
9
41
|
`:ssl_verify_mode` and `:ssl_version` options which were missing.
|
@@ -11,13 +43,13 @@
|
|
11
43
|
* Fix: [#344](https://github.com/savonrb/savon/issues/344) added missing global ssl cert options
|
12
44
|
`:ssl_cert_file`, `:ssl_cert_key_file` and `:ssl_ca_cert_file`.
|
13
45
|
|
14
|
-
|
46
|
+
### 2.0.1 (2012-12-19)
|
15
47
|
|
16
48
|
* Fix [#342](https://github.com/savonrb/savon/issues/342) fixes an issue where namespaces could
|
17
49
|
not be resolved if the actual operation name to call did not match the operation name passed
|
18
50
|
to the client's `#call` method. For example: `:get_stations` for a `getStations` operation.
|
19
51
|
|
20
|
-
|
52
|
+
### 2.0.0 (2012-12-18)
|
21
53
|
|
22
54
|
* Read about all the changes in the [updated documentation](http://savonrb.com/version2.html).
|
23
55
|
|
@@ -32,7 +64,7 @@
|
|
32
64
|
|
33
65
|
* Fix: [321](https://github.com/savonrb/savon/issues/321) preserve `[false]` values in Hashes.
|
34
66
|
|
35
|
-
|
67
|
+
### 1.2.0 (2012-09-15)
|
36
68
|
|
37
69
|
* Fix: [#312](https://github.com/savonrb/savon/pull/312) recursively determines the proper namespaces
|
38
70
|
for SOAP body Hashes with nested Arrays of Hashes.
|
@@ -42,7 +74,7 @@
|
|
42
74
|
|
43
75
|
* Refactoring: Use the `Wasabi::Document` with resolver instead of the custom `Savon::Wasabi::Document`.
|
44
76
|
|
45
|
-
|
77
|
+
### 1.1.0 (2012-06-28)
|
46
78
|
|
47
79
|
* Improvement: Changed Savon's core dependencies to be more strict and only allow bug fix changes.
|
48
80
|
Major or minor releases of these dependencies now need a release of Savon so they can be used.
|
data/Gemfile
CHANGED
data/lib/savon.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Savon
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
Error = Class.new(RuntimeError)
|
4
|
+
InitializationError = Class.new(Error)
|
5
|
+
InvalidResponseError = Class.new(Error)
|
6
6
|
|
7
7
|
def self.client(globals = {}, &block)
|
8
8
|
Client.new(globals, &block)
|
data/lib/savon/builder.rb
CHANGED
@@ -30,7 +30,7 @@ module Savon
|
|
30
30
|
def to_s
|
31
31
|
return @locals[:xml] if @locals.include? :xml
|
32
32
|
|
33
|
-
tag(builder, :Envelope,
|
33
|
+
tag(builder, :Envelope, namespaces_with_globals) do |xml|
|
34
34
|
tag(xml, :Header) { xml << header.to_s } unless header.empty?
|
35
35
|
tag(xml, :Body) { xml.tag!(*namespaced_message_tag) { xml << message.to_s } }
|
36
36
|
end
|
@@ -65,6 +65,10 @@ module Savon
|
|
65
65
|
[path, identifier]
|
66
66
|
end
|
67
67
|
|
68
|
+
def namespaces_with_globals
|
69
|
+
namespaces.merge @globals[:namespaces]
|
70
|
+
end
|
71
|
+
|
68
72
|
def namespaces
|
69
73
|
@namespaces ||= begin
|
70
74
|
namespaces = SCHEMA_TYPES.dup
|
@@ -87,8 +91,11 @@ module Savon
|
|
87
91
|
end
|
88
92
|
|
89
93
|
def namespaced_message_tag
|
90
|
-
|
91
|
-
|
94
|
+
if @used_namespaces[[@operation_name.to_s]]
|
95
|
+
[@used_namespaces[[@operation_name.to_s]], message_tag, message_attributes]
|
96
|
+
else
|
97
|
+
[namespace_identifier, message_tag, message_attributes]
|
98
|
+
end
|
92
99
|
end
|
93
100
|
|
94
101
|
def message_tag
|
@@ -99,6 +106,10 @@ module Savon
|
|
99
106
|
@message_tag = message_tag.to_sym
|
100
107
|
end
|
101
108
|
|
109
|
+
def message_attributes
|
110
|
+
@locals[:attributes] || {}
|
111
|
+
end
|
112
|
+
|
102
113
|
def message
|
103
114
|
element_form_default = @globals[:element_form_default] || @wsdl.element_form_default
|
104
115
|
# TODO: clean this up! [dh, 2012-12-17]
|
data/lib/savon/client.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "savon/operation"
|
2
|
+
require "savon/request"
|
2
3
|
require "savon/options"
|
3
4
|
require "savon/block_interface"
|
4
5
|
require "wasabi"
|
@@ -7,6 +8,10 @@ module Savon
|
|
7
8
|
class Client
|
8
9
|
|
9
10
|
def initialize(globals = {}, &block)
|
11
|
+
unless globals.kind_of? Hash
|
12
|
+
raise_version1_initialize_error! globals
|
13
|
+
end
|
14
|
+
|
10
15
|
@globals = GlobalOptions.new(globals)
|
11
16
|
|
12
17
|
BlockInterface.new(@globals).evaluate(block) if block
|
@@ -15,10 +20,7 @@ module Savon
|
|
15
20
|
raise_initialization_error!
|
16
21
|
end
|
17
22
|
|
18
|
-
|
19
|
-
@wsdl.document = @globals[:wsdl] if @globals.include? :wsdl
|
20
|
-
@wsdl.endpoint = @globals[:endpoint] if @globals.include? :endpoint
|
21
|
-
@wsdl.namespace = @globals[:namespace] if @globals.include? :namespace
|
23
|
+
build_wsdl_document
|
22
24
|
end
|
23
25
|
|
24
26
|
attr_reader :globals
|
@@ -33,21 +35,32 @@ module Savon
|
|
33
35
|
end
|
34
36
|
|
35
37
|
def call(operation_name, locals = {}, &block)
|
36
|
-
|
37
|
-
persist_last_response(response)
|
38
|
-
response
|
38
|
+
operation(operation_name).call(locals, &block)
|
39
39
|
end
|
40
40
|
|
41
41
|
private
|
42
42
|
|
43
|
-
def
|
44
|
-
@
|
43
|
+
def build_wsdl_document
|
44
|
+
@wsdl = Wasabi::Document.new
|
45
|
+
|
46
|
+
@wsdl.document = @globals[:wsdl] if @globals.include? :wsdl
|
47
|
+
@wsdl.endpoint = @globals[:endpoint] if @globals.include? :endpoint
|
48
|
+
@wsdl.namespace = @globals[:namespace] if @globals.include? :namespace
|
49
|
+
|
50
|
+
@wsdl.request = WSDLRequest.new(@globals).build
|
45
51
|
end
|
46
52
|
|
47
53
|
def wsdl_or_endpoint_and_namespace_specified?
|
48
54
|
@globals.include?(:wsdl) || (@globals.include?(:endpoint) && @globals.include?(:namespace))
|
49
55
|
end
|
50
56
|
|
57
|
+
def raise_version1_initialize_error!(object)
|
58
|
+
raise InitializationError,
|
59
|
+
"Some code tries to initialize Savon with the #{object.inspect} (#{object.class}) \n" \
|
60
|
+
"Savon 2 expects a Hash of options for creating a new client and executing requests.\n" \
|
61
|
+
"Please read the updated documentation for version 2: http://savonrb.com/version2.html"
|
62
|
+
end
|
63
|
+
|
51
64
|
def raise_initialization_error!
|
52
65
|
raise InitializationError,
|
53
66
|
"Expected either a WSDL document or the SOAP endpoint and target namespace options.\n\n" \
|
data/lib/savon/operation.rb
CHANGED
@@ -2,6 +2,8 @@ require "savon/options"
|
|
2
2
|
require "savon/block_interface"
|
3
3
|
require "savon/request"
|
4
4
|
require "savon/builder"
|
5
|
+
require "savon/response"
|
6
|
+
require "savon/log_message"
|
5
7
|
|
6
8
|
module Savon
|
7
9
|
class Operation
|
@@ -41,10 +43,9 @@ module Savon
|
|
41
43
|
BlockInterface.new(@locals).evaluate(block) if block
|
42
44
|
|
43
45
|
builder = Builder.new(@name, @wsdl, @globals, @locals)
|
44
|
-
request = Request.new(@name, @wsdl, @globals, @locals)
|
45
46
|
|
46
47
|
response = Savon.notify_observers(@name, builder, @globals, @locals)
|
47
|
-
response ||=
|
48
|
+
response ||= call! build_request(builder)
|
48
49
|
|
49
50
|
raise_expected_httpi_response! unless response.kind_of?(HTTPI::Response)
|
50
51
|
|
@@ -53,6 +54,73 @@ module Savon
|
|
53
54
|
|
54
55
|
private
|
55
56
|
|
57
|
+
def call!(request)
|
58
|
+
log_request(request) if log?
|
59
|
+
response = HTTPI.post(request)
|
60
|
+
log_response(response) if log?
|
61
|
+
|
62
|
+
response
|
63
|
+
end
|
64
|
+
|
65
|
+
def build_request(builder)
|
66
|
+
request = SOAPRequest.new(@globals).build(
|
67
|
+
:soap_action => soap_action,
|
68
|
+
:cookies => @locals[:cookies]
|
69
|
+
)
|
70
|
+
|
71
|
+
request.url = endpoint
|
72
|
+
request.body = builder.to_s
|
73
|
+
|
74
|
+
# TODO: could HTTPI do this automatically in case the header
|
75
|
+
# was not specified manually? [dh, 2013-01-04]
|
76
|
+
request.headers["Content-Length"] = request.body.bytesize.to_s
|
77
|
+
|
78
|
+
request
|
79
|
+
end
|
80
|
+
|
81
|
+
def soap_action
|
82
|
+
# soap_action explicitly set to something falsy
|
83
|
+
return if @locals.include?(:soap_action) && !@locals[:soap_action]
|
84
|
+
|
85
|
+
# get the soap_action from local options
|
86
|
+
soap_action = @locals[:soap_action]
|
87
|
+
# with no local option, but a wsdl, ask it for the soap_action
|
88
|
+
soap_action ||= @wsdl.soap_action(@name.to_sym) if @wsdl.document?
|
89
|
+
# if there is no soap_action up to this point, fallback to a simple default
|
90
|
+
soap_action ||= Gyoku.xml_tag(@name, :key_converter => @globals[:convert_request_keys_to])
|
91
|
+
end
|
92
|
+
|
93
|
+
def endpoint
|
94
|
+
@globals[:endpoint] || @wsdl.endpoint
|
95
|
+
end
|
96
|
+
|
97
|
+
def log_request(request)
|
98
|
+
logger.info "SOAP request: #{request.url}"
|
99
|
+
logger.info headers_to_log(request.headers)
|
100
|
+
logger.debug body_to_log(request.body)
|
101
|
+
end
|
102
|
+
|
103
|
+
def log_response(response)
|
104
|
+
logger.info "SOAP response (status #{response.code})"
|
105
|
+
logger.debug body_to_log(response.body)
|
106
|
+
end
|
107
|
+
|
108
|
+
def headers_to_log(headers)
|
109
|
+
headers.map { |key, value| "#{key}: #{value}" }.join(", ")
|
110
|
+
end
|
111
|
+
|
112
|
+
def body_to_log(body)
|
113
|
+
LogMessage.new(body, @globals[:filters], @globals[:pretty_print_xml]).to_s
|
114
|
+
end
|
115
|
+
|
116
|
+
def logger
|
117
|
+
@globals[:logger]
|
118
|
+
end
|
119
|
+
|
120
|
+
def log?
|
121
|
+
@globals[:log]
|
122
|
+
end
|
123
|
+
|
56
124
|
def raise_expected_httpi_response!
|
57
125
|
raise Error, "Observers need to return an HTTPI::Response to mock " \
|
58
126
|
"the request or nil to execute the request."
|
data/lib/savon/options.rb
CHANGED
@@ -38,7 +38,9 @@ module Savon
|
|
38
38
|
defaults = {
|
39
39
|
:encoding => "UTF-8",
|
40
40
|
:soap_version => 1,
|
41
|
+
:namespaces => {},
|
41
42
|
:logger => Logger.new($stdout),
|
43
|
+
:log => true,
|
42
44
|
:filters => [],
|
43
45
|
:pretty_print_xml => false,
|
44
46
|
:raise_errors => true,
|
@@ -48,14 +50,12 @@ module Savon
|
|
48
50
|
|
49
51
|
options = defaults.merge(options)
|
50
52
|
|
51
|
-
#
|
52
|
-
# before it can be modified to set
|
53
|
-
delayed_log = options.delete(:log)
|
53
|
+
# this option is a shortcut on the logger which needs to be set
|
54
|
+
# before it can be modified to set the option.
|
54
55
|
delayed_level = options.delete(:log_level)
|
55
56
|
|
56
57
|
super(options)
|
57
58
|
|
58
|
-
log(delayed_log) unless delayed_log.nil?
|
59
59
|
log_level(delayed_level) unless delayed_level.nil?
|
60
60
|
end
|
61
61
|
|
@@ -79,6 +79,11 @@ module Savon
|
|
79
79
|
@options[:namespace_identifier] = identifier
|
80
80
|
end
|
81
81
|
|
82
|
+
# Namespaces for the SOAP envelope.
|
83
|
+
def namespaces(namespaces)
|
84
|
+
@options[:namespaces] = namespaces
|
85
|
+
end
|
86
|
+
|
82
87
|
# Proxy server to use for all requests.
|
83
88
|
def proxy(proxy)
|
84
89
|
@options[:proxy] = proxy
|
@@ -135,16 +140,8 @@ module Savon
|
|
135
140
|
|
136
141
|
# Whether or not to log.
|
137
142
|
def log(log)
|
138
|
-
|
139
|
-
|
140
|
-
target = $stdout
|
141
|
-
else
|
142
|
-
HTTPI.log = false
|
143
|
-
windows = RUBY_PLATFORM =~ /(mingw|bccwin|wince|mswin32)/i
|
144
|
-
target = windows ? "NUL:" : "/dev/null"
|
145
|
-
end
|
146
|
-
|
147
|
-
@options[:logger] = Logger.new(target)
|
143
|
+
HTTPI.log = log
|
144
|
+
@options[:log] = log
|
148
145
|
end
|
149
146
|
|
150
147
|
# The logger to use. Defaults to a Savon::Logger instance.
|
@@ -174,12 +171,6 @@ module Savon
|
|
174
171
|
@options[:pretty_print_xml] = pretty_print_xml
|
175
172
|
end
|
176
173
|
|
177
|
-
# Used by Savon to store the last response to pass
|
178
|
-
# its cookies to the next request.
|
179
|
-
def last_response(last_response)
|
180
|
-
@options[:last_response] = last_response
|
181
|
-
end
|
182
|
-
|
183
174
|
# Specifies the SSL version to use.
|
184
175
|
def ssl_version(version)
|
185
176
|
@options[:ssl_version] = version
|
@@ -195,6 +186,11 @@ module Savon
|
|
195
186
|
@options[:ssl_cert_key_file] = file
|
196
187
|
end
|
197
188
|
|
189
|
+
# Sets the cert key password to use.
|
190
|
+
def ssl_cert_key_password(password)
|
191
|
+
@options[:ssl_cert_key_password] = password
|
192
|
+
end
|
193
|
+
|
198
194
|
# Sets the cert file to use.
|
199
195
|
def ssl_cert_file(file)
|
200
196
|
@options[:ssl_cert_file] = file
|
@@ -266,11 +262,21 @@ module Savon
|
|
266
262
|
@options[:message_tag] = message_tag
|
267
263
|
end
|
268
264
|
|
265
|
+
# Attributes for the SOAP message tag.
|
266
|
+
def attributes(attributes)
|
267
|
+
@options[:attributes] = attributes
|
268
|
+
end
|
269
|
+
|
269
270
|
# Value of the SOAPAction HTTP header.
|
270
271
|
def soap_action(soap_action)
|
271
272
|
@options[:soap_action] = soap_action
|
272
273
|
end
|
273
274
|
|
275
|
+
# Cookies to be used for the next request.
|
276
|
+
def cookies(cookies)
|
277
|
+
@options[:cookies] = cookies
|
278
|
+
end
|
279
|
+
|
274
280
|
# The SOAP request XML to send. Expected to be a String.
|
275
281
|
def xml(xml)
|
276
282
|
@options[:xml] = xml
|
@@ -11,7 +11,7 @@ module Savon
|
|
11
11
|
|
12
12
|
def to_hash(hash, path)
|
13
13
|
return unless hash
|
14
|
-
return hash.map { |value|
|
14
|
+
return hash.map { |value| to_hash(value, path) } if hash.kind_of?(Array)
|
15
15
|
return hash.to_s unless hash.kind_of? Hash
|
16
16
|
|
17
17
|
hash.inject({}) do |newhash, (key, value)|
|
@@ -21,7 +21,7 @@ module Savon
|
|
21
21
|
if @used_namespaces[newpath]
|
22
22
|
newhash.merge(
|
23
23
|
"#{@used_namespaces[newpath]}:#{translated_key}" =>
|
24
|
-
|
24
|
+
to_hash(value, @types[newpath] ? [@types[newpath]] : newpath)
|
25
25
|
)
|
26
26
|
else
|
27
27
|
add_namespaces_to_values(value, path) if key == :order!
|
@@ -32,10 +32,6 @@ module Savon
|
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
-
def add_namespaces_to_body(value, path)
|
36
|
-
QualifiedMessage.new(@types, @used_namespaces, @key_converter).to_hash(value, path)
|
37
|
-
end
|
38
|
-
|
39
35
|
def add_namespaces_to_values(values, path)
|
40
36
|
values.collect! { |value|
|
41
37
|
camelcased_value = Gyoku.xml_tag(value, :key_converter => @key_converter)
|
data/lib/savon/request.rb
CHANGED
@@ -1,114 +1,87 @@
|
|
1
1
|
require "httpi"
|
2
|
-
require "savon/response"
|
3
|
-
require "savon/log_message"
|
4
2
|
|
5
3
|
module Savon
|
6
|
-
class
|
4
|
+
class HTTPRequest
|
7
5
|
|
8
|
-
|
9
|
-
1 => "text/xml;charset=%s",
|
10
|
-
2 => "application/soap+xml;charset=%s"
|
11
|
-
}
|
12
|
-
|
13
|
-
def initialize(operation_name, wsdl, globals, locals)
|
14
|
-
@operation_name = operation_name
|
15
|
-
|
16
|
-
@wsdl = wsdl
|
6
|
+
def initialize(globals, http_request = nil)
|
17
7
|
@globals = globals
|
18
|
-
@
|
19
|
-
@http = create_http_client
|
8
|
+
@http_request = http_request || HTTPI::Request.new
|
20
9
|
end
|
21
10
|
|
22
|
-
|
23
|
-
|
24
|
-
def call(xml)
|
25
|
-
@http.body = xml
|
26
|
-
@http.headers["Content-Length"] = xml.bytesize.to_s
|
27
|
-
|
28
|
-
log_request @http.url, @http.headers, @http.body
|
29
|
-
response = HTTPI.post(@http)
|
30
|
-
log_response response.code, response.body
|
31
|
-
|
32
|
-
response
|
11
|
+
def build
|
12
|
+
@http_request
|
33
13
|
end
|
34
14
|
|
35
15
|
private
|
36
16
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
configure_request(http)
|
41
|
-
configure_timeouts(http)
|
42
|
-
configure_headers(http)
|
43
|
-
configure_ssl(http)
|
44
|
-
configure_auth(http)
|
45
|
-
|
46
|
-
http
|
17
|
+
def configure_proxy
|
18
|
+
@http_request.proxy = @globals[:proxy] if @globals.include? :proxy
|
47
19
|
end
|
48
20
|
|
49
|
-
def
|
50
|
-
|
51
|
-
|
52
|
-
http.set_cookies @globals[:last_response] if @globals.include? :last_response
|
21
|
+
def configure_timeouts
|
22
|
+
@http_request.open_timeout = @globals[:open_timeout] if @globals.include? :open_timeout
|
23
|
+
@http_request.read_timeout = @globals[:read_timeout] if @globals.include? :read_timeout
|
53
24
|
end
|
54
25
|
|
55
|
-
def
|
56
|
-
|
57
|
-
|
26
|
+
def configure_ssl
|
27
|
+
@http_request.auth.ssl.ssl_version = @globals[:ssl_version] if @globals.include? :ssl_version
|
28
|
+
@http_request.auth.ssl.verify_mode = @globals[:ssl_verify_mode] if @globals.include? :ssl_verify_mode
|
29
|
+
|
30
|
+
@http_request.auth.ssl.cert_key_file = @globals[:ssl_cert_key_file] if @globals.include? :ssl_cert_key_file
|
31
|
+
@http_request.auth.ssl.cert_file = @globals[:ssl_cert_file] if @globals.include? :ssl_cert_file
|
32
|
+
@http_request.auth.ssl.ca_cert_file = @globals[:ssl_ca_cert_file] if @globals.include? :ssl_ca_cert_file
|
33
|
+
|
34
|
+
@http_request.auth.ssl.cert_key_password = @globals[:ssl_cert_key_password] if @globals.include? :ssl_cert_key_password
|
58
35
|
end
|
59
36
|
|
60
|
-
def
|
61
|
-
|
62
|
-
|
63
|
-
http.headers["Content-Type"] = CONTENT_TYPE[@globals[:soap_version]] % @globals[:encoding]
|
37
|
+
def configure_auth
|
38
|
+
@http_request.auth.basic(*@globals[:basic_auth]) if @globals.include? :basic_auth
|
39
|
+
@http_request.auth.digest(*@globals[:digest_auth]) if @globals.include? :digest_auth
|
64
40
|
end
|
65
41
|
|
66
|
-
|
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
|
42
|
+
end
|
69
43
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
44
|
+
class WSDLRequest < HTTPRequest
|
45
|
+
|
46
|
+
def build
|
47
|
+
configure_proxy
|
48
|
+
configure_timeouts
|
49
|
+
configure_ssl
|
50
|
+
configure_auth
|
74
51
|
|
75
|
-
|
76
|
-
http.auth.basic(*@globals[:basic_auth]) if @globals.include? :basic_auth
|
77
|
-
http.auth.digest(*@globals[:digest_auth]) if @globals.include? :digest_auth
|
52
|
+
@http_request
|
78
53
|
end
|
79
54
|
|
80
|
-
|
81
|
-
return if @locals.include?(:soap_action) && !@locals[:soap_action]
|
82
|
-
return @soap_action if defined? @soap_action
|
55
|
+
end
|
83
56
|
|
84
|
-
|
85
|
-
soap_action ||= @wsdl.soap_action(@operation_name.to_sym) if @wsdl.document?
|
86
|
-
soap_action ||= Gyoku.xml_tag(@operation_name, :key_converter => @globals[:convert_request_keys_to])
|
57
|
+
class SOAPRequest < HTTPRequest
|
87
58
|
|
88
|
-
|
89
|
-
|
59
|
+
CONTENT_TYPE = {
|
60
|
+
1 => "text/xml;charset=%s",
|
61
|
+
2 => "application/soap+xml;charset=%s"
|
62
|
+
}
|
90
63
|
|
91
|
-
def
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
64
|
+
def build(options = {})
|
65
|
+
configure_proxy
|
66
|
+
configure_cookies options[:cookies]
|
67
|
+
configure_timeouts
|
68
|
+
configure_headers options[:soap_action]
|
69
|
+
configure_ssl
|
70
|
+
configure_auth
|
96
71
|
|
97
|
-
|
98
|
-
logger.info "SOAP response (status #{code})"
|
99
|
-
logger.debug body_to_log(body)
|
72
|
+
@http_request
|
100
73
|
end
|
101
74
|
|
102
|
-
|
103
|
-
headers.map { |key, value| "#{key}: #{value}" }.join(", ")
|
104
|
-
end
|
75
|
+
private
|
105
76
|
|
106
|
-
def
|
107
|
-
|
77
|
+
def configure_cookies(cookies)
|
78
|
+
@http_request.set_cookies(cookies) if cookies
|
108
79
|
end
|
109
80
|
|
110
|
-
def
|
111
|
-
@globals[:
|
81
|
+
def configure_headers(soap_action)
|
82
|
+
@http_request.headers = @globals[:headers] if @globals.include? :headers
|
83
|
+
@http_request.headers["SOAPAction"] ||= %{"#{soap_action}"} if soap_action
|
84
|
+
@http_request.headers["Content-Type"] ||= CONTENT_TYPE[@globals[:soap_version]] % @globals[:encoding]
|
112
85
|
end
|
113
86
|
|
114
87
|
end
|