rubysl-soap 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +0 -1
  3. data/.travis.yml +8 -0
  4. data/README.md +2 -2
  5. data/Rakefile +0 -1
  6. data/lib/rubysl/soap.rb +1 -0
  7. data/lib/rubysl/soap/version.rb +5 -0
  8. data/lib/soap/attachment.rb +107 -0
  9. data/lib/soap/baseData.rb +942 -0
  10. data/lib/soap/element.rb +258 -0
  11. data/lib/soap/encodingstyle/aspDotNetHandler.rb +213 -0
  12. data/lib/soap/encodingstyle/handler.rb +100 -0
  13. data/lib/soap/encodingstyle/literalHandler.rb +226 -0
  14. data/lib/soap/encodingstyle/soapHandler.rb +582 -0
  15. data/lib/soap/generator.rb +268 -0
  16. data/lib/soap/header/handler.rb +57 -0
  17. data/lib/soap/header/handlerset.rb +70 -0
  18. data/lib/soap/header/simplehandler.rb +44 -0
  19. data/lib/soap/httpconfigloader.rb +119 -0
  20. data/lib/soap/mapping.rb +10 -0
  21. data/lib/soap/mapping/factory.rb +355 -0
  22. data/lib/soap/mapping/mapping.rb +381 -0
  23. data/lib/soap/mapping/registry.rb +541 -0
  24. data/lib/soap/mapping/rubytypeFactory.rb +475 -0
  25. data/lib/soap/mapping/typeMap.rb +50 -0
  26. data/lib/soap/mapping/wsdlencodedregistry.rb +280 -0
  27. data/lib/soap/mapping/wsdlliteralregistry.rb +418 -0
  28. data/lib/soap/marshal.rb +59 -0
  29. data/lib/soap/mimemessage.rb +240 -0
  30. data/lib/soap/netHttpClient.rb +190 -0
  31. data/lib/soap/parser.rb +251 -0
  32. data/lib/soap/processor.rb +66 -0
  33. data/lib/soap/property.rb +333 -0
  34. data/lib/soap/rpc/cgistub.rb +206 -0
  35. data/lib/soap/rpc/driver.rb +254 -0
  36. data/lib/soap/rpc/element.rb +325 -0
  37. data/lib/soap/rpc/httpserver.rb +129 -0
  38. data/lib/soap/rpc/proxy.rb +497 -0
  39. data/lib/soap/rpc/router.rb +594 -0
  40. data/lib/soap/rpc/rpc.rb +25 -0
  41. data/lib/soap/rpc/soaplet.rb +162 -0
  42. data/lib/soap/rpc/standaloneServer.rb +43 -0
  43. data/lib/soap/soap.rb +140 -0
  44. data/lib/soap/streamHandler.rb +229 -0
  45. data/lib/soap/wsdlDriver.rb +575 -0
  46. data/rubysl-soap.gemspec +19 -18
  47. metadata +115 -86
  48. data/lib/rubysl-soap.rb +0 -7
  49. data/lib/rubysl-soap/version.rb +0 -5
