rubysl-soap 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +0 -1
- data/.travis.yml +8 -0
- data/README.md +2 -2
- data/Rakefile +0 -1
- data/lib/rubysl/soap.rb +1 -0
- data/lib/rubysl/soap/version.rb +5 -0
- data/lib/soap/attachment.rb +107 -0
- data/lib/soap/baseData.rb +942 -0
- data/lib/soap/element.rb +258 -0
- data/lib/soap/encodingstyle/aspDotNetHandler.rb +213 -0
- data/lib/soap/encodingstyle/handler.rb +100 -0
- data/lib/soap/encodingstyle/literalHandler.rb +226 -0
- data/lib/soap/encodingstyle/soapHandler.rb +582 -0
- data/lib/soap/generator.rb +268 -0
- data/lib/soap/header/handler.rb +57 -0
- data/lib/soap/header/handlerset.rb +70 -0
- data/lib/soap/header/simplehandler.rb +44 -0
- data/lib/soap/httpconfigloader.rb +119 -0
- data/lib/soap/mapping.rb +10 -0
- data/lib/soap/mapping/factory.rb +355 -0
- data/lib/soap/mapping/mapping.rb +381 -0
- data/lib/soap/mapping/registry.rb +541 -0
- data/lib/soap/mapping/rubytypeFactory.rb +475 -0
- data/lib/soap/mapping/typeMap.rb +50 -0
- data/lib/soap/mapping/wsdlencodedregistry.rb +280 -0
- data/lib/soap/mapping/wsdlliteralregistry.rb +418 -0
- data/lib/soap/marshal.rb +59 -0
- data/lib/soap/mimemessage.rb +240 -0
- data/lib/soap/netHttpClient.rb +190 -0
- data/lib/soap/parser.rb +251 -0
- data/lib/soap/processor.rb +66 -0
- data/lib/soap/property.rb +333 -0
- data/lib/soap/rpc/cgistub.rb +206 -0
- data/lib/soap/rpc/driver.rb +254 -0
- data/lib/soap/rpc/element.rb +325 -0
- data/lib/soap/rpc/httpserver.rb +129 -0
- data/lib/soap/rpc/proxy.rb +497 -0
- data/lib/soap/rpc/router.rb +594 -0
- data/lib/soap/rpc/rpc.rb +25 -0
- data/lib/soap/rpc/soaplet.rb +162 -0
- data/lib/soap/rpc/standaloneServer.rb +43 -0
- data/lib/soap/soap.rb +140 -0
- data/lib/soap/streamHandler.rb +229 -0
- data/lib/soap/wsdlDriver.rb +575 -0
- data/rubysl-soap.gemspec +19 -18
- metadata +115 -86
- data/lib/rubysl-soap.rb +0 -7
- data/lib/rubysl-soap/version.rb +0 -5
@@ -0,0 +1,206 @@
|
|
1
|
+
# SOAP4R - CGI/mod_ruby stub 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 'soap/streamHandler'
|
10
|
+
require 'webrick/httpresponse'
|
11
|
+
require 'webrick/httpstatus'
|
12
|
+
require 'logger'
|
13
|
+
require 'soap/rpc/soaplet'
|
14
|
+
|
15
|
+
|
16
|
+
module SOAP
|
17
|
+
module RPC
|
18
|
+
|
19
|
+
|
20
|
+
###
|
21
|
+
# SYNOPSIS
|
22
|
+
# CGIStub.new
|
23
|
+
#
|
24
|
+
# DESCRIPTION
|
25
|
+
# To be written...
|
26
|
+
#
|
27
|
+
class CGIStub < Logger::Application
|
28
|
+
include SOAP
|
29
|
+
include WEBrick
|
30
|
+
|
31
|
+
class SOAPRequest
|
32
|
+
attr_reader :body
|
33
|
+
|
34
|
+
def [](var); end
|
35
|
+
|
36
|
+
def meta_vars; end
|
37
|
+
end
|
38
|
+
|
39
|
+
class SOAPStdinRequest < SOAPRequest
|
40
|
+
attr_reader :body
|
41
|
+
|
42
|
+
def initialize(stream)
|
43
|
+
size = ENV['CONTENT_LENGTH'].to_i || 0
|
44
|
+
@body = stream.read(size)
|
45
|
+
end
|
46
|
+
|
47
|
+
def [](var)
|
48
|
+
ENV[var.gsub(/-/, '_').upcase]
|
49
|
+
end
|
50
|
+
|
51
|
+
def meta_vars
|
52
|
+
{
|
53
|
+
'HTTP_SOAPACTION' => ENV['HTTP_SOAPAction']
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class SOAPFCGIRequest < SOAPRequest
|
59
|
+
attr_reader :body
|
60
|
+
|
61
|
+
def initialize(request)
|
62
|
+
@request = request
|
63
|
+
@body = @request.in.read
|
64
|
+
end
|
65
|
+
|
66
|
+
def [](var)
|
67
|
+
@request.env[var.gsub(/-/, '_').upcase]
|
68
|
+
end
|
69
|
+
|
70
|
+
def meta_vars
|
71
|
+
{
|
72
|
+
'HTTP_SOAPACTION' => @request.env['HTTP_SOAPAction']
|
73
|
+
}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def initialize(appname, default_namespace)
|
78
|
+
super(appname)
|
79
|
+
set_log(STDERR)
|
80
|
+
self.level = ERROR
|
81
|
+
@default_namespace = default_namespace
|
82
|
+
@remote_host = ENV['REMOTE_HOST'] || ENV['REMOTE_ADDR'] || 'unknown'
|
83
|
+
@router = ::SOAP::RPC::Router.new(self.class.name)
|
84
|
+
@soaplet = ::SOAP::RPC::SOAPlet.new(@router)
|
85
|
+
on_init
|
86
|
+
end
|
87
|
+
|
88
|
+
def on_init
|
89
|
+
# do extra initialization in a derived class if needed.
|
90
|
+
end
|
91
|
+
|
92
|
+
def mapping_registry
|
93
|
+
@router.mapping_registry
|
94
|
+
end
|
95
|
+
|
96
|
+
def mapping_registry=(value)
|
97
|
+
@router.mapping_registry = value
|
98
|
+
end
|
99
|
+
|
100
|
+
def generate_explicit_type
|
101
|
+
@router.generate_explicit_type
|
102
|
+
end
|
103
|
+
|
104
|
+
def generate_explicit_type=(generate_explicit_type)
|
105
|
+
@router.generate_explicit_type = generate_explicit_type
|
106
|
+
end
|
107
|
+
|
108
|
+
# servant entry interface
|
109
|
+
|
110
|
+
def add_rpc_servant(obj, namespace = @default_namespace)
|
111
|
+
@router.add_rpc_servant(obj, namespace)
|
112
|
+
end
|
113
|
+
alias add_servant add_rpc_servant
|
114
|
+
|
115
|
+
def add_headerhandler(obj)
|
116
|
+
@router.add_headerhandler(obj)
|
117
|
+
end
|
118
|
+
alias add_rpc_headerhandler add_headerhandler
|
119
|
+
|
120
|
+
# method entry interface
|
121
|
+
|
122
|
+
def add_rpc_method(obj, name, *param)
|
123
|
+
add_rpc_method_with_namespace_as(@default_namespace, obj, name, name, *param)
|
124
|
+
end
|
125
|
+
alias add_method add_rpc_method
|
126
|
+
|
127
|
+
def add_rpc_method_as(obj, name, name_as, *param)
|
128
|
+
add_rpc_method_with_namespace_as(@default_namespace, obj, name, name_as, *param)
|
129
|
+
end
|
130
|
+
alias add_method_as add_rpc_method_as
|
131
|
+
|
132
|
+
def add_rpc_method_with_namespace(namespace, obj, name, *param)
|
133
|
+
add_rpc_method_with_namespace_as(namespace, obj, name, name, *param)
|
134
|
+
end
|
135
|
+
alias add_method_with_namespace add_rpc_method_with_namespace
|
136
|
+
|
137
|
+
def add_rpc_method_with_namespace_as(namespace, obj, name, name_as, *param)
|
138
|
+
qname = XSD::QName.new(namespace, name_as)
|
139
|
+
soapaction = nil
|
140
|
+
param_def = SOAPMethod.derive_rpc_param_def(obj, name, *param)
|
141
|
+
@router.add_rpc_operation(obj, qname, soapaction, name, param_def)
|
142
|
+
end
|
143
|
+
alias add_method_with_namespace_as add_rpc_method_with_namespace_as
|
144
|
+
|
145
|
+
def add_rpc_operation(receiver, qname, soapaction, name, param_def, opt = {})
|
146
|
+
@router.add_rpc_operation(receiver, qname, soapaction, name, param_def, opt)
|
147
|
+
end
|
148
|
+
|
149
|
+
def add_document_operation(receiver, soapaction, name, param_def, opt = {})
|
150
|
+
@router.add_document_operation(receiver, soapaction, name, param_def, opt)
|
151
|
+
end
|
152
|
+
|
153
|
+
def set_fcgi_request(request)
|
154
|
+
@fcgi = request
|
155
|
+
end
|
156
|
+
|
157
|
+
private
|
158
|
+
|
159
|
+
HTTPVersion = WEBrick::HTTPVersion.new('1.0') # dummy; ignored
|
160
|
+
|
161
|
+
def run
|
162
|
+
res = WEBrick::HTTPResponse.new({:HTTPVersion => HTTPVersion})
|
163
|
+
begin
|
164
|
+
@log.info { "received a request from '#{ @remote_host }'" }
|
165
|
+
if @fcgi
|
166
|
+
req = SOAPFCGIRequest.new(@fcgi)
|
167
|
+
else
|
168
|
+
req = SOAPStdinRequest.new($stdin)
|
169
|
+
end
|
170
|
+
@soaplet.do_POST(req, res)
|
171
|
+
rescue HTTPStatus::EOFError, HTTPStatus::RequestTimeout => ex
|
172
|
+
res.set_error(ex)
|
173
|
+
rescue HTTPStatus::Error => ex
|
174
|
+
res.set_error(ex)
|
175
|
+
rescue HTTPStatus::Status => ex
|
176
|
+
res.status = ex.code
|
177
|
+
rescue StandardError, NameError => ex # for Ruby 1.6
|
178
|
+
res.set_error(ex, true)
|
179
|
+
ensure
|
180
|
+
if defined?(MOD_RUBY)
|
181
|
+
r = Apache.request
|
182
|
+
r.status = res.status
|
183
|
+
r.content_type = res.content_type
|
184
|
+
r.send_http_header
|
185
|
+
buf = res.body
|
186
|
+
else
|
187
|
+
buf = ''
|
188
|
+
res.send_response(buf)
|
189
|
+
buf.sub!(/^[^\r]+\r\n/, '') # Trim status line.
|
190
|
+
end
|
191
|
+
@log.debug { "SOAP CGI Response:\n#{ buf }" }
|
192
|
+
if @fcgi
|
193
|
+
@fcgi.out.print buf
|
194
|
+
@fcgi.finish
|
195
|
+
@fcgi = nil
|
196
|
+
else
|
197
|
+
print buf
|
198
|
+
end
|
199
|
+
end
|
200
|
+
0
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
|
205
|
+
end
|
206
|
+
end
|
@@ -0,0 +1,254 @@
|
|
1
|
+
# SOAP4R - SOAP RPC driver
|
2
|
+
# Copyright (C) 2000, 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 'soap/soap'
|
10
|
+
require 'soap/mapping'
|
11
|
+
require 'soap/mapping/wsdlliteralregistry'
|
12
|
+
require 'soap/rpc/rpc'
|
13
|
+
require 'soap/rpc/proxy'
|
14
|
+
require 'soap/rpc/element'
|
15
|
+
require 'soap/streamHandler'
|
16
|
+
require 'soap/property'
|
17
|
+
require 'soap/header/handlerset'
|
18
|
+
|
19
|
+
|
20
|
+
module SOAP
|
21
|
+
module RPC
|
22
|
+
|
23
|
+
|
24
|
+
class Driver
|
25
|
+
class << self
|
26
|
+
if RUBY_VERSION >= "1.7.0"
|
27
|
+
def __attr_proxy(symbol, assignable = false)
|
28
|
+
name = symbol.to_s
|
29
|
+
define_method(name) {
|
30
|
+
@proxy.__send__(name)
|
31
|
+
}
|
32
|
+
if assignable
|
33
|
+
aname = name + '='
|
34
|
+
define_method(aname) { |rhs|
|
35
|
+
@proxy.__send__(aname, rhs)
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
else
|
40
|
+
def __attr_proxy(symbol, assignable = false)
|
41
|
+
name = symbol.to_s
|
42
|
+
module_eval <<-EOS
|
43
|
+
def #{name}
|
44
|
+
@proxy.#{name}
|
45
|
+
end
|
46
|
+
EOS
|
47
|
+
if assignable
|
48
|
+
module_eval <<-EOS
|
49
|
+
def #{name}=(value)
|
50
|
+
@proxy.#{name} = value
|
51
|
+
end
|
52
|
+
EOS
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
__attr_proxy :endpoint_url, true
|
59
|
+
__attr_proxy :mapping_registry, true
|
60
|
+
__attr_proxy :default_encodingstyle, true
|
61
|
+
__attr_proxy :generate_explicit_type, true
|
62
|
+
__attr_proxy :allow_unqualified_element, true
|
63
|
+
__attr_proxy :headerhandler
|
64
|
+
__attr_proxy :streamhandler
|
65
|
+
__attr_proxy :test_loopback_response
|
66
|
+
__attr_proxy :reset_stream
|
67
|
+
|
68
|
+
attr_reader :proxy
|
69
|
+
attr_reader :options
|
70
|
+
attr_accessor :soapaction
|
71
|
+
|
72
|
+
def inspect
|
73
|
+
"#<#{self.class}:#{@proxy.inspect}>"
|
74
|
+
end
|
75
|
+
|
76
|
+
def httpproxy
|
77
|
+
options["protocol.http.proxy"]
|
78
|
+
end
|
79
|
+
|
80
|
+
def httpproxy=(httpproxy)
|
81
|
+
options["protocol.http.proxy"] = httpproxy
|
82
|
+
end
|
83
|
+
|
84
|
+
def wiredump_dev
|
85
|
+
options["protocol.http.wiredump_dev"]
|
86
|
+
end
|
87
|
+
|
88
|
+
def wiredump_dev=(wiredump_dev)
|
89
|
+
options["protocol.http.wiredump_dev"] = wiredump_dev
|
90
|
+
end
|
91
|
+
|
92
|
+
def mandatorycharset
|
93
|
+
options["protocol.mandatorycharset"]
|
94
|
+
end
|
95
|
+
|
96
|
+
def mandatorycharset=(mandatorycharset)
|
97
|
+
options["protocol.mandatorycharset"] = mandatorycharset
|
98
|
+
end
|
99
|
+
|
100
|
+
def wiredump_file_base
|
101
|
+
options["protocol.wiredump_file_base"]
|
102
|
+
end
|
103
|
+
|
104
|
+
def wiredump_file_base=(wiredump_file_base)
|
105
|
+
options["protocol.wiredump_file_base"] = wiredump_file_base
|
106
|
+
end
|
107
|
+
|
108
|
+
def initialize(endpoint_url, namespace = nil, soapaction = nil)
|
109
|
+
@namespace = namespace
|
110
|
+
@soapaction = soapaction
|
111
|
+
@options = setup_options
|
112
|
+
@wiredump_file_base = nil
|
113
|
+
@proxy = Proxy.new(endpoint_url, @soapaction, @options)
|
114
|
+
end
|
115
|
+
|
116
|
+
def loadproperty(propertyname)
|
117
|
+
unless options.loadproperty(propertyname)
|
118
|
+
raise LoadError.new("No such property to load -- #{propertyname}")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def add_rpc_method(name, *params)
|
123
|
+
add_rpc_method_with_soapaction_as(name, name, @soapaction, *params)
|
124
|
+
end
|
125
|
+
|
126
|
+
def add_rpc_method_as(name, name_as, *params)
|
127
|
+
add_rpc_method_with_soapaction_as(name, name_as, @soapaction, *params)
|
128
|
+
end
|
129
|
+
|
130
|
+
def add_rpc_method_with_soapaction(name, soapaction, *params)
|
131
|
+
add_rpc_method_with_soapaction_as(name, name, soapaction, *params)
|
132
|
+
end
|
133
|
+
|
134
|
+
def add_rpc_method_with_soapaction_as(name, name_as, soapaction, *params)
|
135
|
+
param_def = SOAPMethod.create_rpc_param_def(params)
|
136
|
+
qname = XSD::QName.new(@namespace, name_as)
|
137
|
+
@proxy.add_rpc_method(qname, soapaction, name, param_def)
|
138
|
+
add_rpc_method_interface(name, param_def)
|
139
|
+
end
|
140
|
+
|
141
|
+
# add_method is for shortcut of typical rpc/encoded method definition.
|
142
|
+
alias add_method add_rpc_method
|
143
|
+
alias add_method_as add_rpc_method_as
|
144
|
+
alias add_method_with_soapaction add_rpc_method_with_soapaction
|
145
|
+
alias add_method_with_soapaction_as add_rpc_method_with_soapaction_as
|
146
|
+
|
147
|
+
def add_document_method(name, soapaction, req_qname, res_qname)
|
148
|
+
param_def = SOAPMethod.create_doc_param_def(req_qname, res_qname)
|
149
|
+
@proxy.add_document_method(soapaction, name, param_def)
|
150
|
+
add_document_method_interface(name, param_def)
|
151
|
+
end
|
152
|
+
|
153
|
+
def add_rpc_operation(qname, soapaction, name, param_def, opt = {})
|
154
|
+
@proxy.add_rpc_operation(qname, soapaction, name, param_def, opt)
|
155
|
+
add_rpc_method_interface(name, param_def)
|
156
|
+
end
|
157
|
+
|
158
|
+
def add_document_operation(soapaction, name, param_def, opt = {})
|
159
|
+
@proxy.add_document_operation(soapaction, name, param_def, opt)
|
160
|
+
add_document_method_interface(name, param_def)
|
161
|
+
end
|
162
|
+
|
163
|
+
def invoke(headers, body)
|
164
|
+
if headers and !headers.is_a?(SOAPHeader)
|
165
|
+
headers = create_header(headers)
|
166
|
+
end
|
167
|
+
set_wiredump_file_base(body.elename.name)
|
168
|
+
env = @proxy.invoke(headers, body)
|
169
|
+
if env.nil?
|
170
|
+
return nil, nil
|
171
|
+
else
|
172
|
+
return env.header, env.body
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def call(name, *params)
|
177
|
+
set_wiredump_file_base(name)
|
178
|
+
@proxy.call(name, *params)
|
179
|
+
end
|
180
|
+
|
181
|
+
private
|
182
|
+
|
183
|
+
def set_wiredump_file_base(name)
|
184
|
+
if @wiredump_file_base
|
185
|
+
@proxy.set_wiredump_file_base("#{@wiredump_file_base}_#{name}")
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def create_header(headers)
|
190
|
+
header = SOAPHeader.new()
|
191
|
+
headers.each do |content, mustunderstand, encodingstyle|
|
192
|
+
header.add(SOAPHeaderItem.new(content, mustunderstand, encodingstyle))
|
193
|
+
end
|
194
|
+
header
|
195
|
+
end
|
196
|
+
|
197
|
+
def setup_options
|
198
|
+
if opt = Property.loadproperty(::SOAP::PropertyName)
|
199
|
+
opt = opt["client"]
|
200
|
+
end
|
201
|
+
opt ||= Property.new
|
202
|
+
opt.add_hook("protocol.mandatorycharset") do |key, value|
|
203
|
+
@proxy.mandatorycharset = value
|
204
|
+
end
|
205
|
+
opt.add_hook("protocol.wiredump_file_base") do |key, value|
|
206
|
+
@wiredump_file_base = value
|
207
|
+
end
|
208
|
+
opt["protocol.http.charset"] ||= XSD::Charset.xml_encoding_label
|
209
|
+
opt["protocol.http.proxy"] ||= Env::HTTP_PROXY
|
210
|
+
opt["protocol.http.no_proxy"] ||= Env::NO_PROXY
|
211
|
+
opt
|
212
|
+
end
|
213
|
+
|
214
|
+
def add_rpc_method_interface(name, param_def)
|
215
|
+
param_count = RPC::SOAPMethod.param_count(param_def,
|
216
|
+
RPC::SOAPMethod::IN, RPC::SOAPMethod::INOUT)
|
217
|
+
add_method_interface(name, param_count)
|
218
|
+
end
|
219
|
+
|
220
|
+
def add_document_method_interface(name, param_def)
|
221
|
+
param_count = RPC::SOAPMethod.param_count(param_def, RPC::SOAPMethod::IN)
|
222
|
+
add_method_interface(name, param_count)
|
223
|
+
end
|
224
|
+
|
225
|
+
if RUBY_VERSION > "1.7.0"
|
226
|
+
def add_method_interface(name, param_count)
|
227
|
+
::SOAP::Mapping.define_singleton_method(self, name) do |*arg|
|
228
|
+
unless arg.size == param_count
|
229
|
+
raise ArgumentError.new(
|
230
|
+
"wrong number of arguments (#{arg.size} for #{param_count})")
|
231
|
+
end
|
232
|
+
call(name, *arg)
|
233
|
+
end
|
234
|
+
self.method(name)
|
235
|
+
end
|
236
|
+
else
|
237
|
+
def add_method_interface(name, param_count)
|
238
|
+
instance_eval <<-EOS
|
239
|
+
def #{name}(*arg)
|
240
|
+
unless arg.size == #{param_count}
|
241
|
+
raise ArgumentError.new(
|
242
|
+
"wrong number of arguments (\#{arg.size} for #{param_count})")
|
243
|
+
end
|
244
|
+
call(#{name.dump}, *arg)
|
245
|
+
end
|
246
|
+
EOS
|
247
|
+
self.method(name)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
|
253
|
+
end
|
254
|
+
end
|