troelskn-handsoap 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +1 -1
- data/lib/handsoap/service.rb +134 -94
- metadata +2 -2
data/VERSION.yml
CHANGED
data/lib/handsoap/service.rb
CHANGED
@@ -104,26 +104,9 @@ module Handsoap
|
|
104
104
|
def self.request_content_type
|
105
105
|
@protocol_version == 1 ? "text/xml" : "application/soap+xml"
|
106
106
|
end
|
107
|
-
def self.map_method(mapping)
|
108
|
-
if @mapping.nil?
|
109
|
-
@mapping = {}
|
110
|
-
end
|
111
|
-
@mapping.merge! mapping
|
112
|
-
end
|
113
|
-
def self.on_create_document(&block)
|
114
|
-
@create_document_callback = block
|
115
|
-
end
|
116
|
-
def self.fire_on_create_document(doc)
|
117
|
-
if @create_document_callback
|
118
|
-
@create_document_callback.call doc
|
119
|
-
end
|
120
|
-
end
|
121
107
|
def self.uri
|
122
108
|
@uri
|
123
109
|
end
|
124
|
-
def self.get_mapping(name)
|
125
|
-
@mapping[name] if @mapping
|
126
|
-
end
|
127
110
|
@@instance = {}
|
128
111
|
def self.instance
|
129
112
|
@@instance[self.to_s] ||= self.new
|
@@ -135,14 +118,6 @@ module Handsoap
|
|
135
118
|
super
|
136
119
|
end
|
137
120
|
end
|
138
|
-
def method_missing(method, *args)
|
139
|
-
action = self.class.get_mapping(method)
|
140
|
-
if action
|
141
|
-
invoke(action, *args)
|
142
|
-
else
|
143
|
-
super
|
144
|
-
end
|
145
|
-
end
|
146
121
|
# Creates an XML document and sends it over HTTP.
|
147
122
|
#
|
148
123
|
# +action+ is the QName of the rootnode of the envelope.
|
@@ -173,60 +148,38 @@ module Handsoap
|
|
173
148
|
dispatch(doc, options[:soap_action])
|
174
149
|
end
|
175
150
|
end
|
151
|
+
# Hook that is called when a new request document is created.
|
152
|
+
#
|
153
|
+
# You can override this to add namespaces and other elements that are common to all requests (Such as authentication).
|
154
|
+
def on_create_document(doc)
|
155
|
+
end
|
176
156
|
# Hook that is called before the message is dispatched.
|
177
157
|
#
|
178
158
|
# You can override this to provide filtering and logging.
|
179
159
|
def on_before_dispatch
|
180
160
|
end
|
181
|
-
# Hook that is called
|
161
|
+
# Hook that is called when there is a response.
|
182
162
|
#
|
183
|
-
#
|
184
|
-
def
|
185
|
-
raise fault
|
163
|
+
# You can override this to register common namespaces, useful for parsing the document.
|
164
|
+
def on_response_document(doc)
|
186
165
|
end
|
187
|
-
|
188
|
-
# Helper to serialize a node into a ruby string
|
166
|
+
# Hook that is called if there is a HTTP level error.
|
189
167
|
#
|
190
|
-
#
|
191
|
-
def
|
192
|
-
|
193
|
-
return if n.nil?
|
194
|
-
n.to_utf8
|
168
|
+
# Default behaviour is to raise an error.
|
169
|
+
def on_http_error(status, content)
|
170
|
+
raise "HTTP error #{status}"
|
195
171
|
end
|
196
|
-
|
197
|
-
# Helper to serialize a node into a ruby integer
|
198
|
-
#
|
199
|
-
# *deprecated*. Use Handsoap::XmlQueryFront::BaseDriver#to_i
|
200
|
-
def xml_to_int(node, xquery = nil)
|
201
|
-
n = xquery ? node.xpath(xquery, ns).first : node
|
202
|
-
return if n.nil?
|
203
|
-
n.to_s.to_i
|
204
|
-
end
|
205
|
-
alias_method :xml_to_i, :xml_to_int
|
206
|
-
# Helper to serialize a node into a ruby float
|
207
|
-
#
|
208
|
-
# *deprecated*. Use Handsoap::XmlQueryFront::BaseDriver#to_f
|
209
|
-
def xml_to_float(node, xquery = nil)
|
210
|
-
n = xquery ? node.xpath(xquery, ns).first : node
|
211
|
-
return if n.nil?
|
212
|
-
n.to_s.to_f
|
213
|
-
end
|
214
|
-
alias_method :xml_to_f, :xml_to_float
|
215
|
-
# Helper to serialize a node into a ruby boolean
|
172
|
+
# Hook that is called if the dispatch returns a +Fault+.
|
216
173
|
#
|
217
|
-
#
|
218
|
-
def
|
219
|
-
|
220
|
-
return if n.nil?
|
221
|
-
n.to_s == "true"
|
174
|
+
# Default behaviour is to raise the Fault, but you can override this to provide logging and more fine-grained handling faults.
|
175
|
+
def on_fault(fault)
|
176
|
+
raise fault
|
222
177
|
end
|
223
|
-
#
|
178
|
+
# Hook that is called if the response does not contain a valid SOAP enevlope.
|
224
179
|
#
|
225
|
-
#
|
226
|
-
def
|
227
|
-
|
228
|
-
return if n.nil?
|
229
|
-
Time.iso8601(n.to_s)
|
180
|
+
# Default behaviour is to raise an error
|
181
|
+
def on_missing_document(soap_response)
|
182
|
+
raise "The response is not a valid SOAP envelope"
|
230
183
|
end
|
231
184
|
def debug(message = nil) #:nodoc:
|
232
185
|
if @@logger
|
@@ -238,7 +191,21 @@ module Handsoap
|
|
238
191
|
end
|
239
192
|
end
|
240
193
|
end
|
241
|
-
#
|
194
|
+
# Does the actual HTTP level interaction.
|
195
|
+
def send_http_request(uri, post_body, headers)
|
196
|
+
if Handsoap.http_driver == :curb
|
197
|
+
http_client = Curl::Easy.new(uri)
|
198
|
+
http_client.headers = headers
|
199
|
+
http_client.http_post post_body
|
200
|
+
return { :status => http_client.response_code, :body => http_client.body_str, :content_type => response.contenttype }
|
201
|
+
elsif Handsoap.http_driver == :httpclient
|
202
|
+
response = HTTPClient.new.post(uri, post_body, headers)
|
203
|
+
return { :status => response.status, :body => response.content, :content_type => response.content_type }
|
204
|
+
else
|
205
|
+
raise "Unknown http driver #{Handsoap.http_driver}"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
# Send document and parses the response into a +Response+
|
242
209
|
def dispatch(doc, action)
|
243
210
|
on_before_dispatch
|
244
211
|
headers = {
|
@@ -254,34 +221,25 @@ module Handsoap
|
|
254
221
|
logger.puts "---"
|
255
222
|
logger.puts body
|
256
223
|
end
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
end
|
268
|
-
soap_response = Response.new(http_client.body_str, self.class.envelope_namespace)
|
269
|
-
elsif Handsoap.http_driver == :httpclient
|
270
|
-
response = HTTPClient.new.post(self.class.uri, body, headers)
|
271
|
-
debug do |logger|
|
272
|
-
logger.puts "--- Response ---"
|
273
|
-
logger.puts "HTTP Status: %s" % [response.status]
|
274
|
-
logger.puts "Content-Type: %s" % [response.contenttype]
|
275
|
-
logger.puts "---"
|
276
|
-
logger.puts Handsoap.pretty_format_envelope(response.content)
|
277
|
-
end
|
278
|
-
soap_response = Response.new(response.content, self.class.envelope_namespace)
|
279
|
-
else
|
280
|
-
raise "Unknown http driver #{Handsoap.http_driver}"
|
224
|
+
response = send_http_request(self.class.uri, body, headers)
|
225
|
+
debug do |logger|
|
226
|
+
logger.puts "--- Response ---"
|
227
|
+
logger.puts "HTTP Status: %s" % [response[:status]]
|
228
|
+
logger.puts "Content-Type: %s" % [response[:content_type]]
|
229
|
+
logger.puts "---"
|
230
|
+
logger.puts Handsoap.pretty_format_envelope(response[:body])
|
231
|
+
end
|
232
|
+
if response[:status] >= 300
|
233
|
+
return on_http_error(response[:status], response[:body])
|
281
234
|
end
|
235
|
+
soap_response = Response.new(response[:body], self.class.envelope_namespace)
|
282
236
|
if soap_response.fault?
|
283
|
-
return
|
237
|
+
return on_fault(soap_response.fault)
|
284
238
|
end
|
239
|
+
unless soap_response.document?
|
240
|
+
return on_missing_document(soap_response)
|
241
|
+
end
|
242
|
+
on_response_document(soap_response.document)
|
285
243
|
return soap_response
|
286
244
|
end
|
287
245
|
# Creates a standard SOAP envelope and yields the +Body+ element.
|
@@ -293,7 +251,8 @@ module Handsoap
|
|
293
251
|
env.add "*:Body"
|
294
252
|
end
|
295
253
|
end
|
296
|
-
self.class.fire_on_create_document doc
|
254
|
+
self.class.fire_on_create_document doc # deprecated .. use instance method
|
255
|
+
on_create_document(doc)
|
297
256
|
if block_given?
|
298
257
|
yield doc.find("Body")
|
299
258
|
end
|
@@ -315,3 +274,84 @@ module Handsoap
|
|
315
274
|
end
|
316
275
|
|
317
276
|
end
|
277
|
+
|
278
|
+
# Legacy/CS code here. This shouldn't be used in new applications.
|
279
|
+
module Handsoap
|
280
|
+
class Service
|
281
|
+
# Registers a simple method mapping without any arguments and no parsing of response.
|
282
|
+
#
|
283
|
+
# This is deprecated
|
284
|
+
def self.map_method(mapping)
|
285
|
+
if @mapping.nil?
|
286
|
+
@mapping = {}
|
287
|
+
end
|
288
|
+
@mapping.merge! mapping
|
289
|
+
end
|
290
|
+
def self.get_mapping(name)
|
291
|
+
@mapping[name] if @mapping
|
292
|
+
end
|
293
|
+
def method_missing(method, *args)
|
294
|
+
action = self.class.get_mapping(method)
|
295
|
+
if action
|
296
|
+
invoke(action, *args)
|
297
|
+
else
|
298
|
+
super
|
299
|
+
end
|
300
|
+
end
|
301
|
+
# Registers a block to call when a request document is created.
|
302
|
+
#
|
303
|
+
# This is deprecated, in favour of #on_create_document
|
304
|
+
def self.on_create_document(&block)
|
305
|
+
@create_document_callback = block
|
306
|
+
end
|
307
|
+
def self.fire_on_create_document(doc)
|
308
|
+
if @create_document_callback
|
309
|
+
@create_document_callback.call doc
|
310
|
+
end
|
311
|
+
end
|
312
|
+
private
|
313
|
+
# Helper to serialize a node into a ruby string
|
314
|
+
#
|
315
|
+
# *deprecated*. Use Handsoap::XmlQueryFront::BaseDriver#to_s
|
316
|
+
def xml_to_str(node, xquery = nil)
|
317
|
+
n = xquery ? node.xpath(xquery, ns).first : node
|
318
|
+
return if n.nil?
|
319
|
+
n.to_s
|
320
|
+
end
|
321
|
+
alias_method :xml_to_s, :xml_to_str
|
322
|
+
# Helper to serialize a node into a ruby integer
|
323
|
+
#
|
324
|
+
# *deprecated*. Use Handsoap::XmlQueryFront::BaseDriver#to_i
|
325
|
+
def xml_to_int(node, xquery = nil)
|
326
|
+
n = xquery ? node.xpath(xquery, ns).first : node
|
327
|
+
return if n.nil?
|
328
|
+
n.to_s.to_i
|
329
|
+
end
|
330
|
+
alias_method :xml_to_i, :xml_to_int
|
331
|
+
# Helper to serialize a node into a ruby float
|
332
|
+
#
|
333
|
+
# *deprecated*. Use Handsoap::XmlQueryFront::BaseDriver#to_f
|
334
|
+
def xml_to_float(node, xquery = nil)
|
335
|
+
n = xquery ? node.xpath(xquery, ns).first : node
|
336
|
+
return if n.nil?
|
337
|
+
n.to_s.to_f
|
338
|
+
end
|
339
|
+
alias_method :xml_to_f, :xml_to_float
|
340
|
+
# Helper to serialize a node into a ruby boolean
|
341
|
+
#
|
342
|
+
# *deprecated*. Use Handsoap::XmlQueryFront::BaseDriver#to_boolean
|
343
|
+
def xml_to_bool(node, xquery = nil)
|
344
|
+
n = xquery ? node.xpath(xquery, ns).first : node
|
345
|
+
return if n.nil?
|
346
|
+
n.to_s == "true"
|
347
|
+
end
|
348
|
+
# Helper to serialize a node into a ruby Time object
|
349
|
+
#
|
350
|
+
# *deprecated*. Use Handsoap::XmlQueryFront::BaseDriver#to_date
|
351
|
+
def xml_to_date(node, xquery = nil)
|
352
|
+
n = xquery ? node.xpath(xquery, ns).first : node
|
353
|
+
return if n.nil?
|
354
|
+
Time.iso8601(n.to_s)
|
355
|
+
end
|
356
|
+
end
|
357
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: troelskn-handsoap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Troels Knak-Nielsen
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-06-
|
12
|
+
date: 2009-06-24 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|