* lib/soap/*, test/soap/*, sample/soap/authheader/*: eval cleanup.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7628 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
8180c1bd50
commit
e426b93e84
@ -1,3 +1,7 @@
|
|||||||
|
Wed Dec 22 00:05:10 2004 NAKAMURA, Hiroshi <nakahiro@sarion.co.jp>
|
||||||
|
|
||||||
|
* lib/soap/*, test/soap/*, sample/soap/authheader/*: eval cleanup.
|
||||||
|
|
||||||
Tue Dec 21 22:07:41 2004 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
Tue Dec 21 22:07:41 2004 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
||||||
|
|
||||||
* ext/openssl/ossl_asn1.c (ossl_asn1_decode_all): use rb_str_new4
|
* ext/openssl/ossl_asn1.c (ossl_asn1_decode_all): use rb_str_new4
|
||||||
|
@ -595,20 +595,13 @@ private
|
|||||||
if self.respond_to?(methodname)
|
if self.respond_to?(methodname)
|
||||||
methodname = safe_accessor_name(methodname)
|
methodname = safe_accessor_name(methodname)
|
||||||
end
|
end
|
||||||
begin
|
sclass = class << self; self; end
|
||||||
instance_eval <<-EOS
|
sclass.__send__(:define_method, methodname, proc {
|
||||||
def #{ methodname }()
|
@data[@array.index(name)]
|
||||||
@data[@array.index('#{ name }')]
|
})
|
||||||
end
|
sclass.__send__(:define_method, methodname + '=', proc { |value|
|
||||||
|
@data[@array.index(name)] = value
|
||||||
def #{ methodname }=(value)
|
})
|
||||||
@data[@array.index('#{ name }')] = value
|
|
||||||
end
|
|
||||||
EOS
|
|
||||||
rescue SyntaxError
|
|
||||||
methodname = safe_accessor_name(methodname)
|
|
||||||
retry
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def safe_accessor_name(name)
|
def safe_accessor_name(name)
|
||||||
|
@ -41,7 +41,7 @@ class Factory
|
|||||||
obj.instance_variables.each do |var|
|
obj.instance_variables.each do |var|
|
||||||
name = var.sub(/^@/, '')
|
name = var.sub(/^@/, '')
|
||||||
node.add(Mapping.name2elename(name),
|
node.add(Mapping.name2elename(name),
|
||||||
Mapping._obj2soap(obj.instance_eval(var), map))
|
Mapping._obj2soap(obj.instance_variable_get(var), map))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -156,13 +156,26 @@ module Mapping
|
|||||||
::Marshal.load(sprintf("\004\006o:%c%s\000", name.length + 5, name))
|
::Marshal.load(sprintf("\004\006o:%c%s\000", name.length + 5, name))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
unless Object.respond_to?(:instance_variable_get)
|
||||||
|
class Object
|
||||||
|
def instance_variable_get(ivarname)
|
||||||
|
instance_eval(ivarname)
|
||||||
|
end
|
||||||
|
|
||||||
|
def instance_variable_set(ivarname, value)
|
||||||
|
instance_eval("#{ivarname} = value")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.set_instance_vars(obj, values)
|
def self.set_instance_vars(obj, values)
|
||||||
values.each do |name, value|
|
values.each do |name, value|
|
||||||
setter = name + "="
|
setter = name + "="
|
||||||
if obj.respond_to?(setter)
|
if obj.respond_to?(setter)
|
||||||
obj.__send__(setter, value)
|
obj.__send__(setter, value)
|
||||||
else
|
else
|
||||||
obj.instance_eval("@#{ name } = value")
|
obj.instance_variable_set('@' + name, value)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -202,12 +215,12 @@ module Mapping
|
|||||||
|
|
||||||
def self.class2qname(klass)
|
def self.class2qname(klass)
|
||||||
name = if klass.class_variables.include?("@@schema_type")
|
name = if klass.class_variables.include?("@@schema_type")
|
||||||
klass.class_eval("@@schema_type")
|
klass.class_eval('@@schema_type')
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
namespace = if klass.class_variables.include?("@@schema_ns")
|
namespace = if klass.class_variables.include?("@@schema_ns")
|
||||||
klass.class_eval("@@schema_ns")
|
klass.class_eval('@@schema_ns')
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
@ -224,11 +237,11 @@ module Mapping
|
|||||||
def self.obj2element(obj)
|
def self.obj2element(obj)
|
||||||
name = namespace = nil
|
name = namespace = nil
|
||||||
ivars = obj.instance_variables
|
ivars = obj.instance_variables
|
||||||
if ivars.include?("@schema_type")
|
if ivars.include?('@schema_type')
|
||||||
name = obj.instance_eval("@schema_type")
|
name = obj.instance_variable_get('@schema_type')
|
||||||
end
|
end
|
||||||
if ivars.include?("@schema_ns")
|
if ivars.include?('@schema_ns')
|
||||||
namespace = obj.instance_eval("@schema_ns")
|
namespace = obj.instance_variable_get('@schema_ns')
|
||||||
end
|
end
|
||||||
if !name or !namespace
|
if !name or !namespace
|
||||||
class2qname(obj.class)
|
class2qname(obj.class)
|
||||||
@ -245,7 +258,7 @@ module Mapping
|
|||||||
if obj.respond_to?(name)
|
if obj.respond_to?(name)
|
||||||
obj.__send__(name)
|
obj.__send__(name)
|
||||||
else
|
else
|
||||||
obj.instance_eval("@#{name}")
|
obj.instance_variable_get('@' + name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -64,75 +64,50 @@ end
|
|||||||
# For anyType object: SOAP::Mapping::Object not ::Object
|
# For anyType object: SOAP::Mapping::Object not ::Object
|
||||||
class Object; include Marshallable
|
class Object; include Marshallable
|
||||||
def initialize
|
def initialize
|
||||||
@__soap_members = []
|
|
||||||
@__soap_value_type = {}
|
@__soap_value_type = {}
|
||||||
|
@__soap_value = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
def [](name)
|
def [](name)
|
||||||
if @__soap_members.include?(name)
|
@__soap_value[name]
|
||||||
self.__send__(name)
|
|
||||||
else
|
|
||||||
self.__send__(Object.safe_name(name))
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def []=(name, value)
|
def []=(name, value)
|
||||||
if @__soap_members.include?(name)
|
@__soap_value[name] = value
|
||||||
self.__send__(name + '=', value)
|
|
||||||
else
|
|
||||||
self.__send__(Object.safe_name(name) + '=', value)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def __soap_set_property(name, value)
|
def __soap_set_property(name, value)
|
||||||
var_name = name
|
unless @__soap_value.key?(name)
|
||||||
unless @__soap_members.include?(name)
|
__define_attr_accessor(name)
|
||||||
var_name = __define_attr_accessor(var_name)
|
|
||||||
end
|
end
|
||||||
__soap_set_property_value(var_name, value)
|
__soap_set_property_value(name, value)
|
||||||
var_name
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def __soap_set_property_value(name, value)
|
def __soap_set_property_value(name, value)
|
||||||
org = self.__send__(name)
|
org = self[name]
|
||||||
case @__soap_value_type[name]
|
case @__soap_value_type[name]
|
||||||
when :single
|
when :single
|
||||||
self.__send__(name + '=', [org, value])
|
self[name] = [org, value]
|
||||||
@__soap_value_type[name] = :multi
|
@__soap_value_type[name] = :multi
|
||||||
when :multi
|
when :multi
|
||||||
org << value
|
org << value
|
||||||
else
|
else
|
||||||
self.__send__(name + '=', value)
|
self[name] = value
|
||||||
@__soap_value_type[name] = :single
|
@__soap_value_type[name] = :single
|
||||||
end
|
end
|
||||||
value
|
value
|
||||||
end
|
end
|
||||||
|
|
||||||
def __define_attr_accessor(name)
|
def __define_attr_accessor(name)
|
||||||
var_name = name
|
sclass = class << self; self; end
|
||||||
begin
|
sclass.__send__(:define_method, name, proc {
|
||||||
instance_eval <<-EOS
|
self[name]
|
||||||
def #{ var_name }
|
})
|
||||||
@#{ var_name }
|
sclass.__send__(:define_method, name + '=', proc { |value|
|
||||||
end
|
self[name] = value
|
||||||
|
})
|
||||||
def #{ var_name }=(value)
|
|
||||||
@#{ var_name } = value
|
|
||||||
end
|
|
||||||
EOS
|
|
||||||
rescue SyntaxError
|
|
||||||
var_name = Object.safe_name(var_name)
|
|
||||||
retry
|
|
||||||
end
|
|
||||||
@__soap_members << var_name
|
|
||||||
var_name
|
|
||||||
end
|
|
||||||
|
|
||||||
def Object.safe_name(name)
|
|
||||||
require 'md5'
|
|
||||||
"var_" << MD5.new(name).hexdigest
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ private
|
|||||||
def elements2soap(obj, soap_obj, elements)
|
def elements2soap(obj, soap_obj, elements)
|
||||||
elements.each do |element|
|
elements.each do |element|
|
||||||
name = element.name.name
|
name = element.name.name
|
||||||
child_obj = obj.instance_eval("@#{ name }")
|
child_obj = obj.instance_variable_get('@' + name)
|
||||||
soap_obj.add(name, Mapping._obj2soap(child_obj, self, element.type))
|
soap_obj.add(name, Mapping._obj2soap(child_obj, self, element.type))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -27,17 +27,13 @@ class Driver
|
|||||||
class << self
|
class << self
|
||||||
def __attr_proxy(symbol, assignable = false)
|
def __attr_proxy(symbol, assignable = false)
|
||||||
name = symbol.to_s
|
name = symbol.to_s
|
||||||
module_eval <<-EOD
|
self.__send__(:define_method, name, proc {
|
||||||
def #{name}
|
@servant.__send__(name)
|
||||||
@servant.#{name}
|
})
|
||||||
end
|
|
||||||
EOD
|
|
||||||
if assignable
|
if assignable
|
||||||
module_eval <<-EOD
|
self.__send__(:define_method, name + '=', proc { |rhs|
|
||||||
def #{name}=(rhs)
|
@servant.__send__(name + '=', rhs)
|
||||||
@servant.#{name} = rhs
|
})
|
||||||
end
|
|
||||||
EOD
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -292,28 +288,27 @@ private
|
|||||||
end
|
end
|
||||||
|
|
||||||
def add_rpc_method_interface(name, param_def)
|
def add_rpc_method_interface(name, param_def)
|
||||||
param_names = []
|
param_count = 0
|
||||||
i = 0
|
|
||||||
@proxy.operation[name].each_param_name(RPC::SOAPMethod::IN,
|
@proxy.operation[name].each_param_name(RPC::SOAPMethod::IN,
|
||||||
RPC::SOAPMethod::INOUT) do |param_name|
|
RPC::SOAPMethod::INOUT) do |param_name|
|
||||||
i += 1
|
param_count += 1
|
||||||
param_names << "arg#{ i }"
|
|
||||||
end
|
end
|
||||||
callparam = (param_names.collect { |pname| ", " + pname }).join
|
sclass = class << @host; self; end
|
||||||
@host.instance_eval <<-EOS
|
sclass.__send__(:define_method, name, proc { |*arg|
|
||||||
def #{ name }(#{ param_names.join(", ") })
|
unless arg.size == param_count
|
||||||
@servant.call(#{ name.dump }#{ callparam })
|
raise ArgumentError.new(
|
||||||
end
|
"wrong number of arguments (#{arg.size} for #{param_count})")
|
||||||
EOS
|
end
|
||||||
|
@servant.call(name, *arg)
|
||||||
|
})
|
||||||
@host.method(name)
|
@host.method(name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_document_method_interface(name, paramname)
|
def add_document_method_interface(name, paramname)
|
||||||
@host.instance_eval <<-EOS
|
sclass = class << @host; self; end
|
||||||
def #{ name }(param)
|
sclass.__send__(:define_method, name, proc { |param|
|
||||||
@servant.call(#{ name.dump }, param)
|
@servant.call(name, param)
|
||||||
end
|
})
|
||||||
EOS
|
|
||||||
@host.method(name)
|
@host.method(name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -79,17 +79,13 @@ class WSDLDriver
|
|||||||
class << self
|
class << self
|
||||||
def __attr_proxy(symbol, assignable = false)
|
def __attr_proxy(symbol, assignable = false)
|
||||||
name = symbol.to_s
|
name = symbol.to_s
|
||||||
module_eval <<-EOD
|
self.__send__(:define_method, name, proc {
|
||||||
def #{name}
|
@servant.__send__(name)
|
||||||
@servant.#{name}
|
})
|
||||||
end
|
|
||||||
EOD
|
|
||||||
if assignable
|
if assignable
|
||||||
module_eval <<-EOD
|
self.__send__(:define_method, name + '=', proc { |rhs|
|
||||||
def #{name}=(rhs)
|
@servant.__send__(name + '=', rhs)
|
||||||
@servant.#{name} = rhs
|
})
|
||||||
end
|
|
||||||
EOD
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -348,7 +344,7 @@ class WSDLDriver
|
|||||||
def create_method_obj(names, params)
|
def create_method_obj(names, params)
|
||||||
o = Object.new
|
o = Object.new
|
||||||
for idx in 0 ... params.length
|
for idx in 0 ... params.length
|
||||||
o.instance_eval("@#{ names[idx] } = params[idx]")
|
o.instance_variable_set('@' + names[idx], params[idx])
|
||||||
end
|
end
|
||||||
o
|
o
|
||||||
end
|
end
|
||||||
@ -436,22 +432,23 @@ class WSDLDriver
|
|||||||
end
|
end
|
||||||
|
|
||||||
def add_rpc_method_interface(name, parts_names)
|
def add_rpc_method_interface(name, parts_names)
|
||||||
i = 0
|
sclass = class << @host; self; end
|
||||||
param_names = parts_names.collect { |orgname| i += 1; "arg#{ i }" }
|
sclass.__send__(:define_method, name, proc { |*arg|
|
||||||
callparam = (param_names.collect { |pname| ", " + pname }).join
|
unless arg.size == parts_names.size
|
||||||
@host.instance_eval <<-EOS
|
raise ArgumentError.new(
|
||||||
def #{ name }(#{ param_names.join(", ") })
|
"wrong number of arguments (#{arg.size} for #{parts_names.size})")
|
||||||
@servant.rpc_call(#{ name.dump }#{ callparam })
|
end
|
||||||
end
|
@servant.rpc_call(name, *arg)
|
||||||
EOS
|
})
|
||||||
|
@host.method(name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_document_method_interface(name)
|
def add_document_method_interface(name)
|
||||||
@host.instance_eval <<-EOS
|
sclass = class << @host; self; end
|
||||||
def #{ name }(h, b)
|
sclass.__send__(:define_method, name, proc { |h, b|
|
||||||
@servant.document_send(#{ name.dump }, h, b)
|
@servant.document_send(name, h, b)
|
||||||
end
|
})
|
||||||
EOS
|
@host.method(name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def setup_options
|
def setup_options
|
||||||
|
@ -6,18 +6,16 @@ server = ARGV.shift || 'http://localhost:7000/'
|
|||||||
class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
|
class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
|
||||||
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
||||||
|
|
||||||
def initialize(userid, passwd)
|
attr_accessor :sessionid
|
||||||
|
|
||||||
|
def initialize
|
||||||
super(MyHeaderName)
|
super(MyHeaderName)
|
||||||
@sessionid = nil
|
@sessionid = nil
|
||||||
@userid = userid
|
|
||||||
@passwd = passwd
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def on_simple_outbound
|
def on_simple_outbound
|
||||||
if @sessionid
|
if @sessionid
|
||||||
{ "sessionid" => @sessionid }
|
{ "sessionid" => @sessionid }
|
||||||
else
|
|
||||||
{ "userid" => @userid, "passwd" => @passwd }
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -28,12 +26,17 @@ end
|
|||||||
|
|
||||||
ns = 'http://tempuri.org/authHeaderPort'
|
ns = 'http://tempuri.org/authHeaderPort'
|
||||||
serv = SOAP::RPC::Driver.new(server, ns)
|
serv = SOAP::RPC::Driver.new(server, ns)
|
||||||
|
serv.add_method('login', 'userid', 'passwd')
|
||||||
serv.add_method('deposit', 'amt')
|
serv.add_method('deposit', 'amt')
|
||||||
serv.add_method('withdrawal', 'amt')
|
serv.add_method('withdrawal', 'amt')
|
||||||
|
|
||||||
serv.headerhandler << ClientAuthHeaderHandler.new('NaHi', 'passwd')
|
h = ClientAuthHeaderHandler.new
|
||||||
|
|
||||||
|
serv.headerhandler << h
|
||||||
|
|
||||||
serv.wiredump_dev = STDOUT
|
serv.wiredump_dev = STDOUT
|
||||||
|
|
||||||
|
sessionid = serv.login('NaHi', 'passwd')
|
||||||
|
h.sessionid = sessionid
|
||||||
p serv.deposit(150)
|
p serv.deposit(150)
|
||||||
p serv.withdrawal(120)
|
p serv.withdrawal(120)
|
||||||
|
@ -23,6 +23,7 @@ class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
|
|||||||
def initialize(*arg)
|
def initialize(*arg)
|
||||||
super
|
super
|
||||||
add_rpc_servant(AuthHeaderService.new, Name)
|
add_rpc_servant(AuthHeaderService.new, Name)
|
||||||
|
# header handler must be a per request handler.
|
||||||
add_rpc_request_headerhandler(ServerAuthHeaderHandler)
|
add_rpc_request_headerhandler(ServerAuthHeaderHandler)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -6,10 +6,6 @@ require 'authmgr'
|
|||||||
|
|
||||||
class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
|
class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
|
||||||
class AuthHeaderService
|
class AuthHeaderService
|
||||||
def self.create
|
|
||||||
new
|
|
||||||
end
|
|
||||||
|
|
||||||
def initialize(authmgr)
|
def initialize(authmgr)
|
||||||
@authmgr = authmgr
|
@authmgr = authmgr
|
||||||
end
|
end
|
||||||
@ -34,14 +30,20 @@ class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
|
|||||||
Name = 'http://tempuri.org/authHeaderPort'
|
Name = 'http://tempuri.org/authHeaderPort'
|
||||||
def initialize(*arg)
|
def initialize(*arg)
|
||||||
super
|
super
|
||||||
add_rpc_servant(AuthHeaderService.new, Name)
|
authmgr = Authmgr.new
|
||||||
ServerAuthHeaderHandler.init
|
add_rpc_servant(AuthHeaderService.new(authmgr), Name)
|
||||||
|
ServerAuthHeaderHandler.init(authmgr)
|
||||||
|
# header handler must be a per request handler.
|
||||||
add_rpc_request_headerhandler(ServerAuthHeaderHandler)
|
add_rpc_request_headerhandler(ServerAuthHeaderHandler)
|
||||||
end
|
end
|
||||||
|
|
||||||
class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler
|
class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler
|
||||||
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
||||||
|
|
||||||
|
def self.init(authmgr)
|
||||||
|
@authmgr = authmgr
|
||||||
|
end
|
||||||
|
|
||||||
def self.create
|
def self.create
|
||||||
new(@authmgr)
|
new(@authmgr)
|
||||||
end
|
end
|
||||||
@ -63,7 +65,7 @@ class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
|
|||||||
if sessionid = my_header["sessionid"]
|
if sessionid = my_header["sessionid"]
|
||||||
if userid = @authmgr.auth(sessionid)
|
if userid = @authmgr.auth(sessionid)
|
||||||
@authmgr.destroy_session(sessionid)
|
@authmgr.destroy_session(sessionid)
|
||||||
@session_id = @authmgr.create_session(userid)
|
@sessionid = @authmgr.create_session(userid)
|
||||||
auth = true
|
auth = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -73,5 +75,9 @@ class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
|
|||||||
end
|
end
|
||||||
|
|
||||||
if $0 == __FILE__
|
if $0 == __FILE__
|
||||||
status = AuthHeaderPortServer.new('AuthHeaderPortServer', nil, '0.0.0.0', 7000).start
|
svr = AuthHeaderPortServer.new('AuthHeaderPortServer', nil, '0.0.0.0', 7000)
|
||||||
|
trap(:INT) do
|
||||||
|
svr.shutdown
|
||||||
|
end
|
||||||
|
status = svr.start
|
||||||
end
|
end
|
||||||
|
@ -59,7 +59,7 @@ class TestSOAPElement < Test::Unit::TestCase
|
|||||||
assert_equal(child, obj.var_foo)
|
assert_equal(child, obj.var_foo)
|
||||||
child = d("_?a?b_")
|
child = d("_?a?b_")
|
||||||
obj.add(child)
|
obj.add(child)
|
||||||
assert_equal(child, obj.var__ab_)
|
assert_equal(child, obj.__send__('_?a?b_'))
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_member
|
def test_member
|
||||||
|
Loading…
x
Reference in New Issue
Block a user