* 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:
nahi 2004-12-21 15:08:56 +00:00
parent 8180c1bd50
commit e426b93e84
12 changed files with 116 additions and 129 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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