@@ -0,0 +1,268 @@
1
+ # SOAP4R - SOAP XML Instance Generator library.
2
+ # Copyright (C) 2001, 2003, 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'xsd/ns'
10
+ require 'soap/soap'
11
+ require 'soap/baseData'
12
+ require 'soap/encodingstyle/handler'
13
+
14
+
15
+ module SOAP
16
+
17
+
18
+ ###
19
+ ## CAUTION: MT-unsafe
20
+ #
21
+ class SOAPGenerator
22
+ include SOAP
23
+
24
+ class FormatEncodeError < Error; end
25
+
26
+ public
27
+
28
+ attr_accessor :charset
29
+ attr_accessor :default_encodingstyle
30
+ attr_accessor :generate_explicit_type
31
+ attr_accessor :use_numeric_character_reference
32
+
33
+ def initialize(opt = {})
34
+ @reftarget = nil
35
+ @handlers = {}
36
+ @charset = opt[:charset] || XSD::Charset.xml_encoding_label
37
+ @default_encodingstyle = opt[:default_encodingstyle] || EncodingNamespace
38
+ @generate_explicit_type =
39
+ opt.key?(:generate_explicit_type) ? opt[:generate_explicit_type] : true
40
+ @elementformdefault = opt[:elementformdefault]
41
+ @attributeformdefault = opt[:attributeformdefault]
42
+ @use_numeric_character_reference = opt[:use_numeric_character_reference]
43
+ @indentstr = opt[:no_indent] ? '' : ' '
44
+ @buf = @indent = @curr = nil
45
+ end
46
+
47
+ def generate(obj, io = nil)
48
+ @buf = io || ''
49
+ @indent = ''
50
+
51
+ prologue
52
+ @handlers.each do |uri, handler|
53
+ handler.encode_prologue
54
+ end
55
+
56
+ ns = XSD::NS.new
57
+ @buf << xmldecl
58
+ encode_data(ns, obj, nil)
59
+
60
+ @handlers.each do |uri, handler|
61
+ handler.encode_epilogue
62
+ end
63
+ epilogue
64
+
65
+ @buf
66
+ end
67
+
68
+ def encode_data(ns, obj, parent)
69
+ if obj.is_a?(SOAPEnvelopeElement)
70
+ encode_element(ns, obj, parent)
71
+ return
72
+ end
73
+ if @reftarget && !obj.precedents.empty?
74
+ add_reftarget(obj.elename.name, obj)
75
+ ref = SOAPReference.new(obj)
76
+ ref.elename = ref.elename.dup_name(obj.elename.name)
77
+ obj.precedents.clear # Avoid cyclic delay.
78
+ obj.encodingstyle = parent.encodingstyle
79
+ # SOAPReference is encoded here.
80
+ obj = ref
81
+ end
82
+ encodingstyle = obj.encodingstyle
83
+ # Children's encodingstyle is derived from its parent.
84
+ encodingstyle ||= parent.encodingstyle if parent
85
+ obj.encodingstyle = encodingstyle
86
+ handler = find_handler(encodingstyle || @default_encodingstyle)
87
+ unless handler
88
+ raise FormatEncodeError.new("Unknown encodingStyle: #{ encodingstyle }.")
89
+ end
90
+ if !obj.elename.name
91
+ raise FormatEncodeError.new("Element name not defined: #{ obj }.")
92
+ end
93
+ handler.encode_data(self, ns, obj, parent)
94
+ handler.encode_data_end(self, ns, obj, parent)
95
+ end
96
+
97
+ def add_reftarget(name, node)
98
+ unless @reftarget
99
+ raise FormatEncodeError.new("Reftarget is not defined.")
100
+ end
101
+ @reftarget.add(name, node)
102
+ end
103
+
104
+ def encode_child(ns, child, parent)
105
+ indent_backup, @indent = @indent, @indent + @indentstr
106
+ encode_data(ns.clone_ns, child, parent)
107
+ @indent = indent_backup
108
+ end
109
+
110
+ def encode_element(ns, obj, parent)
111
+ attrs = {}
112
+ if obj.is_a?(SOAPBody)
113
+ @reftarget = obj
114
+ obj.encode(self, ns, attrs) do |child|
115
+ indent_backup, @indent = @indent, @indent + @indentstr
116
+ encode_data(ns.clone_ns, child, obj)
117
+ @indent = indent_backup
118
+ end
119
+ @reftarget = nil
120
+ else
121
+ if obj.is_a?(SOAPEnvelope)
122
+ # xsi:nil="true" can appear even if dumping without explicit type.
123
+ SOAPGenerator.assign_ns(attrs, ns,
124
+ XSD::InstanceNamespace, XSINamespaceTag)
125
+ if @generate_explicit_type
126
+ SOAPGenerator.assign_ns(attrs, ns, XSD::Namespace, XSDNamespaceTag)
127
+ end
128
+ end
129
+ obj.encode(self, ns, attrs) do |child|
130
+ indent_backup, @indent = @indent, @indent + @indentstr
131
+ encode_data(ns.clone_ns, child, obj)
132
+ @indent = indent_backup
133
+ end
134
+ end
135
+ end
136
+
137
+ def encode_name(ns, data, attrs)
138
+ if element_local?(data)
139
+ data.elename.name
140
+ else
141
+ if element_qualified?(data)
142
+ SOAPGenerator.assign_ns(attrs, ns, data.elename.namespace, '')
143
+ else
144
+ SOAPGenerator.assign_ns(attrs, ns, data.elename.namespace)
145
+ end
146
+ ns.name(data.elename)
147
+ end
148
+ end
149
+
150
+ def encode_name_end(ns, data)
151
+ if element_local?(data)
152
+ data.elename.name
153
+ else
154
+ ns.name(data.elename)
155
+ end
156
+ end
157
+
158
+ def encode_tag(elename, attrs = nil)
159
+ if !attrs or attrs.empty?
160
+ @buf << "\n#{ @indent }<#{ elename }>"
161
+ elsif attrs.size == 1
162
+ key, value = attrs.shift
163
+ @buf << %Q[\n#{ @indent }<#{ elename } #{ key }="#{ value }">]
164
+ else
165
+ @buf << "\n#{ @indent }<#{ elename } " <<
166
+ attrs.collect { |key, value|
167
+ %Q[#{ key }="#{ value }"]
168
+ }.join("\n#{ @indent }#{ @indentstr * 2 }") <<
169
+ '>'
170
+ end
171
+ end
172
+
173
+ def encode_tag_end(elename, cr = nil)
174
+ if cr
175
+ @buf << "\n#{ @indent }</#{ elename }>"
176
+ else
177
+ @buf << "</#{ elename }>"
178
+ end
179
+ end
180
+
181
+ def encode_rawstring(str)
182
+ @buf << str
183
+ end
184
+
185
+ EncodeMap = {
186
+ '&' => '&amp;',
187
+ '<' => '&lt;',
188
+ '>' => '&gt;',
189
+ '"' => '&quot;',
190
+ '\'' => '&apos;',
191
+ "\r" => '&#xd;'
192
+ }
193
+ EncodeCharRegexp = Regexp.new("[#{EncodeMap.keys.join}]")
194
+ def encode_string(str)
195
+ if @use_numeric_character_reference and !XSD::Charset.is_us_ascii(str)
196
+ str.gsub!(EncodeCharRegexp) { |c| EncodeMap[c] }
197
+ @buf << str.unpack("U*").collect { |c|
198
+ if c == 0x9 or c == 0xa or c == 0xd or (c >= 0x20 and c <= 0x7f)
199
+ c.chr
200
+ else
201
+ sprintf("&#x%x;", c)
202
+ end
203
+ }.join
204
+ else
205
+ @buf << str.gsub(EncodeCharRegexp) { |c| EncodeMap[c] }
206
+ end
207
+ end
208
+
209
+ def element_local?(element)
210
+ element.elename.namespace.nil?
211
+ end
212
+
213
+ def element_qualified?(element)
214
+ if element.respond_to?(:qualified)
215
+ if element.qualified.nil?
216
+ @elementformdefault
217
+ else
218
+ element.qualified
219
+ end
220
+ else
221
+ @elementformdefault
222
+ end
223
+ end
224
+
225
+ def self.assign_ns(attrs, ns, namespace, tag = nil)
226
+ if namespace.nil?
227
+ raise FormatEncodeError.new("empty namespace")
228
+ end
229
+ unless ns.assigned?(namespace)
230
+ tag = ns.assign(namespace, tag)
231
+ if tag == ''
232
+ attr = 'xmlns'
233
+ else
234
+ attr = "xmlns:#{tag}"
235
+ end
236
+ attrs[attr] = namespace
237
+ end
238
+ end
239
+
240
+ private
241
+
242
+ def prologue
243
+ end
244
+
245
+ def epilogue
246
+ end
247
+
248
+ def find_handler(encodingstyle)
249
+ unless @handlers.key?(encodingstyle)
250
+ handler = SOAP::EncodingStyle::Handler.handler(encodingstyle).new(@charset)
251
+ handler.generate_explicit_type = @generate_explicit_type
252
+ handler.encode_prologue
253
+ @handlers[encodingstyle] = handler
254
+ end
255
+ @handlers[encodingstyle]
256
+ end
257
+
258
+ def xmldecl
259
+ if @charset
260
+ %Q[<?xml version="1.0" encoding="#{ @charset }" ?>]
261
+ else
262
+ %Q[<?xml version="1.0" ?>]
263
+ end
264
+ end
265
+ end
266
+
267
+
268
+ end
@@ -0,0 +1,57 @@
1
+ # SOAP4R - SOAP Header handler item
2
+ # Copyright (C) 2003, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'soap/element'
10
+
11
+
12
+ module SOAP
13
+ module Header
14
+
15
+
16
+ class Handler
17
+ attr_reader :elename
18
+ attr_reader :mustunderstand
19
+ attr_reader :encodingstyle
20
+
21
+ def initialize(elename)
22
+ @elename = elename
23
+ @mustunderstand = false
24
+ @encodingstyle = nil
25
+ end
26
+
27
+ # Should return a SOAP/OM, a SOAPHeaderItem or nil.
28
+ def on_outbound
29
+ nil
30
+ end
31
+
32
+ # Given header is a SOAPHeaderItem or nil.
33
+ def on_inbound(header, mustunderstand = false)
34
+ # do something.
35
+ end
36
+
37
+ def on_outbound_headeritem
38
+ item = on_outbound
39
+ if item.nil?
40
+ nil
41
+ elsif item.is_a?(::SOAP::SOAPHeaderItem)
42
+ item.elename = @elename
43
+ item
44
+ else
45
+ item.elename = @elename
46
+ ::SOAP::SOAPHeaderItem.new(item, @mustunderstand, @encodingstyle)
47
+ end
48
+ end
49
+
50
+ def on_inbound_headeritem(header)
51
+ on_inbound(header.element, header.mustunderstand)
52
+ end
53
+ end
54
+
55
+
56
+ end
57
+ end
@@ -0,0 +1,70 @@
1
+ # SOAP4R - SOAP Header handler set
2
+ # Copyright (C) 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'xsd/namedelements'
10
+
11
+
12
+ module SOAP
13
+ module Header
14
+
15
+
16
+ class HandlerSet
17
+ def initialize
18
+ @store = XSD::NamedElements.new
19
+ end
20
+
21
+ def dup
22
+ obj = HandlerSet.new
23
+ obj.store = @store.dup
24
+ obj
25
+ end
26
+
27
+ def add(handler)
28
+ @store << handler
29
+ end
30
+ alias << add
31
+
32
+ def delete(handler)
33
+ @store.delete(handler)
34
+ end
35
+
36
+ def include?(handler)
37
+ @store.include?(handler)
38
+ end
39
+
40
+ # returns: Array of SOAPHeaderItem
41
+ def on_outbound
42
+ @store.collect { |handler|
43
+ handler.on_outbound_headeritem
44
+ }.compact
45
+ end
46
+
47
+ # headers: SOAPHeaderItem enumerable object
48
+ def on_inbound(headers)
49
+ headers.each do |name, item|
50
+ handler = @store.find { |handler|
51
+ handler.elename == item.element.elename
52
+ }
53
+ if handler
54
+ handler.on_inbound_headeritem(item)
55
+ elsif item.mustunderstand
56
+ raise UnhandledMustUnderstandHeaderError.new(item.element.elename.to_s)
57
+ end
58
+ end
59
+ end
60
+
61
+ protected
62
+
63
+ def store=(store)
64
+ @store = store
65
+ end
66
+ end
67
+
68
+
69
+ end
70
+ end
@@ -0,0 +1,44 @@
1
+ # SOAP4R - SOAP Simple header item handler
2
+ # Copyright (C) 2003-2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'soap/header/handler'
10
+ require 'soap/baseData'
11
+
12
+
13
+ module SOAP
14
+ module Header
15
+
16
+
17
+ class SimpleHandler < SOAP::Header::Handler
18
+ def initialize(elename)
19
+ super(elename)
20
+ end
21
+
22
+ # Should return a Hash, String or nil.
23
+ def on_simple_outbound
24
+ nil
25
+ end
26
+
27
+ # Given header is a Hash, String or nil.
28
+ def on_simple_inbound(header, mustunderstand)
29
+ end
30
+
31
+ def on_outbound
32
+ h = on_simple_outbound
33
+ h ? SOAPElement.from_obj(h, elename.namespace) : nil
34
+ end
35
+
36
+ def on_inbound(header, mustunderstand)
37
+ h = header.respond_to?(:to_obj) ? header.to_obj : header.data
38
+ on_simple_inbound(h, mustunderstand)
39
+ end
40
+ end
41
+
42
+
43
+ end
44
+ end
@@ -0,0 +1,119 @@
1
+ # SOAP4R - HTTP config loader.
2
+ # Copyright (C) 2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'soap/property'
10
+
11
+
12
+ module SOAP
13
+
14
+
15
+ module HTTPConfigLoader
16
+ module_function
17
+
18
+ def set_options(client, options)
19
+ client.proxy = options["proxy"]
20
+ options.add_hook("proxy") do |key, value|
21
+ client.proxy = value
22
+ end
23
+ client.no_proxy = options["no_proxy"]
24
+ options.add_hook("no_proxy") do |key, value|
25
+ client.no_proxy = value
26
+ end
27
+ if client.respond_to?(:protocol_version=)
28
+ client.protocol_version = options["protocol_version"]
29
+ options.add_hook("protocol_version") do |key, value|
30
+ client.protocol_version = value
31
+ end
32
+ end
33
+ ssl_config = options["ssl_config"] ||= ::SOAP::Property.new
34
+ set_ssl_config(client, ssl_config)
35
+ ssl_config.add_hook(true) do |key, value|
36
+ set_ssl_config(client, ssl_config)
37
+ end
38
+ basic_auth = options["basic_auth"] ||= ::SOAP::Property.new
39
+ set_basic_auth(client, basic_auth)
40
+ basic_auth.add_hook do |key, value|
41
+ set_basic_auth(client, basic_auth)
42
+ end
43
+ options.add_hook("connect_timeout") do |key, value|
44
+ client.connect_timeout = value
45
+ end
46
+ options.add_hook("send_timeout") do |key, value|
47
+ client.send_timeout = value
48
+ end
49
+ options.add_hook("receive_timeout") do |key, value|
50
+ client.receive_timeout = value
51
+ end
52
+ end
53
+
54
+ def set_basic_auth(client, basic_auth)
55
+ basic_auth.values.each do |url, userid, passwd|
56
+ client.set_basic_auth(url, userid, passwd)
57
+ end
58
+ end
59
+
60
+ def set_ssl_config(client, ssl_config)
61
+ ssl_config.each do |key, value|
62
+ cfg = client.ssl_config
63
+ if cfg.nil?
64
+ raise NotImplementedError.new("SSL not supported")
65
+ end
66
+ case key
67
+ when 'client_cert'
68
+ cfg.client_cert = cert_from_file(value)
69
+ when 'client_key'
70
+ cfg.client_key = key_from_file(value)
71
+ when 'client_ca'
72
+ cfg.client_ca = value
73
+ when 'ca_path'
74
+ cfg.set_trust_ca(value)
75
+ when 'ca_file'
76
+ cfg.set_trust_ca(value)
77
+ when 'crl'
78
+ cfg.set_crl(value)
79
+ when 'verify_mode'
80
+ cfg.verify_mode = ssl_config_int(value)
81
+ when 'verify_depth'
82
+ cfg.verify_depth = ssl_config_int(value)
83
+ when 'options'
84
+ cfg.options = value
85
+ when 'ciphers'
86
+ cfg.ciphers = value
87
+ when 'verify_callback'
88
+ cfg.verify_callback = value
89
+ when 'cert_store'
90
+ cfg.cert_store = value
91
+ else
92
+ raise ArgumentError.new("unknown ssl_config property #{key}")
93
+ end
94
+ end
95
+ end
96
+
97
+ def ssl_config_int(value)
98
+ if value.nil? or value.to_s.empty?
99
+ nil
100
+ else
101
+ begin
102
+ Integer(value)
103
+ rescue ArgumentError
104
+ ::SOAP::Property::Util.const_from_name(value.to_s)
105
+ end
106
+ end
107
+ end
108
+
109
+ def cert_from_file(filename)
110
+ OpenSSL::X509::Certificate.new(File.open(filename) { |f| f.read })
111
+ end
112
+
113
+ def key_from_file(filename)
114
+ OpenSSL::PKey::RSA.new(File.open(filename) { |f| f.read })
115
+ end
116
+ end
117
+
118
+
119
+ end