mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
This commit was manufactured by cvs2svn to create branch 'ruby_1_8'.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6568 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ab31bf0d4d
commit
5548c7bff2
74 changed files with 5479 additions and 0 deletions
57
lib/soap/header/handler.rb
Normal file
57
lib/soap/header/handler.rb
Normal file
|
@ -0,0 +1,57 @@
|
|||
# SOAP4R - SOAP Header handler item
|
||||
# Copyright (C) 2003, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'soap/element'
|
||||
|
||||
|
||||
module SOAP
|
||||
module Header
|
||||
|
||||
|
||||
class Handler
|
||||
attr_reader :elename
|
||||
attr_reader :mustunderstand
|
||||
attr_reader :encodingstyle
|
||||
|
||||
def initialize(elename)
|
||||
@elename = elename
|
||||
@mustunderstand = false
|
||||
@encodingstyle = nil
|
||||
end
|
||||
|
||||
# Should return a SOAP/OM, a SOAPHeaderItem or nil.
|
||||
def on_outbound
|
||||
nil
|
||||
end
|
||||
|
||||
# Given header is a SOAPHeaderItem or nil.
|
||||
def on_inbound(header, mustunderstand = false)
|
||||
# do something.
|
||||
end
|
||||
|
||||
def on_outbound_headeritem
|
||||
item = on_outbound
|
||||
if item.nil?
|
||||
nil
|
||||
elsif item.is_a?(::SOAP::SOAPHeaderItem)
|
||||
item.elename = @elename
|
||||
item
|
||||
else
|
||||
item.elename = @elename
|
||||
::SOAP::SOAPHeaderItem.new(item, @mustunderstand, @encodingstyle)
|
||||
end
|
||||
end
|
||||
|
||||
def on_inbound_headeritem(header)
|
||||
on_inbound(header.element, header.mustunderstand)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
58
lib/soap/header/handlerset.rb
Normal file
58
lib/soap/header/handlerset.rb
Normal file
|
@ -0,0 +1,58 @@
|
|||
# SOAP4R - SOAP Header handler set
|
||||
# Copyright (C) 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'xsd/namedelements'
|
||||
|
||||
|
||||
module SOAP
|
||||
module Header
|
||||
|
||||
|
||||
class HandlerSet
|
||||
def initialize
|
||||
@store = XSD::NamedElements.new
|
||||
end
|
||||
|
||||
def add(handler)
|
||||
@store << handler
|
||||
end
|
||||
alias << add
|
||||
|
||||
def delete(handler)
|
||||
@store.delete(handler)
|
||||
end
|
||||
|
||||
def include?(handler)
|
||||
@store.include?(handler)
|
||||
end
|
||||
|
||||
# returns: Array of SOAPHeaderItem
|
||||
def on_outbound
|
||||
@store.collect { |handler|
|
||||
handler.on_outbound_headeritem
|
||||
}.compact
|
||||
end
|
||||
|
||||
# headers: SOAPHeaderItem enumerable object
|
||||
def on_inbound(headers)
|
||||
headers.each do |name, item|
|
||||
handler = @store.find { |handler|
|
||||
handler.elename == item.element.elename
|
||||
}
|
||||
if handler
|
||||
handler.on_inbound_headeritem(item)
|
||||
elsif item.mustunderstand
|
||||
raise UnhandledMustUnderstandHeaderError.new(item.element.elename.to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
44
lib/soap/header/simplehandler.rb
Normal file
44
lib/soap/header/simplehandler.rb
Normal file
|
@ -0,0 +1,44 @@
|
|||
# SOAP4R - SOAP Simple header item handler
|
||||
# Copyright (C) 2003, 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'soap/header/handler'
|
||||
require 'soap/baseData'
|
||||
|
||||
|
||||
module SOAP
|
||||
module Header
|
||||
|
||||
|
||||
class SimpleHandler < SOAP::Header::Handler
|
||||
def initialize(elename)
|
||||
super(elename)
|
||||
end
|
||||
|
||||
# Should return a Hash or nil.
|
||||
def on_simple_outbound
|
||||
nil
|
||||
end
|
||||
|
||||
# Given header is a Hash or nil.
|
||||
def on_simple_inbound(header, mustunderstand)
|
||||
end
|
||||
|
||||
def on_outbound
|
||||
h = on_simple_outbound
|
||||
h ? SOAPElement.from_obj(h) : nil
|
||||
end
|
||||
|
||||
def on_inbound(header, mustunderstand)
|
||||
h = header.to_obj
|
||||
on_simple_inbound(h, mustunderstand)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
105
lib/soap/rpc/httpserver.rb
Normal file
105
lib/soap/rpc/httpserver.rb
Normal file
|
@ -0,0 +1,105 @@
|
|||
# SOAP4R - WEBrick HTTP Server
|
||||
# Copyright (C) 2003, 2004 by NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'logger'
|
||||
require 'soap/rpc/soaplet'
|
||||
require 'soap/streamHandler'
|
||||
require 'webrick'
|
||||
|
||||
|
||||
module SOAP
|
||||
module RPC
|
||||
|
||||
|
||||
class HTTPServer < Logger::Application
|
||||
attr_reader :server
|
||||
attr_accessor :default_namespace
|
||||
|
||||
def initialize(config)
|
||||
super(config[:SOAPHTTPServerApplicationName] || self.class.name)
|
||||
@default_namespace = config[:SOAPDefaultNamespace]
|
||||
@webrick_config = config.dup
|
||||
@webrick_config[:Logger] ||= @log
|
||||
@server = nil
|
||||
@soaplet = ::SOAP::RPC::SOAPlet.new
|
||||
self.level = Logger::Severity::INFO
|
||||
on_init
|
||||
end
|
||||
|
||||
def on_init
|
||||
# define extra methods in derived class.
|
||||
end
|
||||
|
||||
def status
|
||||
if @server
|
||||
@server.status
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
def shutdown
|
||||
@server.shutdown if @server
|
||||
end
|
||||
|
||||
def mapping_registry
|
||||
@soaplet.app_scope_router.mapping_registry
|
||||
end
|
||||
|
||||
def mapping_registry=(mapping_registry)
|
||||
@soaplet.app_scope_router.mapping_registry = mapping_registry
|
||||
end
|
||||
|
||||
def add_rpc_request_servant(factory, namespace = @default_namespace,
|
||||
mapping_registry = nil)
|
||||
@soaplet.add_rpc_request_servant(factory, namespace, mapping_registry)
|
||||
end
|
||||
|
||||
def add_rpc_servant(obj, namespace = @default_namespace)
|
||||
@soaplet.add_rpc_servant(obj, namespace)
|
||||
end
|
||||
|
||||
def add_rpc_request_headerhandler(factory)
|
||||
@soaplet.add_rpc_request_headerhandler(factory)
|
||||
end
|
||||
|
||||
def add_rpc_headerhandler(obj)
|
||||
@soaplet.add_rpc_headerhandler(obj)
|
||||
end
|
||||
|
||||
def add_method(obj, name, *param)
|
||||
add_method_as(obj, name, name, *param)
|
||||
end
|
||||
|
||||
def add_method_as(obj, name, name_as, *param)
|
||||
qname = XSD::QName.new(@default_namespace, name_as)
|
||||
soapaction = nil
|
||||
method = obj.method(name)
|
||||
param_def = if param.size == 1 and param[0].is_a?(Array)
|
||||
param[0]
|
||||
elsif param.empty?
|
||||
::SOAP::RPC::SOAPMethod.create_param_def(
|
||||
(1..method.arity.abs).collect { |i| "p#{ i }" })
|
||||
else
|
||||
SOAP::RPC::SOAPMethod.create_param_def(param)
|
||||
end
|
||||
@soaplet.app_scope_router.add_method(obj, qname, soapaction, name, param_def)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def run
|
||||
@server = WEBrick::HTTPServer.new(@webrick_config)
|
||||
@server.mount('/', @soaplet)
|
||||
@server.start
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
73
lib/wsdl/soap/cgiStubCreator.rb
Normal file
73
lib/wsdl/soap/cgiStubCreator.rb
Normal file
|
@ -0,0 +1,73 @@
|
|||
# WSDL4R - Creating CGI stub code from WSDL.
|
||||
# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'wsdl/soap/mappingRegistryCreator'
|
||||
require 'wsdl/soap/methodDefCreator'
|
||||
require 'wsdl/soap/classDefCreatorSupport'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SOAP
|
||||
|
||||
|
||||
class CGIStubCreator
|
||||
include ClassDefCreatorSupport
|
||||
|
||||
attr_reader :definitions
|
||||
|
||||
def initialize(definitions)
|
||||
@definitions = definitions
|
||||
end
|
||||
|
||||
def dump(service_name)
|
||||
STDERR.puts "!!! IMPORTANT !!!"
|
||||
STDERR.puts "- CGI stub can only 1 port. Creating stub for the first port... Rests are ignored."
|
||||
STDERR.puts "!!! IMPORTANT !!!"
|
||||
port = @definitions.service(service_name).ports[0]
|
||||
dump_porttype(port.porttype.name)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_porttype(name)
|
||||
class_name = create_class_name(name)
|
||||
methoddef, types = MethodDefCreator.new(@definitions).dump(name)
|
||||
mr_creator = MappingRegistryCreator.new(@definitions)
|
||||
c1 = ::XSD::CodeGen::ClassDef.new(class_name)
|
||||
c1.def_require("soap/rpc/cgistub")
|
||||
c1.def_require("soap/mapping/registry")
|
||||
c1.def_const("MappingRegistry", "::SOAP::Mapping::Registry.new")
|
||||
c1.def_code(mr_creator.dump(types))
|
||||
c1.def_code <<-EOD
|
||||
Methods = [
|
||||
#{ methoddef.gsub(/^/, " ") }
|
||||
]
|
||||
EOD
|
||||
c2 = ::XSD::CodeGen::ClassDef.new(class_name + "App",
|
||||
"::SOAP::RPC::CGIStub")
|
||||
c2.def_method("initialize", "*arg") do
|
||||
<<-EOD
|
||||
super(*arg)
|
||||
servant = #{class_name}.new
|
||||
#{class_name}::Methods.each do |name_as, name, params, soapaction, ns|
|
||||
add_method_with_namespace_as(ns, servant, name, name_as, params, soapaction)
|
||||
end
|
||||
self.mapping_registry = #{class_name}::MappingRegistry
|
||||
self.level = Logger::Severity::ERROR
|
||||
EOD
|
||||
end
|
||||
c1.dump + "\n" + c2.dump + format(<<-EOD)
|
||||
#{class_name}App.new('app', nil).start
|
||||
EOD
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
112
lib/wsdl/soap/classDefCreator.rb
Normal file
112
lib/wsdl/soap/classDefCreator.rb
Normal file
|
@ -0,0 +1,112 @@
|
|||
# WSDL4R - Creating class definition from WSDL
|
||||
# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/data'
|
||||
require 'wsdl/soap/classDefCreatorSupport'
|
||||
require 'xsd/codegen'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SOAP
|
||||
|
||||
|
||||
class ClassDefCreator
|
||||
include ClassDefCreatorSupport
|
||||
|
||||
def initialize(definitions)
|
||||
@simpletypes = definitions.collect_simpletypes
|
||||
@complextypes = definitions.collect_complextypes
|
||||
@faulttypes = definitions.collect_faulttypes
|
||||
end
|
||||
|
||||
def dump(class_name = nil)
|
||||
result = ""
|
||||
if class_name
|
||||
result = dump_classdef(class_name)
|
||||
else
|
||||
@complextypes.each do |type|
|
||||
case type.compoundtype
|
||||
when :TYPE_STRUCT
|
||||
result << dump_classdef(type)
|
||||
when :TYPE_ARRAY
|
||||
result << dump_arraydef(type)
|
||||
else
|
||||
raise RuntimeError.new("Unknown complexContent definition...")
|
||||
end
|
||||
result << "\n"
|
||||
end
|
||||
|
||||
result << @simpletypes.collect { |type|
|
||||
dump_simpletypedef(type)
|
||||
}.join("\n")
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_simpletypedef(simpletype)
|
||||
qname = simpletype.name
|
||||
if simpletype.restriction.enumeration.empty?
|
||||
STDERR.puts("#{qname}: simpleType which is not enum type not supported.")
|
||||
return ""
|
||||
end
|
||||
c = XSD::CodeGen::ModuleDef.new(create_class_name(qname))
|
||||
c.comment = "#{ qname.namespace }"
|
||||
simpletype.restriction.enumeration.each do |value|
|
||||
c.def_const(safeconstname(value), value.dump)
|
||||
end
|
||||
c.dump
|
||||
end
|
||||
|
||||
def dump_classdef(complextype)
|
||||
qname = complextype.name
|
||||
if @faulttypes.index(qname)
|
||||
c = XSD::CodeGen::ClassDef.new(create_class_name(qname),
|
||||
"::StandardError")
|
||||
else
|
||||
c = XSD::CodeGen::ClassDef.new(create_class_name(qname))
|
||||
end
|
||||
c.comment = "#{ qname.namespace }"
|
||||
c.def_classvar("schema_type", qname.name.dump)
|
||||
c.def_classvar("schema_ns", qname.namespace.dump)
|
||||
init_lines = ""
|
||||
params = []
|
||||
complextype.each_element do |element|
|
||||
name = element.name.name
|
||||
varname = safevarname(name)
|
||||
c.def_attr(name, true, varname)
|
||||
init_lines << "@#{ varname } = #{ varname }\n"
|
||||
params << "#{ varname } = nil"
|
||||
end
|
||||
complextype.attributes.each do |attribute|
|
||||
name = "attr_" + attribute.name
|
||||
varname = safevarname(name)
|
||||
c.def_attr(name, true, varname)
|
||||
init_lines << "@#{ varname } = #{ varname }\n"
|
||||
params << "#{ varname } = nil"
|
||||
end
|
||||
c.def_method("initialize", *params) do
|
||||
init_lines
|
||||
end
|
||||
c.dump
|
||||
end
|
||||
|
||||
def dump_arraydef(complextype)
|
||||
qname = complextype.name
|
||||
c = XSD::CodeGen::ClassDef.new(create_class_name(qname), "::Array")
|
||||
c.comment = "#{ qname.namespace }"
|
||||
c.def_classvar("schema_type", qname.name.dump)
|
||||
c.def_classvar("schema_ns", qname.namespace.dump)
|
||||
c.dump
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
106
lib/wsdl/soap/classDefCreatorSupport.rb
Normal file
106
lib/wsdl/soap/classDefCreatorSupport.rb
Normal file
|
@ -0,0 +1,106 @@
|
|||
# WSDL4R - Creating class code support from WSDL.
|
||||
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'soap/mapping'
|
||||
require 'soap/mapping/typeMap'
|
||||
require 'xsd/codegen/gensupport'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SOAP
|
||||
|
||||
|
||||
module ClassDefCreatorSupport
|
||||
include XSD::CodeGen::GenSupport
|
||||
|
||||
def create_class_name(qname)
|
||||
if klass = basetype_mapped_class(qname)
|
||||
::SOAP::Mapping::DefaultRegistry.find_mapped_obj_class(klass.name)
|
||||
else
|
||||
safeconstname(qname.name)
|
||||
end
|
||||
end
|
||||
|
||||
def basetype_mapped_class(name)
|
||||
::SOAP::TypeMap[name]
|
||||
end
|
||||
|
||||
def dump_method_signature(operation)
|
||||
name = operation.name.name
|
||||
input = operation.input
|
||||
output = operation.output
|
||||
fault = operation.fault
|
||||
signature = "#{ name }#{ dump_inputparam(input) }"
|
||||
str = <<__EOD__
|
||||
# SYNOPSIS
|
||||
# #{name}#{dump_inputparam(input)}
|
||||
#
|
||||
# ARGS
|
||||
#{dump_inout_type(input).chomp}
|
||||
#
|
||||
# RETURNS
|
||||
#{dump_inout_type(output).chomp}
|
||||
#
|
||||
__EOD__
|
||||
unless fault.empty?
|
||||
faultstr = (fault.collect { |f| dump_inout_type(f).chomp }).join(', ')
|
||||
str <<<<__EOD__
|
||||
# RAISES
|
||||
# #{faultstr}
|
||||
#
|
||||
__EOD__
|
||||
end
|
||||
str
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_inout_type(param)
|
||||
if param
|
||||
message = param.find_message
|
||||
params = ""
|
||||
message.parts.each do |part|
|
||||
next unless part.type
|
||||
name = safevarname(part.name)
|
||||
typename = safeconstname(part.type.name)
|
||||
params << add_at("# #{name}", "#{typename} - #{part.type}\n", 20)
|
||||
end
|
||||
unless params.empty?
|
||||
return params
|
||||
end
|
||||
end
|
||||
"# N/A\n"
|
||||
end
|
||||
|
||||
def dump_inputparam(input)
|
||||
message = input.find_message
|
||||
params = ""
|
||||
message.parts.each do |part|
|
||||
params << ", " unless params.empty?
|
||||
params << safevarname(part.name)
|
||||
end
|
||||
if params.empty?
|
||||
""
|
||||
else
|
||||
"(#{ params })"
|
||||
end
|
||||
end
|
||||
|
||||
def add_at(base, str, pos)
|
||||
if base.size >= pos
|
||||
base + ' ' + str
|
||||
else
|
||||
base + ' ' * (pos - base.size) + str
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
78
lib/wsdl/soap/clientSkeltonCreator.rb
Normal file
78
lib/wsdl/soap/clientSkeltonCreator.rb
Normal file
|
@ -0,0 +1,78 @@
|
|||
# WSDL4R - Creating client skelton code from WSDL.
|
||||
# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'wsdl/soap/classDefCreatorSupport'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SOAP
|
||||
|
||||
|
||||
class ClientSkeltonCreator
|
||||
include ClassDefCreatorSupport
|
||||
|
||||
attr_reader :definitions
|
||||
|
||||
def initialize(definitions)
|
||||
@definitions = definitions
|
||||
end
|
||||
|
||||
def dump(service_name)
|
||||
result = ""
|
||||
@definitions.service(service_name).ports.each do |port|
|
||||
result << dump_porttype(port.porttype.name)
|
||||
result << "\n"
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_porttype(name)
|
||||
drv_name = create_class_name(name)
|
||||
|
||||
result = ""
|
||||
result << <<__EOD__
|
||||
endpoint_url = ARGV.shift
|
||||
obj = #{ drv_name }.new(endpoint_url)
|
||||
|
||||
# Uncomment the below line to see SOAP wiredumps.
|
||||
# obj.wiredump_dev = STDERR
|
||||
|
||||
__EOD__
|
||||
@definitions.porttype(name).operations.each do |operation|
|
||||
result << dump_method_signature(operation)
|
||||
result << dump_input_init(operation.input) << "\n"
|
||||
result << dump_operation(operation) << "\n\n"
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
def dump_operation(operation)
|
||||
name = operation.name
|
||||
input = operation.input
|
||||
"puts obj.#{ safemethodname(name.name) }#{ dump_inputparam(input) }"
|
||||
end
|
||||
|
||||
def dump_input_init(input)
|
||||
result = input.find_message.parts.collect { |part|
|
||||
"#{ uncapitalize(part.name) }"
|
||||
}.join(" = ")
|
||||
if result.empty?
|
||||
""
|
||||
else
|
||||
result << " = nil"
|
||||
end
|
||||
result
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
84
lib/wsdl/soap/driverCreator.rb
Normal file
84
lib/wsdl/soap/driverCreator.rb
Normal file
|
@ -0,0 +1,84 @@
|
|||
# WSDL4R - Creating driver code from WSDL.
|
||||
# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'wsdl/soap/mappingRegistryCreator'
|
||||
require 'wsdl/soap/methodDefCreator'
|
||||
require 'wsdl/soap/classDefCreatorSupport'
|
||||
require 'xsd/codegen'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SOAP
|
||||
|
||||
|
||||
class DriverCreator
|
||||
include ClassDefCreatorSupport
|
||||
|
||||
attr_reader :definitions
|
||||
|
||||
def initialize(definitions)
|
||||
@definitions = definitions
|
||||
end
|
||||
|
||||
def dump(porttype = nil)
|
||||
if porttype.nil?
|
||||
result = ""
|
||||
@definitions.porttypes.each do |type|
|
||||
result << dump_porttype(type.name)
|
||||
result << "\n"
|
||||
end
|
||||
else
|
||||
result = dump_porttype(porttype)
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_porttype(name)
|
||||
class_name = create_class_name(name)
|
||||
methoddef, types = MethodDefCreator.new(@definitions).dump(name)
|
||||
mr_creator = MappingRegistryCreator.new(@definitions)
|
||||
binding = @definitions.bindings.find { |item| item.type == name }
|
||||
addresses = @definitions.porttype(name).locations
|
||||
|
||||
c = ::XSD::CodeGen::ClassDef.new(class_name, "::SOAP::RPC::Driver")
|
||||
c.def_require("soap/rpc/driver")
|
||||
c.def_const("MappingRegistry", "::SOAP::Mapping::Registry.new")
|
||||
c.def_const("DefaultEndpointUrl", addresses[0].dump)
|
||||
c.def_code(mr_creator.dump(types))
|
||||
c.def_code <<-EOD
|
||||
Methods = [
|
||||
#{ methoddef.gsub(/^/, " ") }
|
||||
]
|
||||
EOD
|
||||
c.def_method("initialize", "endpoint_url = nil") do
|
||||
<<-EOD
|
||||
endpoint_url ||= DefaultEndpointUrl
|
||||
super(endpoint_url, nil)
|
||||
self.mapping_registry = MappingRegistry
|
||||
init_methods
|
||||
EOD
|
||||
end
|
||||
c.def_privatemethod("init_methods") do
|
||||
<<-EOD
|
||||
Methods.each do |name_as, name, params, soapaction, namespace|
|
||||
qname = ::XSD::QName.new(namespace, name_as)
|
||||
@proxy.add_method(qname, soapaction, name, params)
|
||||
add_rpc_method_interface(name, params)
|
||||
end
|
||||
EOD
|
||||
end
|
||||
c.dump
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
90
lib/wsdl/soap/mappingRegistryCreator.rb
Normal file
90
lib/wsdl/soap/mappingRegistryCreator.rb
Normal file
|
@ -0,0 +1,90 @@
|
|||
# WSDL4R - Creating MappingRegistry code from WSDL.
|
||||
# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'wsdl/soap/classDefCreatorSupport'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SOAP
|
||||
|
||||
|
||||
class MappingRegistryCreator
|
||||
include ClassDefCreatorSupport
|
||||
|
||||
attr_reader :definitions
|
||||
|
||||
def initialize(definitions)
|
||||
@definitions = definitions
|
||||
@complextypes = @definitions.collect_complextypes
|
||||
@types = nil
|
||||
end
|
||||
|
||||
def dump(types)
|
||||
@types = types
|
||||
map_cache = []
|
||||
map = ""
|
||||
@types.each do |type|
|
||||
if map_cache.index(type).nil?
|
||||
map_cache << type
|
||||
if type.namespace != XSD::Namespace
|
||||
if typemap = dump_typemap(type)
|
||||
map << typemap
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return map
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_typemap(type)
|
||||
if definedtype = @complextypes[type]
|
||||
case definedtype.compoundtype
|
||||
when :TYPE_STRUCT
|
||||
dump_struct_typemap(definedtype)
|
||||
when :TYPE_ARRAY
|
||||
dump_array_typemap(definedtype)
|
||||
else
|
||||
raise NotImplementedError.new("Must not reach here.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def dump_struct_typemap(definedtype)
|
||||
ele = definedtype.name
|
||||
return <<__EOD__
|
||||
MappingRegistry.set(
|
||||
#{ create_class_name(ele) },
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => ::XSD::QName.new("#{ ele.namespace }", "#{ ele.name }") }
|
||||
)
|
||||
__EOD__
|
||||
end
|
||||
|
||||
def dump_array_typemap(definedtype)
|
||||
ele = definedtype.name
|
||||
arytype = definedtype.find_arytype || XSD::AnyTypeName
|
||||
type = XSD::QName.new(arytype.namespace, arytype.name.sub(/\[(?:,)*\]$/, ''))
|
||||
@types << type
|
||||
return <<__EOD__
|
||||
MappingRegistry.set(
|
||||
#{ create_class_name(ele) },
|
||||
::SOAP::SOAPArray,
|
||||
::SOAP::Mapping::Registry::TypedArrayFactory,
|
||||
{ :type => ::XSD::QName.new("#{ type.namespace }", "#{ type.name }") }
|
||||
)
|
||||
__EOD__
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
148
lib/wsdl/soap/methodDefCreator.rb
Normal file
148
lib/wsdl/soap/methodDefCreator.rb
Normal file
|
@ -0,0 +1,148 @@
|
|||
# WSDL4R - Creating driver code from WSDL.
|
||||
# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'wsdl/soap/classDefCreatorSupport'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SOAP
|
||||
|
||||
|
||||
class MethodDefCreator
|
||||
include ClassDefCreatorSupport
|
||||
|
||||
attr_reader :definitions
|
||||
|
||||
def initialize(definitions)
|
||||
@definitions = definitions
|
||||
@simpletypes = @definitions.collect_simpletypes
|
||||
@complextypes = @definitions.collect_complextypes
|
||||
@elements = @definitions.collect_elements
|
||||
@types = nil
|
||||
end
|
||||
|
||||
def dump(porttype)
|
||||
@types = []
|
||||
result = ""
|
||||
operations = @definitions.porttype(porttype).operations
|
||||
binding = @definitions.porttype_binding(porttype)
|
||||
operations.each do |operation|
|
||||
op_bind = binding.operations[operation.name]
|
||||
result << ",\n" unless result.empty?
|
||||
result << dump_method(operation, op_bind).chomp
|
||||
end
|
||||
return result, @types
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_method(operation, binding)
|
||||
name = safemethodname(operation.name.name)
|
||||
name_as = operation.name.name
|
||||
params = collect_parameter(operation)
|
||||
soapaction = binding.soapoperation.soapaction
|
||||
namespace = binding.input.soapbody.namespace
|
||||
paramstr = param2str(params)
|
||||
if paramstr.empty?
|
||||
paramstr = '[]'
|
||||
else
|
||||
paramstr = "[\n" << paramstr.gsub(/^/, ' ') << "\n ]"
|
||||
end
|
||||
return <<__EOD__
|
||||
[#{ dq(name_as) }, #{ dq(name) },
|
||||
#{ paramstr },
|
||||
#{ soapaction ? dq(soapaction) : "nil" }, #{ dq(namespace) }
|
||||
]
|
||||
__EOD__
|
||||
end
|
||||
|
||||
def collect_parameter(operation)
|
||||
result = operation.inputparts.collect { |part|
|
||||
collect_type(part.type)
|
||||
param_set('in', definedtype(part), part.name)
|
||||
}
|
||||
outparts = operation.outputparts
|
||||
if outparts.size > 0
|
||||
retval = outparts[0]
|
||||
collect_type(retval.type)
|
||||
result << param_set('retval', definedtype(retval), retval.name)
|
||||
cdr(outparts).each { |part|
|
||||
collect_type(part.type)
|
||||
result << param_set('out', definedtype(part), part.name)
|
||||
}
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
def definedtype(part)
|
||||
if mapped = basetype_mapped_class(part.type)
|
||||
['::' + mapped.name]
|
||||
elsif definedelement = @elements[part.element]
|
||||
raise RuntimeError.new("Part: #{part.name} should be typed for RPC service for now.")
|
||||
elsif definedtype = @simpletypes[part.type]
|
||||
['::' + basetype_mapped_class(definedtype.base).name]
|
||||
elsif definedtype = @complextypes[part.type]
|
||||
case definedtype.compoundtype
|
||||
when :TYPE_STRUCT
|
||||
['::SOAP::SOAPStruct', part.type.namespace, part.type.name]
|
||||
when :TYPE_ARRAY
|
||||
arytype = definedtype.find_arytype || XSD::AnyTypeName
|
||||
ns = arytype.namespace
|
||||
name = arytype.name.sub(/\[(?:,)*\]$/, '')
|
||||
['::SOAP::SOAPArray', ns, name]
|
||||
else
|
||||
raise NotImplementedError.new("Must not reach here.")
|
||||
end
|
||||
else
|
||||
raise RuntimeError.new("Part: #{part.name} cannot be resolved.")
|
||||
end
|
||||
end
|
||||
|
||||
def param_set(io_type, type, name)
|
||||
[io_type, type, name]
|
||||
end
|
||||
|
||||
def collect_type(type)
|
||||
# ignore inline type definition.
|
||||
return if type.nil?
|
||||
@types << type
|
||||
return unless @complextypes[type]
|
||||
@complextypes[type].each_element do |element|
|
||||
collect_type(element.type)
|
||||
end
|
||||
end
|
||||
|
||||
def param2str(params)
|
||||
params.collect { |param|
|
||||
"[#{ dq(param[0]) }, #{ dq(param[2]) }, #{ type2str(param[1]) }]"
|
||||
}.join(",\n")
|
||||
end
|
||||
|
||||
def type2str(type)
|
||||
if type.size == 1
|
||||
"[#{ type[0] }]"
|
||||
else
|
||||
"[#{ type[0] }, #{ dq(type[1]) }, #{ dq(type[2]) }]"
|
||||
end
|
||||
end
|
||||
|
||||
def dq(ele)
|
||||
"\"" << ele << "\""
|
||||
end
|
||||
|
||||
def cdr(ary)
|
||||
result = ary.dup
|
||||
result.shift
|
||||
result
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
65
lib/wsdl/soap/servantSkeltonCreator.rb
Normal file
65
lib/wsdl/soap/servantSkeltonCreator.rb
Normal file
|
@ -0,0 +1,65 @@
|
|||
# WSDL4R - Creating servant skelton code from WSDL.
|
||||
# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'wsdl/soap/classDefCreatorSupport'
|
||||
require 'xsd/codegen'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SOAP
|
||||
|
||||
|
||||
class ServantSkeltonCreator
|
||||
include ClassDefCreatorSupport
|
||||
include ::XSD::CodeGen::GenSupport
|
||||
|
||||
attr_reader :definitions
|
||||
|
||||
def initialize(definitions)
|
||||
@definitions = definitions
|
||||
end
|
||||
|
||||
def dump(porttype = nil)
|
||||
if porttype.nil?
|
||||
result = ""
|
||||
@definitions.porttypes.each do |type|
|
||||
result << dump_porttype(type.name)
|
||||
result << "\n"
|
||||
end
|
||||
else
|
||||
result = dump_porttype(porttype)
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_porttype(name)
|
||||
class_name = create_class_name(name)
|
||||
c = ::XSD::CodeGen::ClassDef.new(class_name)
|
||||
operations = @definitions.porttype(name).operations
|
||||
operations.each do |operation|
|
||||
name = operation.name.name
|
||||
input = operation.input
|
||||
m = ::XSD::CodeGen::MethodDef.new(name,
|
||||
input.find_message.parts.collect { |part| safevarname(part.name) }) do
|
||||
<<-EOD
|
||||
raise NotImplementedError.new
|
||||
EOD
|
||||
end
|
||||
m.comment = dump_method_signature(operation)
|
||||
c.add_method(m)
|
||||
end
|
||||
c.dump
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
79
lib/wsdl/soap/standaloneServerStubCreator.rb
Normal file
79
lib/wsdl/soap/standaloneServerStubCreator.rb
Normal file
|
@ -0,0 +1,79 @@
|
|||
# WSDL4R - Creating standalone server stub code from WSDL.
|
||||
# Copyright (C) 2002, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'wsdl/soap/mappingRegistryCreator'
|
||||
require 'wsdl/soap/methodDefCreator'
|
||||
require 'wsdl/soap/classDefCreatorSupport'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SOAP
|
||||
|
||||
|
||||
class StandaloneServerStubCreator
|
||||
include ClassDefCreatorSupport
|
||||
|
||||
attr_reader :definitions
|
||||
|
||||
def initialize(definitions)
|
||||
@definitions = definitions
|
||||
end
|
||||
|
||||
def dump(service_name)
|
||||
STDERR.puts "!!! IMPORTANT !!!"
|
||||
STDERR.puts "- Standalone stub can have only 1 port for now. So creating stub for the first port and rests are ignored."
|
||||
STDERR.puts "- Standalone server stub ignores port location defined in WSDL. Location is http://localhost:10080/ by default. Generated client from WSDL must be configured to point this endpoint by hand."
|
||||
STDERR.puts "!!! IMPORTANT !!!"
|
||||
port = @definitions.service(service_name).ports[0]
|
||||
dump_porttype(port.porttype.name)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_porttype(name)
|
||||
class_name = create_class_name(name)
|
||||
methoddef, types = MethodDefCreator.new(@definitions).dump(name)
|
||||
mr_creator = MappingRegistryCreator.new(@definitions)
|
||||
|
||||
c1 = ::XSD::CodeGen::ClassDef.new(class_name)
|
||||
c1.def_require("soap/rpc/standaloneServer")
|
||||
c1.def_require("soap/mapping/registry")
|
||||
c1.def_const("MappingRegistry", "::SOAP::Mapping::Registry.new")
|
||||
c1.def_code(mr_creator.dump(types))
|
||||
c1.def_code <<-EOD
|
||||
Methods = [
|
||||
#{ methoddef.gsub(/^/, " ") }
|
||||
]
|
||||
EOD
|
||||
c2 = ::XSD::CodeGen::ClassDef.new(class_name + "App",
|
||||
"::SOAP::RPC::StandaloneServer")
|
||||
c2.def_method("initialize", "*arg") do
|
||||
<<-EOD
|
||||
super(*arg)
|
||||
servant = #{class_name}.new
|
||||
#{class_name}::Methods.each do |name_as, name, params, soapaction, ns|
|
||||
qname = XSD::QName.new(ns, name_as)
|
||||
@soaplet.app_scope_router.add_method(servant, qname, soapaction, name, params)
|
||||
end
|
||||
self.mapping_registry = #{class_name}::MappingRegistry
|
||||
EOD
|
||||
end
|
||||
c1.dump + "\n" + c2.dump + format(<<-EOD)
|
||||
|
||||
if $0 == __FILE__
|
||||
# Change listen port.
|
||||
#{class_name}App.new('app', nil, '0.0.0.0', 10080).start
|
||||
end
|
||||
EOD
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
36
lib/wsdl/xmlSchema/enumeration.rb
Normal file
36
lib/wsdl/xmlSchema/enumeration.rb
Normal file
|
@ -0,0 +1,36 @@
|
|||
# WSDL4R - XMLSchema enumeration definition for WSDL.
|
||||
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
|
||||
|
||||
module WSDL
|
||||
module XMLSchema
|
||||
|
||||
|
||||
class Enumeration < Info
|
||||
def initialize
|
||||
super
|
||||
end
|
||||
|
||||
def parse_element(element)
|
||||
nil
|
||||
end
|
||||
|
||||
def parse_attr(attr, value)
|
||||
case attr
|
||||
when ValueAttrName
|
||||
parent.enumeration << value
|
||||
value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
48
lib/wsdl/xmlSchema/simpleRestriction.rb
Normal file
48
lib/wsdl/xmlSchema/simpleRestriction.rb
Normal file
|
@ -0,0 +1,48 @@
|
|||
# WSDL4R - XMLSchema simpleType definition for WSDL.
|
||||
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'xsd/namedelements'
|
||||
|
||||
|
||||
module WSDL
|
||||
module XMLSchema
|
||||
|
||||
|
||||
class SimpleRestriction < Info
|
||||
attr_reader :base
|
||||
attr_reader :enumeration
|
||||
|
||||
def initialize
|
||||
super
|
||||
@base = nil
|
||||
@enumeration = [] # NamedElements?
|
||||
end
|
||||
|
||||
def valid?(value)
|
||||
@enumeration.include?(value)
|
||||
end
|
||||
|
||||
def parse_element(element)
|
||||
case element
|
||||
when EnumerationName
|
||||
Enumeration.new # just a parsing handler
|
||||
end
|
||||
end
|
||||
|
||||
def parse_attr(attr, value)
|
||||
case attr
|
||||
when BaseAttrName
|
||||
@base = value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
81
lib/wsdl/xmlSchema/simpleType.rb
Normal file
81
lib/wsdl/xmlSchema/simpleType.rb
Normal file
|
@ -0,0 +1,81 @@
|
|||
# WSDL4R - XMLSchema simpleType definition for WSDL.
|
||||
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'wsdl/info'
|
||||
require 'xsd/namedelements'
|
||||
|
||||
|
||||
module WSDL
|
||||
module XMLSchema
|
||||
|
||||
|
||||
class SimpleType < Info
|
||||
attr_accessor :name
|
||||
attr_reader :derivetype
|
||||
attr_reader :restriction
|
||||
|
||||
def check_lexical_format(value)
|
||||
if @restriction
|
||||
check_restriction(value)
|
||||
elsif @extension
|
||||
raise NotImplementedError
|
||||
# ToDo
|
||||
else
|
||||
raise ArgumentError.new("incomplete simpleType")
|
||||
end
|
||||
end
|
||||
|
||||
def base
|
||||
if @restriction
|
||||
@restriction.base
|
||||
elsif @extension
|
||||
@extension.base
|
||||
else
|
||||
raise ArgumentError.new("incomplete simpleType")
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(name = nil)
|
||||
super()
|
||||
@name = name
|
||||
@derivetype = nil
|
||||
@restriction = nil
|
||||
end
|
||||
|
||||
def targetnamespace
|
||||
parent.targetnamespace
|
||||
end
|
||||
|
||||
def parse_element(element)
|
||||
case element
|
||||
when RestrictionName
|
||||
@restriction = SimpleRestriction.new
|
||||
@derivetype = element.name
|
||||
@restriction
|
||||
end
|
||||
end
|
||||
|
||||
def parse_attr(attr, value)
|
||||
case attr
|
||||
when NameAttrName
|
||||
@name = XSD::QName.new(targetnamespace, value)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def check_restriction(value)
|
||||
unless @restriction.valid?(value)
|
||||
raise ::XSD::ValueSpaceError.new("#{@name}: cannot accept '#{value}'.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
12
lib/xsd/codegen.rb
Normal file
12
lib/xsd/codegen.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
# XSD4R - Generating code library
|
||||
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'xsd/codegen/gensupport'
|
||||
require 'xsd/codegen/moduledef'
|
||||
require 'xsd/codegen/classdef'
|
||||
require 'xsd/codegen/methoddef'
|
203
lib/xsd/codegen/classdef.rb
Normal file
203
lib/xsd/codegen/classdef.rb
Normal file
|
@ -0,0 +1,203 @@
|
|||
# XSD4R - Generating class definition code
|
||||
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'xsd/codegen/gensupport'
|
||||
require 'xsd/codegen/moduledef'
|
||||
require 'xsd/codegen/methoddef'
|
||||
|
||||
|
||||
module XSD
|
||||
module CodeGen
|
||||
|
||||
|
||||
class ClassDef < ModuleDef
|
||||
include GenSupport
|
||||
|
||||
def initialize(name, baseclass = nil)
|
||||
super(name)
|
||||
@baseclass = baseclass
|
||||
@classvar = []
|
||||
@attrdef = []
|
||||
end
|
||||
|
||||
def def_classvar(var, value)
|
||||
var = var.sub(/\A@@/, "")
|
||||
unless safevarname?(var)
|
||||
raise ArgumentError.new("#{var} seems to be unsafe")
|
||||
end
|
||||
@classvar << [var, value]
|
||||
end
|
||||
|
||||
def def_attr(attrname, writable = true, varname = nil)
|
||||
unless safevarname?(varname || attrname)
|
||||
raise ArgumentError.new("#{varname || attrname} seems to be unsafe")
|
||||
end
|
||||
@attrdef << [attrname, writable, varname]
|
||||
end
|
||||
|
||||
def dump
|
||||
buf = ""
|
||||
unless @requirepath.empty?
|
||||
buf << dump_requirepath
|
||||
end
|
||||
buf << dump_emptyline unless buf.empty?
|
||||
package = @name.split(/::/)[0..-2]
|
||||
buf << dump_package_def(package) unless package.empty?
|
||||
buf << dump_comment if @comment
|
||||
buf << dump_class_def
|
||||
spacer = false
|
||||
unless @classvar.empty?
|
||||
spacer = true
|
||||
buf << dump_classvar
|
||||
end
|
||||
unless @const.empty?
|
||||
buf << dump_emptyline if spacer
|
||||
spacer = true
|
||||
buf << dump_const
|
||||
end
|
||||
unless @code.empty?
|
||||
buf << dump_emptyline if spacer
|
||||
spacer = true
|
||||
buf << dump_code
|
||||
end
|
||||
unless @attrdef.empty?
|
||||
buf << dump_emptyline if spacer
|
||||
spacer = true
|
||||
buf << dump_attributes
|
||||
end
|
||||
unless @methoddef.empty?
|
||||
buf << dump_emptyline if spacer
|
||||
spacer = true
|
||||
buf << dump_methods
|
||||
end
|
||||
buf << dump_class_def_end
|
||||
buf << dump_package_def_end(package) unless package.empty?
|
||||
buf
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_class_def
|
||||
name = @name.to_s.split(/::/)
|
||||
if @baseclass
|
||||
format("class #{name.last} < #{@baseclass}")
|
||||
else
|
||||
format("class #{name.last}")
|
||||
end
|
||||
end
|
||||
|
||||
def dump_class_def_end
|
||||
str = format("end")
|
||||
end
|
||||
|
||||
def dump_classvar
|
||||
dump_static(
|
||||
@classvar.collect { |var, value|
|
||||
%Q(@@#{var.sub(/^@@/, "")} = #{dump_value(value)})
|
||||
}.join("\n")
|
||||
)
|
||||
end
|
||||
|
||||
def dump_attributes
|
||||
str = ""
|
||||
@attrdef.each do |attrname, writable, varname|
|
||||
varname ||= attrname
|
||||
if attrname == varname
|
||||
str << format(dump_accessor(attrname, writable), 2)
|
||||
end
|
||||
end
|
||||
@attrdef.each do |attrname, writable, varname|
|
||||
varname ||= attrname
|
||||
if attrname != varname
|
||||
str << "\n" unless str.empty?
|
||||
str << format(dump_attribute(attrname, writable, varname), 2)
|
||||
end
|
||||
end
|
||||
str
|
||||
end
|
||||
|
||||
def dump_accessor(attrname, writable)
|
||||
if writable
|
||||
"attr_accessor :#{attrname}"
|
||||
else
|
||||
"attr_reader :#{attrname}"
|
||||
end
|
||||
end
|
||||
|
||||
def dump_attribute(attrname, writable, varname)
|
||||
str = nil
|
||||
mr = MethodDef.new(attrname)
|
||||
mr.definition = "@#{varname}"
|
||||
str = mr.dump
|
||||
if writable
|
||||
mw = MethodDef.new(attrname + "=", 'value')
|
||||
mw.definition = "@#{varname} = value"
|
||||
str << "\n" + mw.dump
|
||||
end
|
||||
str
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if __FILE__ == $0
|
||||
require 'xsd/codegen/classdef'
|
||||
include XSD::CodeGen
|
||||
c = ClassDef.new("Foo::Bar::HobbitName", String)
|
||||
c.def_require("foo/bar")
|
||||
c.comment = <<-EOD
|
||||
foo
|
||||
bar
|
||||
baz
|
||||
EOD
|
||||
c.def_const("FOO", 1)
|
||||
c.def_classvar("@@foo", "var".dump)
|
||||
c.def_classvar("baz", "1".dump)
|
||||
c.def_attr("Foo", true, "foo")
|
||||
c.def_attr("bar")
|
||||
c.def_attr("baz", true)
|
||||
c.def_attr("Foo2", true, "foo2")
|
||||
c.def_attr("foo3", false, "foo3")
|
||||
c.def_method("foo") do
|
||||
<<-EOD
|
||||
foo.bar = 1
|
||||
\tbaz.each do |ele|
|
||||
\t ele
|
||||
end
|
||||
EOD
|
||||
end
|
||||
c.def_method("baz", "qux") do
|
||||
<<-EOD
|
||||
[1, 2, 3].each do |i|
|
||||
p i
|
||||
end
|
||||
EOD
|
||||
end
|
||||
|
||||
m = MethodDef.new("qux", "quxx", "quxxx") do
|
||||
<<-EOD
|
||||
p quxx + quxxx
|
||||
EOD
|
||||
end
|
||||
m.comment = "hello world\n123"
|
||||
c.add_method(m)
|
||||
c.def_code <<-EOD
|
||||
Foo.new
|
||||
Bar.z
|
||||
EOD
|
||||
c.def_code <<-EOD
|
||||
Foo.new
|
||||
Bar.z
|
||||
EOD
|
||||
c.def_privatemethod("foo", "baz", "*arg", "&block")
|
||||
|
||||
puts c.dump
|
||||
end
|
34
lib/xsd/codegen/commentdef.rb
Normal file
34
lib/xsd/codegen/commentdef.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
# XSD4R - Generating comment definition code
|
||||
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'xsd/codegen/gensupport'
|
||||
|
||||
|
||||
module XSD
|
||||
module CodeGen
|
||||
|
||||
|
||||
module CommentDef
|
||||
include GenSupport
|
||||
|
||||
attr_accessor :comment
|
||||
|
||||
private
|
||||
|
||||
def dump_comment
|
||||
if /^#/ =~ @comment
|
||||
format(@comment)
|
||||
else
|
||||
format(@comment).gsub(/^/, "# ")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
112
lib/xsd/codegen/gensupport.rb
Normal file
112
lib/xsd/codegen/gensupport.rb
Normal file
|
@ -0,0 +1,112 @@
|
|||
# XSD4R - Code generation support
|
||||
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
module XSD
|
||||
module CodeGen
|
||||
|
||||
|
||||
module GenSupport
|
||||
def capitalize(target)
|
||||
target.sub(/^([a-z])/) { $1.tr!('[a-z]', '[A-Z]') }
|
||||
end
|
||||
module_function :capitalize
|
||||
|
||||
def uncapitalize(target)
|
||||
target.sub(/^([A-Z])/) { $1.tr!('[A-Z]', '[a-z]') }
|
||||
end
|
||||
module_function :uncapitalize
|
||||
|
||||
def safeconstname(name)
|
||||
safename = name.scan(/[a-zA-Z0-9_]+/).collect { |ele|
|
||||
GenSupport.capitalize(ele)
|
||||
}.join
|
||||
unless /^[A-Z]/ =~ safename
|
||||
safename = "C_#{safename}"
|
||||
end
|
||||
safename
|
||||
end
|
||||
module_function :safeconstname
|
||||
|
||||
def safeconstname?(name)
|
||||
/\A[A-Z][a-zA-Z0-9_]*\z/ =~ name
|
||||
end
|
||||
module_function :safeconstname?
|
||||
|
||||
def safemethodname(name)
|
||||
safevarname(name)
|
||||
end
|
||||
module_function :safemethodname
|
||||
|
||||
def safemethodname?(name)
|
||||
/\A[a-zA-Z_][a-zA-Z0-9_]*[=!?]?\z/ =~ name
|
||||
end
|
||||
module_function :safemethodname?
|
||||
|
||||
def safevarname(name)
|
||||
safename = name.scan(/[a-zA-Z0-9_]+/).join('_')
|
||||
safename = uncapitalize(safename)
|
||||
unless /^[a-z]/ =~ safename
|
||||
safename = "m_#{safename}"
|
||||
end
|
||||
safename
|
||||
end
|
||||
module_function :safevarname
|
||||
|
||||
def safevarname?(name)
|
||||
/\A[a-z_][a-zA-Z0-9_]*\z/ =~ name
|
||||
end
|
||||
module_function :safevarname?
|
||||
|
||||
def format(str, indent = nil)
|
||||
str = trim_eol(str)
|
||||
str = trim_indent(str)
|
||||
if indent
|
||||
str.gsub(/^/, " " * indent)
|
||||
else
|
||||
str
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def trim_eol(str)
|
||||
str.collect { |line|
|
||||
line.sub(/\r?\n$/, "") + "\n"
|
||||
}.join
|
||||
end
|
||||
|
||||
def trim_indent(str)
|
||||
indent = nil
|
||||
str = str.collect { |line| untab(line) }.join
|
||||
str.each do |line|
|
||||
head = line.index(/\S/)
|
||||
if !head.nil? and (indent.nil? or head < indent)
|
||||
indent = head
|
||||
end
|
||||
end
|
||||
return str unless indent
|
||||
str.collect { |line|
|
||||
line.sub(/^ {0,#{indent}}/, "")
|
||||
}.join
|
||||
end
|
||||
|
||||
def untab(line, ts = 8)
|
||||
while pos = line.index(/\t/)
|
||||
line = line.sub(/\t/, " " * (ts - (pos % ts)))
|
||||
end
|
||||
line
|
||||
end
|
||||
|
||||
def dump_emptyline
|
||||
"\n"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
63
lib/xsd/codegen/methoddef.rb
Normal file
63
lib/xsd/codegen/methoddef.rb
Normal file
|
@ -0,0 +1,63 @@
|
|||
# XSD4R - Generating method definition code
|
||||
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'xsd/codegen/gensupport'
|
||||
require 'xsd/codegen/commentdef'
|
||||
|
||||
|
||||
module XSD
|
||||
module CodeGen
|
||||
|
||||
|
||||
class MethodDef
|
||||
include GenSupport
|
||||
include CommentDef
|
||||
|
||||
attr_accessor :definition
|
||||
|
||||
def initialize(name, *params)
|
||||
unless safemethodname?(name)
|
||||
raise ArgumentError.new("#{name} seems to be unsafe")
|
||||
end
|
||||
@name = name
|
||||
@params = params
|
||||
@comment = nil
|
||||
@definition = yield if block_given?
|
||||
end
|
||||
|
||||
def dump
|
||||
buf = ""
|
||||
buf << dump_comment if @comment
|
||||
buf << dump_method_def
|
||||
buf << dump_definition if @definition
|
||||
buf << dump_method_def_end
|
||||
buf
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_method_def
|
||||
if @params.empty?
|
||||
format("def #{@name}")
|
||||
else
|
||||
format("def #{@name}(#{@params.join(", ")})")
|
||||
end
|
||||
end
|
||||
|
||||
def dump_method_def_end
|
||||
format("end")
|
||||
end
|
||||
|
||||
def dump_definition
|
||||
format(@definition, 2)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
191
lib/xsd/codegen/moduledef.rb
Normal file
191
lib/xsd/codegen/moduledef.rb
Normal file
|
@ -0,0 +1,191 @@
|
|||
# XSD4R - Generating module definition code
|
||||
# Copyright (C) 2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
|
||||
|
||||
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
|
||||
# redistribute it and/or modify it under the same terms of Ruby's license;
|
||||
# either the dual license version in 2003, or any later version.
|
||||
|
||||
|
||||
require 'xsd/codegen/gensupport'
|
||||
require 'xsd/codegen/methoddef'
|
||||
require 'xsd/codegen/commentdef'
|
||||
|
||||
|
||||
module XSD
|
||||
module CodeGen
|
||||
|
||||
|
||||
class ModuleDef
|
||||
include GenSupport
|
||||
include CommentDef
|
||||
|
||||
def initialize(name)
|
||||
@name = name
|
||||
@comment = nil
|
||||
@const = []
|
||||
@code = []
|
||||
@requirepath = []
|
||||
@methoddef = []
|
||||
end
|
||||
|
||||
def def_require(path)
|
||||
@requirepath << path
|
||||
end
|
||||
|
||||
def def_const(const, value)
|
||||
unless safeconstname?(const)
|
||||
raise ArgumentError.new("#{const} seems to be unsafe")
|
||||
end
|
||||
@const << [const, value]
|
||||
end
|
||||
|
||||
def def_code(code)
|
||||
@code << code
|
||||
end
|
||||
|
||||
def def_method(name, *params)
|
||||
add_method(MethodDef.new(name, *params) { yield if block_given? }, :public)
|
||||
end
|
||||
alias def_publicmethod def_method
|
||||
|
||||
def def_protectedmethod(name, *params)
|
||||
add_method(MethodDef.new(name, *params) { yield if block_given? },
|
||||
:protected)
|
||||
end
|
||||
|
||||
def def_privatemethod(name, *params)
|
||||
add_method(MethodDef.new(name, *params) { yield if block_given? }, :private)
|
||||
end
|
||||
|
||||
def add_method(m, visibility = :public)
|
||||
@methoddef << [visibility, m]
|
||||
end
|
||||
|
||||
def dump
|
||||
buf = ""
|
||||
unless @requirepath.empty?
|
||||
buf << dump_requirepath
|
||||
end
|
||||
buf << dump_emptyline unless buf.empty?
|
||||
package = @name.split(/::/)[0..-2]
|
||||
buf << dump_package_def(package) unless package.empty?
|
||||
buf << dump_comment if @comment
|
||||
buf << dump_module_def
|
||||
spacer = false
|
||||
unless @const.empty?
|
||||
buf << dump_emptyline if spacer
|
||||
spacer = true
|
||||
buf << dump_const
|
||||
end
|
||||
unless @code.empty?
|
||||
buf << dump_emptyline if spacer
|
||||
spacer = true
|
||||
buf << dump_code
|
||||
end
|
||||
unless @methoddef.empty?
|
||||
buf << dump_emptyline if spacer
|
||||
spacer = true
|
||||
buf << dump_methods
|
||||
end
|
||||
buf << dump_module_def_end
|
||||
buf << dump_package_def_end(package) unless package.empty?
|
||||
buf
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dump_requirepath
|
||||
format(
|
||||
@requirepath.collect { |path|
|
||||
%Q(require '#{path}')
|
||||
}.join("\n")
|
||||
)
|
||||
end
|
||||
|
||||
def dump_const
|
||||
dump_static(
|
||||
@const.sort.collect { |var, value|
|
||||
%Q(#{var} = #{dump_value(value)})
|
||||
}.join("\n")
|
||||
)
|
||||
end
|
||||
|
||||
def dump_code
|
||||
dump_static(@code.join("\n"))
|
||||
end
|
||||
|
||||
def dump_static(str)
|
||||
format(str, 2)
|
||||
end
|
||||
|
||||
def dump_methods
|
||||
methods = {}
|
||||
@methoddef.each do |visibility, method|
|
||||
(methods[visibility] ||= []) << method
|
||||
end
|
||||
str = ""
|
||||
[:public, :protected, :private].each do |visibility|
|
||||
if methods[visibility]
|
||||
str << "\n" unless str.empty?
|
||||
str << visibility.to_s << "\n\n" unless visibility == :public
|
||||
str << methods[visibility].collect { |m| format(m.dump, 2) }.join("\n")
|
||||
end
|
||||
end
|
||||
str
|
||||
end
|
||||
|
||||
def dump_value(value)
|
||||
if value.respond_to?(:to_src)
|
||||
value.to_src
|
||||
else
|
||||
value
|
||||
end
|
||||
end
|
||||
|
||||
def dump_package_def(package)
|
||||
format(package.collect { |ele| "module #{ele}" }.join("; ")) + "\n\n"
|
||||
end
|
||||
|
||||
def dump_package_def_end(package)
|
||||
"\n\n" + format(package.collect { |ele| "end" }.join("; "))
|
||||
end
|
||||
|
||||
def dump_module_def
|
||||
name = @name.to_s.split(/::/)
|
||||
format("module #{name.last}")
|
||||
end
|
||||
|
||||
def dump_module_def_end
|
||||
format("end")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if __FILE__ == $0
|
||||
require 'xsd/codegen/moduledef'
|
||||
include XSD::CodeGen
|
||||
m = ModuleDef.new("Foo::Bar::HobbitName")
|
||||
m.def_require("foo/bar")
|
||||
m.def_require("baz")
|
||||
m.comment = <<-EOD
|
||||
foo
|
||||
bar
|
||||
baz
|
||||
EOD
|
||||
m.def_method("foo") do
|
||||
<<-EOD
|
||||
foo.bar = 1
|
||||
baz.each do |ele|
|
||||
ele + 1
|
||||
end
|
||||
EOD
|
||||
end
|
||||
m.def_method("baz", "qux")
|
||||
#m.def_protectedmethod("aaa")
|
||||
m.def_privatemethod("bbb")
|
||||
puts m.dump
|
||||
end
|
41
sample/soap/authheader/authmgr.rb
Normal file
41
sample/soap/authheader/authmgr.rb
Normal file
|
@ -0,0 +1,41 @@
|
|||
class Authmgr
|
||||
def initialize
|
||||
@users = {
|
||||
'NaHi' => 'passwd',
|
||||
'HiNa' => 'wspass'
|
||||
}
|
||||
@sessions = {}
|
||||
end
|
||||
|
||||
def login(userid, passwd)
|
||||
userid and passwd and @users[userid] == passwd
|
||||
end
|
||||
|
||||
# returns userid
|
||||
def auth(sessionid)
|
||||
@sessions[sessionid]
|
||||
end
|
||||
|
||||
def create_session(userid)
|
||||
while true
|
||||
key = create_sessionkey
|
||||
break unless @sessions[key]
|
||||
end
|
||||
@sessions[key] = userid
|
||||
key
|
||||
end
|
||||
|
||||
def get_session(userid)
|
||||
@sessions.index(userid)
|
||||
end
|
||||
|
||||
def destroy_session(sessionkey)
|
||||
@sessions.delete(sessionkey)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_sessionkey
|
||||
Time.now.usec.to_s
|
||||
end
|
||||
end
|
40
sample/soap/authheader/client.rb
Normal file
40
sample/soap/authheader/client.rb
Normal file
|
@ -0,0 +1,40 @@
|
|||
require 'soap/rpc/driver'
|
||||
require 'soap/header/simplehandler'
|
||||
|
||||
server = ARGV.shift || 'http://localhost:7000/'
|
||||
|
||||
class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
|
||||
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
||||
|
||||
def initialize(userid, passwd)
|
||||
super(MyHeaderName)
|
||||
@sessionid = nil
|
||||
@userid = userid
|
||||
@passwd = passwd
|
||||
@mustunderstand = true
|
||||
end
|
||||
|
||||
def on_simple_outbound
|
||||
if @sessionid
|
||||
{ "sessionid" => @sessionid }
|
||||
else
|
||||
{ "userid" => @userid, "passwd" => @passwd }
|
||||
end
|
||||
end
|
||||
|
||||
def on_simple_inbound(my_header, mustunderstand)
|
||||
@sessionid = my_header["sessionid"]
|
||||
end
|
||||
end
|
||||
|
||||
ns = 'http://tempuri.org/authHeaderPort'
|
||||
serv = SOAP::RPC::Driver.new(server, ns)
|
||||
serv.add_method('deposit', 'amt')
|
||||
serv.add_method('withdrawal', 'amt')
|
||||
|
||||
serv.headerhandler << ClientAuthHeaderHandler.new('NaHi', 'passwd')
|
||||
|
||||
serv.wiredump_dev = STDOUT
|
||||
|
||||
p serv.deposit(150)
|
||||
p serv.withdrawal(120)
|
39
sample/soap/authheader/client2.rb
Normal file
39
sample/soap/authheader/client2.rb
Normal file
|
@ -0,0 +1,39 @@
|
|||
require 'soap/rpc/driver'
|
||||
require 'soap/header/simplehandler'
|
||||
|
||||
server = ARGV.shift || 'http://localhost:7000/'
|
||||
|
||||
class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
|
||||
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
||||
|
||||
def initialize(userid, passwd)
|
||||
super(MyHeaderName)
|
||||
@sessionid = nil
|
||||
@userid = userid
|
||||
@passwd = passwd
|
||||
end
|
||||
|
||||
def on_simple_outbound
|
||||
if @sessionid
|
||||
{ "sessionid" => @sessionid }
|
||||
else
|
||||
{ "userid" => @userid, "passwd" => @passwd }
|
||||
end
|
||||
end
|
||||
|
||||
def on_simple_inbound(my_header, mustunderstand)
|
||||
@sessionid = my_header["sessionid"]
|
||||
end
|
||||
end
|
||||
|
||||
ns = 'http://tempuri.org/authHeaderPort'
|
||||
serv = SOAP::RPC::Driver.new(server, ns)
|
||||
serv.add_method('deposit', 'amt')
|
||||
serv.add_method('withdrawal', 'amt')
|
||||
|
||||
serv.headerhandler << ClientAuthHeaderHandler.new('NaHi', 'passwd')
|
||||
|
||||
serv.wiredump_dev = STDOUT
|
||||
|
||||
p serv.deposit(150)
|
||||
p serv.withdrawal(120)
|
72
sample/soap/authheader/server.rb
Normal file
72
sample/soap/authheader/server.rb
Normal file
|
@ -0,0 +1,72 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/header/simplehandler'
|
||||
require 'authmgr'
|
||||
|
||||
class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
|
||||
class AuthHeaderService
|
||||
def self.create
|
||||
new
|
||||
end
|
||||
|
||||
def deposit(amt)
|
||||
"deposit #{amt} OK"
|
||||
end
|
||||
|
||||
def withdrawal(amt)
|
||||
"withdrawal #{amt} OK"
|
||||
end
|
||||
end
|
||||
|
||||
Name = 'http://tempuri.org/authHeaderPort'
|
||||
def initialize(*arg)
|
||||
super
|
||||
add_rpc_servant(AuthHeaderService.new, Name)
|
||||
add_rpc_request_headerhandler(ServerAuthHeaderHandler)
|
||||
end
|
||||
|
||||
class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler
|
||||
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
||||
|
||||
@authmgr = Authmgr.new
|
||||
def self.create
|
||||
new(@authmgr)
|
||||
end
|
||||
|
||||
def initialize(authmgr)
|
||||
super(MyHeaderName)
|
||||
@authmgr = authmgr
|
||||
@userid = @sessionid = nil
|
||||
end
|
||||
|
||||
def on_simple_outbound
|
||||
{ "sessionid" => @sessionid }
|
||||
end
|
||||
|
||||
def on_simple_inbound(my_header, mu)
|
||||
auth = false
|
||||
userid = my_header["userid"]
|
||||
passwd = my_header["passwd"]
|
||||
if @authmgr.login(userid, passwd)
|
||||
auth = true
|
||||
elsif sessionid = my_header["sessionid"]
|
||||
if userid = @authmgr.auth(sessionid)
|
||||
@authmgr.destroy_session(sessionid)
|
||||
auth = true
|
||||
end
|
||||
end
|
||||
raise RuntimeError.new("authentication failed") unless auth
|
||||
@userid = userid
|
||||
@sessionid = @authmgr.create_session(userid)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if $0 == __FILE__
|
||||
svr = AuthHeaderPortServer.new('AuthHeaderPortServer', nil, '0.0.0.0', 7000)
|
||||
trap(:INT) do
|
||||
svr.shutdown
|
||||
end
|
||||
status = svr.start
|
||||
end
|
77
sample/soap/authheader/server2.rb
Normal file
77
sample/soap/authheader/server2.rb
Normal file
|
@ -0,0 +1,77 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/header/simplehandler'
|
||||
require 'authmgr'
|
||||
|
||||
class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
|
||||
class AuthHeaderService
|
||||
def self.create
|
||||
new
|
||||
end
|
||||
|
||||
def initialize(authmgr)
|
||||
@authmgr = authmgr
|
||||
end
|
||||
|
||||
def login(userid, passwd)
|
||||
if @authmgr.login(userid, passwd)
|
||||
@authmgr.create_session(userid)
|
||||
else
|
||||
raise RuntimeError.new("authentication failed")
|
||||
end
|
||||
end
|
||||
|
||||
def deposit(amt)
|
||||
"deposit #{amt} OK"
|
||||
end
|
||||
|
||||
def withdrawal(amt)
|
||||
"withdrawal #{amt} OK"
|
||||
end
|
||||
end
|
||||
|
||||
Name = 'http://tempuri.org/authHeaderPort'
|
||||
def initialize(*arg)
|
||||
super
|
||||
add_rpc_servant(AuthHeaderService.new, Name)
|
||||
ServerAuthHeaderHandler.init
|
||||
add_rpc_request_headerhandler(ServerAuthHeaderHandler)
|
||||
end
|
||||
|
||||
class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler
|
||||
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
||||
|
||||
def self.create
|
||||
new(@authmgr)
|
||||
end
|
||||
|
||||
def initialize(authmgr)
|
||||
super(MyHeaderName)
|
||||
@authmgr = authmgr
|
||||
@sessionid = nil
|
||||
end
|
||||
|
||||
def on_simple_outbound
|
||||
if @sessionid
|
||||
{ "sessionid" => @sessionid }
|
||||
end
|
||||
end
|
||||
|
||||
def on_simple_inbound(my_header, mu)
|
||||
auth = false
|
||||
if sessionid = my_header["sessionid"]
|
||||
if userid = @authmgr.auth(sessionid)
|
||||
@authmgr.destroy_session(sessionid)
|
||||
@session_id = @authmgr.create_session(userid)
|
||||
auth = true
|
||||
end
|
||||
end
|
||||
raise RuntimeError.new("authentication failed") unless auth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if $0 == __FILE__
|
||||
status = AuthHeaderPortServer.new('AuthHeaderPortServer', nil, '0.0.0.0', 7000).start
|
||||
end
|
332
sample/soap/raa2.4/raa.rb
Normal file
332
sample/soap/raa2.4/raa.rb
Normal file
|
@ -0,0 +1,332 @@
|
|||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class Gem
|
||||
@@schema_type = "Gem"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
|
||||
def id
|
||||
@id
|
||||
end
|
||||
|
||||
def id=(value)
|
||||
@id = value
|
||||
end
|
||||
|
||||
def category
|
||||
@category
|
||||
end
|
||||
|
||||
def category=(value)
|
||||
@category = value
|
||||
end
|
||||
|
||||
def owner
|
||||
@owner
|
||||
end
|
||||
|
||||
def owner=(value)
|
||||
@owner = value
|
||||
end
|
||||
|
||||
def project
|
||||
@project
|
||||
end
|
||||
|
||||
def project=(value)
|
||||
@project = value
|
||||
end
|
||||
|
||||
def updated
|
||||
@updated
|
||||
end
|
||||
|
||||
def updated=(value)
|
||||
@updated = value
|
||||
end
|
||||
|
||||
def created
|
||||
@created
|
||||
end
|
||||
|
||||
def created=(value)
|
||||
@created = value
|
||||
end
|
||||
|
||||
def initialize(id = nil,
|
||||
category = nil,
|
||||
owner = nil,
|
||||
project = nil,
|
||||
updated = nil,
|
||||
created = nil)
|
||||
@id = id
|
||||
@category = category
|
||||
@owner = owner
|
||||
@project = project
|
||||
@updated = updated
|
||||
@created = created
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class Category
|
||||
@@schema_type = "Category"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
|
||||
def major
|
||||
@major
|
||||
end
|
||||
|
||||
def major=(value)
|
||||
@major = value
|
||||
end
|
||||
|
||||
def minor
|
||||
@minor
|
||||
end
|
||||
|
||||
def minor=(value)
|
||||
@minor = value
|
||||
end
|
||||
|
||||
def initialize(major = nil,
|
||||
minor = nil)
|
||||
@major = major
|
||||
@minor = minor
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class Owner
|
||||
@@schema_type = "Owner"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
|
||||
def id
|
||||
@id
|
||||
end
|
||||
|
||||
def id=(value)
|
||||
@id = value
|
||||
end
|
||||
|
||||
def email
|
||||
@email
|
||||
end
|
||||
|
||||
def email=(value)
|
||||
@email = value
|
||||
end
|
||||
|
||||
def name
|
||||
@name
|
||||
end
|
||||
|
||||
def name=(value)
|
||||
@name = value
|
||||
end
|
||||
|
||||
def initialize(id = nil,
|
||||
email = nil,
|
||||
name = nil)
|
||||
@id = id
|
||||
@email = email
|
||||
@name = name
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class Project
|
||||
@@schema_type = "Project"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
|
||||
def name
|
||||
@name
|
||||
end
|
||||
|
||||
def name=(value)
|
||||
@name = value
|
||||
end
|
||||
|
||||
def short_description
|
||||
@short_description
|
||||
end
|
||||
|
||||
def short_description=(value)
|
||||
@short_description = value
|
||||
end
|
||||
|
||||
def version
|
||||
@version
|
||||
end
|
||||
|
||||
def version=(value)
|
||||
@version = value
|
||||
end
|
||||
|
||||
def status
|
||||
@status
|
||||
end
|
||||
|
||||
def status=(value)
|
||||
@status = value
|
||||
end
|
||||
|
||||
def url
|
||||
@url
|
||||
end
|
||||
|
||||
def url=(value)
|
||||
@url = value
|
||||
end
|
||||
|
||||
def download
|
||||
@download
|
||||
end
|
||||
|
||||
def download=(value)
|
||||
@download = value
|
||||
end
|
||||
|
||||
def license
|
||||
@license
|
||||
end
|
||||
|
||||
def license=(value)
|
||||
@license = value
|
||||
end
|
||||
|
||||
def description
|
||||
@description
|
||||
end
|
||||
|
||||
def description=(value)
|
||||
@description = value
|
||||
end
|
||||
|
||||
def updated
|
||||
@updated
|
||||
end
|
||||
|
||||
def updated=(value)
|
||||
@updated = value
|
||||
end
|
||||
|
||||
def history
|
||||
@history
|
||||
end
|
||||
|
||||
def history=(value)
|
||||
@history = value
|
||||
end
|
||||
|
||||
def dependency
|
||||
@dependency
|
||||
end
|
||||
|
||||
def dependency=(value)
|
||||
@dependency = value
|
||||
end
|
||||
|
||||
def initialize(name = nil,
|
||||
short_description = nil,
|
||||
version = nil,
|
||||
status = nil,
|
||||
url = nil,
|
||||
download = nil,
|
||||
license = nil,
|
||||
description = nil,
|
||||
updated = nil,
|
||||
history = nil,
|
||||
dependency = nil)
|
||||
@name = name
|
||||
@short_description = short_description
|
||||
@version = version
|
||||
@status = status
|
||||
@url = url
|
||||
@download = download
|
||||
@license = license
|
||||
@description = description
|
||||
@updated = updated
|
||||
@history = history
|
||||
@dependency = dependency
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class ProjectDependency
|
||||
@@schema_type = "ProjectDependency"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
|
||||
def project
|
||||
@project
|
||||
end
|
||||
|
||||
def project=(value)
|
||||
@project = value
|
||||
end
|
||||
|
||||
def version
|
||||
@version
|
||||
end
|
||||
|
||||
def version=(value)
|
||||
@version = value
|
||||
end
|
||||
|
||||
def description
|
||||
@description
|
||||
end
|
||||
|
||||
def description=(value)
|
||||
@description = value
|
||||
end
|
||||
|
||||
def initialize(project = nil,
|
||||
version = nil,
|
||||
description = nil)
|
||||
@project = project
|
||||
@version = version
|
||||
@description = description
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class GemArray < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "GemArray"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class OwnerArray < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "OwnerArray"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class ProjectArray < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "ProjectArray"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class ProjectDependencyArray < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "ProjectDependencyArray"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class StringArray < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "StringArray"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
end
|
||||
|
||||
# http://xml.apache.org/xml-soap
|
||||
class Map < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "Map"
|
||||
@@schema_ns = "http://xml.apache.org/xml-soap"
|
||||
end
|
||||
|
255
sample/soap/raa2.4/raaDriver.rb
Normal file
255
sample/soap/raa2.4/raaDriver.rb
Normal file
|
@ -0,0 +1,255 @@
|
|||
require 'raa.rb'
|
||||
|
||||
require 'soap/rpc/driver'
|
||||
|
||||
class RaaServicePortType < SOAP::RPC::Driver
|
||||
TargetNamespace = "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
MappingRegistry = ::SOAP::Mapping::Registry.new
|
||||
|
||||
MappingRegistry.set(
|
||||
Gem,
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Gem") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
Category,
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Category") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
Owner,
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Owner") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
Project,
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Project") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
ProjectArray,
|
||||
::SOAP::SOAPArray,
|
||||
::SOAP::Mapping::Registry::TypedArrayFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Project") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
ProjectDependencyArray,
|
||||
::SOAP::SOAPArray,
|
||||
::SOAP::Mapping::Registry::TypedArrayFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "ProjectDependency") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
StringArray,
|
||||
::SOAP::SOAPArray,
|
||||
::SOAP::Mapping::Registry::TypedArrayFactory,
|
||||
{ :type => XSD::QName.new("http://www.w3.org/2001/XMLSchema", "string") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
Map,
|
||||
::SOAP::SOAPArray,
|
||||
::SOAP::Mapping::Registry::TypedArrayFactory,
|
||||
{ :type => XSD::QName.new("http://www.w3.org/2001/XMLSchema", "anyType") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
OwnerArray,
|
||||
::SOAP::SOAPArray,
|
||||
::SOAP::Mapping::Registry::TypedArrayFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Owner") }
|
||||
)
|
||||
MappingRegistry.set(
|
||||
ProjectDependency,
|
||||
::SOAP::SOAPStruct,
|
||||
::SOAP::Mapping::Registry::TypedStructFactory,
|
||||
{ :type => XSD::QName.new("http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "ProjectDependency") }
|
||||
)
|
||||
Methods = [
|
||||
["gem", "gem",
|
||||
[
|
||||
["in", "name", [SOAP::SOAPString]],
|
||||
["retval", "return", [::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Gem"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["dependents", "dependents",
|
||||
[
|
||||
["in", "name", [SOAP::SOAPString]],
|
||||
["in", "version", [SOAP::SOAPString]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "ProjectDependency"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["names", "names",
|
||||
[
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["size", "size",
|
||||
[
|
||||
["retval", "return", [SOAP::SOAPInt]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["list_by_category", "list_by_category",
|
||||
[
|
||||
["in", "major", [SOAP::SOAPString]],
|
||||
["in", "minor", [SOAP::SOAPString]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["tree_by_category", "tree_by_category",
|
||||
[
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "anyType"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["list_recent_updated", "list_recent_updated",
|
||||
[
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["list_recent_created", "list_recent_created",
|
||||
[
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["list_updated_since", "list_updated_since",
|
||||
[
|
||||
["in", "date", [SOAP::SOAPDateTime]],
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["list_created_since", "list_created_since",
|
||||
[
|
||||
["in", "date", [SOAP::SOAPDateTime]],
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["list_by_owner", "list_by_owner",
|
||||
[
|
||||
["in", "owner_id", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["search_name", "search_name",
|
||||
[
|
||||
["in", "substring", [SOAP::SOAPString]],
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["search_short_description", "search_short_description",
|
||||
[
|
||||
["in", "substring", [SOAP::SOAPString]],
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["search_owner", "search_owner",
|
||||
[
|
||||
["in", "substring", [SOAP::SOAPString]],
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["search_version", "search_version",
|
||||
[
|
||||
["in", "substring", [SOAP::SOAPString]],
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["search_status", "search_status",
|
||||
[
|
||||
["in", "substring", [SOAP::SOAPString]],
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["search_description", "search_description",
|
||||
[
|
||||
["in", "substring", [SOAP::SOAPString]],
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "string"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["search", "search",
|
||||
[
|
||||
["in", "substring", [SOAP::SOAPString]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.w3.org/2001/XMLSchema", "anyType"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["owner", "owner",
|
||||
[
|
||||
["in", "owner_id", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Owner"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["list_owner", "list_owner",
|
||||
[
|
||||
["in", "idx", [SOAP::SOAPInt]],
|
||||
["retval", "return", [::SOAP::SOAPArray, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Owner"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["update", "update",
|
||||
[
|
||||
["in", "name", [SOAP::SOAPString]],
|
||||
["in", "pass", [SOAP::SOAPString]],
|
||||
["in", "gem", [::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Gem"]],
|
||||
["retval", "return", [::SOAP::SOAPStruct, "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/", "Gem"]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
],
|
||||
["update_pass", "update_pass",
|
||||
[
|
||||
["in", "name", [SOAP::SOAPString]],
|
||||
["in", "oldpass", [SOAP::SOAPString]],
|
||||
["in", "newpass", [SOAP::SOAPString]]
|
||||
],
|
||||
"", "http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/"
|
||||
]
|
||||
]
|
||||
|
||||
DefaultEndpointUrl = "http://raa.ruby-lang.org/soapsrv"
|
||||
|
||||
def initialize(endpoint_url = nil)
|
||||
endpoint_url ||= DefaultEndpointUrl
|
||||
super(endpoint_url, nil)
|
||||
self.mapping_registry = MappingRegistry
|
||||
init_methods
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def init_methods
|
||||
Methods.each do |name_as, name, params, soapaction, namespace|
|
||||
qname = XSD::QName.new(namespace, name_as)
|
||||
@proxy.add_method(qname, soapaction, name, params)
|
||||
add_rpc_method_interface(name, params)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
354
sample/soap/raa2.4/raaServiceClient.rb
Normal file
354
sample/soap/raa2.4/raaServiceClient.rb
Normal file
|
@ -0,0 +1,354 @@
|
|||
#!/usr/bin/env ruby
|
||||
require 'raaDriver.rb'
|
||||
|
||||
endpoint_url = ARGV.shift
|
||||
obj = RaaServicePortType.new(endpoint_url)
|
||||
|
||||
# Uncomment the below line to see SOAP wiredumps.
|
||||
# obj.wiredump_dev = STDERR
|
||||
|
||||
# SYNOPSIS
|
||||
# gem(name)
|
||||
#
|
||||
# ARGS
|
||||
# name - {http://www.w3.org/2001/XMLSchema}string
|
||||
#
|
||||
# RETURNS
|
||||
# return Gem - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}Gem
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
name = nil
|
||||
puts obj.gem(name)
|
||||
|
||||
# SYNOPSIS
|
||||
# dependents(name, version)
|
||||
#
|
||||
# ARGS
|
||||
# name - {http://www.w3.org/2001/XMLSchema}string
|
||||
# version - {http://www.w3.org/2001/XMLSchema}string
|
||||
#
|
||||
# RETURNS
|
||||
# return ProjectDependencyArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}ProjectDependencyArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
name = version = nil
|
||||
puts obj.dependents(name, version)
|
||||
|
||||
# SYNOPSIS
|
||||
# names
|
||||
#
|
||||
# ARGS
|
||||
# N/A
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
|
||||
puts obj.names
|
||||
|
||||
# SYNOPSIS
|
||||
# size
|
||||
#
|
||||
# ARGS
|
||||
# N/A
|
||||
#
|
||||
# RETURNS
|
||||
# return - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
|
||||
puts obj.size
|
||||
|
||||
# SYNOPSIS
|
||||
# list_by_category(major, minor)
|
||||
#
|
||||
# ARGS
|
||||
# major - {http://www.w3.org/2001/XMLSchema}string
|
||||
# minor - {http://www.w3.org/2001/XMLSchema}string
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
major = minor = nil
|
||||
puts obj.list_by_category(major, minor)
|
||||
|
||||
# SYNOPSIS
|
||||
# tree_by_category
|
||||
#
|
||||
# ARGS
|
||||
# N/A
|
||||
#
|
||||
# RETURNS
|
||||
# return Map - {http://xml.apache.org/xml-soap}Map
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
|
||||
puts obj.tree_by_category
|
||||
|
||||
# SYNOPSIS
|
||||
# list_recent_updated(idx)
|
||||
#
|
||||
# ARGS
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
idx = nil
|
||||
puts obj.list_recent_updated(idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# list_recent_created(idx)
|
||||
#
|
||||
# ARGS
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
idx = nil
|
||||
puts obj.list_recent_created(idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# list_updated_since(date, idx)
|
||||
#
|
||||
# ARGS
|
||||
# date - {http://www.w3.org/2001/XMLSchema}dateTime
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
date = idx = nil
|
||||
puts obj.list_updated_since(date, idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# list_created_since(date, idx)
|
||||
#
|
||||
# ARGS
|
||||
# date - {http://www.w3.org/2001/XMLSchema}dateTime
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
date = idx = nil
|
||||
puts obj.list_created_since(date, idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# list_by_owner(owner_id)
|
||||
#
|
||||
# ARGS
|
||||
# owner_id - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
owner_id = nil
|
||||
puts obj.list_by_owner(owner_id)
|
||||
|
||||
# SYNOPSIS
|
||||
# search_name(substring, idx)
|
||||
#
|
||||
# ARGS
|
||||
# substring - {http://www.w3.org/2001/XMLSchema}string
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
substring = idx = nil
|
||||
puts obj.search_name(substring, idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# search_short_description(substring, idx)
|
||||
#
|
||||
# ARGS
|
||||
# substring - {http://www.w3.org/2001/XMLSchema}string
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
substring = idx = nil
|
||||
puts obj.search_short_description(substring, idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# search_owner(substring, idx)
|
||||
#
|
||||
# ARGS
|
||||
# substring - {http://www.w3.org/2001/XMLSchema}string
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
substring = idx = nil
|
||||
puts obj.search_owner(substring, idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# search_version(substring, idx)
|
||||
#
|
||||
# ARGS
|
||||
# substring - {http://www.w3.org/2001/XMLSchema}string
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
substring = idx = nil
|
||||
puts obj.search_version(substring, idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# search_status(substring, idx)
|
||||
#
|
||||
# ARGS
|
||||
# substring - {http://www.w3.org/2001/XMLSchema}string
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
substring = idx = nil
|
||||
puts obj.search_status(substring, idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# search_description(substring, idx)
|
||||
#
|
||||
# ARGS
|
||||
# substring - {http://www.w3.org/2001/XMLSchema}string
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return StringArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}StringArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
substring = idx = nil
|
||||
puts obj.search_description(substring, idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# search(substring)
|
||||
#
|
||||
# ARGS
|
||||
# substring - {http://www.w3.org/2001/XMLSchema}string
|
||||
#
|
||||
# RETURNS
|
||||
# return Map - {http://xml.apache.org/xml-soap}Map
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
substring = nil
|
||||
puts obj.search(substring)
|
||||
|
||||
# SYNOPSIS
|
||||
# owner(owner_id)
|
||||
#
|
||||
# ARGS
|
||||
# owner_id - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return Owner - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}Owner
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
owner_id = nil
|
||||
puts obj.owner(owner_id)
|
||||
|
||||
# SYNOPSIS
|
||||
# list_owner(idx)
|
||||
#
|
||||
# ARGS
|
||||
# idx - {http://www.w3.org/2001/XMLSchema}int
|
||||
#
|
||||
# RETURNS
|
||||
# return OwnerArray - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}OwnerArray
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
idx = nil
|
||||
puts obj.list_owner(idx)
|
||||
|
||||
# SYNOPSIS
|
||||
# update(name, pass, gem)
|
||||
#
|
||||
# ARGS
|
||||
# name - {http://www.w3.org/2001/XMLSchema}string
|
||||
# pass - {http://www.w3.org/2001/XMLSchema}string
|
||||
# gem Gem - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}Gem
|
||||
#
|
||||
# RETURNS
|
||||
# return Gem - {http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/}Gem
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
name = pass = gem = nil
|
||||
puts obj.update(name, pass, gem)
|
||||
|
||||
# SYNOPSIS
|
||||
# update_pass(name, oldpass, newpass)
|
||||
#
|
||||
# ARGS
|
||||
# name - {http://www.w3.org/2001/XMLSchema}string
|
||||
# oldpass - {http://www.w3.org/2001/XMLSchema}string
|
||||
# newpass - {http://www.w3.org/2001/XMLSchema}string
|
||||
#
|
||||
# RETURNS
|
||||
# N/A
|
||||
#
|
||||
# RAISES
|
||||
# (undefined)
|
||||
#
|
||||
name = oldpass = newpass = nil
|
||||
puts obj.update_pass(name, oldpass, newpass)
|
||||
|
||||
|
115
sample/soap/raa2.4/sample.rb
Normal file
115
sample/soap/raa2.4/sample.rb
Normal file
|
@ -0,0 +1,115 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
# This is a sample client based on raaServiceClient.rb.
|
||||
# You can generate raaServiceClient.rb and related files with
|
||||
# wsdl2ruby.rb --wsdl http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/ --type client
|
||||
|
||||
require 'pp'
|
||||
require 'raaDriver.rb'
|
||||
|
||||
raa = RaaServicePortType.new
|
||||
# raa.wiredump_dev = STDERR
|
||||
|
||||
def sec(msg)
|
||||
puts
|
||||
puts "--------"
|
||||
puts "-- " + msg
|
||||
puts
|
||||
end
|
||||
|
||||
def subsec(msg)
|
||||
puts "-- " + msg
|
||||
end
|
||||
|
||||
sec("retrieve a gem (RAA Information) which has specified name")
|
||||
name = 'soap4r'
|
||||
pp raa.gem(name)
|
||||
|
||||
sec("retrieve dependents of the project")
|
||||
name = 'http-access2'; version = nil
|
||||
pp raa.dependents(name, version)
|
||||
|
||||
sec("number of registered gems")
|
||||
puts raa.size
|
||||
|
||||
sec("retrieve all registered gem names")
|
||||
p raa.names
|
||||
|
||||
sec("retrieve gems of specified category")
|
||||
major = 'Library'; minor = 'XML'
|
||||
p raa.list_by_category(major, minor)
|
||||
|
||||
sec("retrieve category tree")
|
||||
pp raa.tree_by_category
|
||||
|
||||
sec("retrieve gems which is updated recently")
|
||||
idx = 0
|
||||
p raa.list_recent_updated(idx)
|
||||
subsec("next 10 gems")
|
||||
idx += 1
|
||||
p raa.list_recent_updated(idx)
|
||||
subsec("next 10 gems")
|
||||
idx += 1
|
||||
p raa.list_recent_updated(idx)
|
||||
|
||||
sec("retrieve gems which is created recently")
|
||||
p raa.list_recent_created(idx)
|
||||
|
||||
sec("retrieve gems which is updated in 7 days")
|
||||
date = Time.now - 7 * 24 * 60 * 60; idx = 0
|
||||
p raa.list_updated_since(date, idx)
|
||||
|
||||
sec("retrieve gems which is created in 7 days")
|
||||
p raa.list_created_since(date, idx)
|
||||
|
||||
sec("retrieve gems of specified owner")
|
||||
owner_id = 8 # NaHi
|
||||
p raa.list_by_owner(owner_id)
|
||||
|
||||
sec("search gems with keyword")
|
||||
substring = 'soap'
|
||||
pp raa.search(substring)
|
||||
|
||||
# There are several search interface to search a field explicitly.
|
||||
# puts raa.search_name(substring, idx)
|
||||
# puts raa.search_short_description(substring, idx)
|
||||
# puts raa.search_owner(substring, idx)
|
||||
# puts raa.search_version(substring, idx)
|
||||
# puts raa.search_status(substring, idx)
|
||||
# puts raa.search_description(substring, idx)
|
||||
|
||||
sec("retrieve owner info")
|
||||
owner_id = 8
|
||||
pp raa.owner(owner_id)
|
||||
|
||||
sec("retrieve owners")
|
||||
idx = 0
|
||||
p raa.list_owner(idx)
|
||||
|
||||
sec("update 'sampleproject'")
|
||||
name = 'sampleproject'
|
||||
pass = 'sampleproject'
|
||||
gem = raa.gem(name)
|
||||
p gem.project.version
|
||||
gem.project.version.succ!
|
||||
gem.updated = Time.now
|
||||
raa.update(name, pass, gem)
|
||||
p raa.gem(name).project.version
|
||||
|
||||
sec("update pass phrase")
|
||||
raa.update_pass(name, 'sampleproject', 'foo')
|
||||
subsec("update check")
|
||||
gem = raa.gem(name)
|
||||
gem.project.description = 'Current pass phrase is "foo"'
|
||||
gem.updated = Time.now
|
||||
raa.update(name, 'foo', gem)
|
||||
#
|
||||
subsec("recover pass phrase")
|
||||
raa.update_pass(name, 'foo', 'sampleproject')
|
||||
subsec("update check")
|
||||
gem = raa.gem(name)
|
||||
gem.project.description = 'Current pass phrase is "sampleproject"'
|
||||
gem.updated = Time.now
|
||||
raa.update(name, 'sampleproject', gem)
|
||||
|
||||
sec("done")
|
1
sample/soap/ssl/files/README
Normal file
1
sample/soap/ssl/files/README
Normal file
|
@ -0,0 +1 @@
|
|||
* certificates and keys in this directory is copied from http-access2 test.
|
23
sample/soap/ssl/files/ca.cert
Normal file
23
sample/soap/ssl/files/ca.cert
Normal file
|
@ -0,0 +1,23 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIID0DCCArigAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
|
||||
MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
|
||||
DTA0MDEzMDAwNDIzMloXDTM2MDEyMjAwNDIzMlowPDELMAkGA1UEBgwCSlAxEjAQ
|
||||
BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQswCQYDVQQDDAJDQTCCASIw
|
||||
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANbv0x42BTKFEQOE+KJ2XmiSdZpR
|
||||
wjzQLAkPLRnLB98tlzs4xo+y4RyY/rd5TT9UzBJTIhP8CJi5GbS1oXEerQXB3P0d
|
||||
L5oSSMwGGyuIzgZe5+vZ1kgzQxMEKMMKlzA73rbMd4Jx3u5+jdbP0EDrPYfXSvLY
|
||||
bS04n2aX7zrN3x5KdDrNBfwBio2/qeaaj4+9OxnwRvYP3WOvqdW0h329eMfHw0pi
|
||||
JI0drIVdsEqClUV4pebT/F+CPUPkEh/weySgo9wANockkYu5ujw2GbLFcO5LXxxm
|
||||
dEfcVr3r6t6zOA4bJwL0W/e6LBcrwiG/qPDFErhwtgTLYf6Er67SzLyA66UCAwEA
|
||||
AaOB3DCB2TAPBgNVHRMBAf8EBTADAQH/MDEGCWCGSAGG+EIBDQQkFiJSdWJ5L09w
|
||||
ZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRJ7Xd380KzBV7f
|
||||
USKIQ+O/vKbhDzAOBgNVHQ8BAf8EBAMCAQYwZAYDVR0jBF0wW4AUSe13d/NCswVe
|
||||
31EiiEPjv7ym4Q+hQKQ+MDwxCzAJBgNVBAYMAkpQMRIwEAYDVQQKDAlKSU4uR1Iu
|
||||
SlAxDDAKBgNVBAsMA1JSUjELMAkGA1UEAwwCQ0GCAQAwDQYJKoZIhvcNAQEFBQAD
|
||||
ggEBAIu/mfiez5XN5tn2jScgShPgHEFJBR0BTJBZF6xCk0jyqNx/g9HMj2ELCuK+
|
||||
r/Y7KFW5c5M3AQ+xWW0ZSc4kvzyTcV7yTVIwj2jZ9ddYMN3nupZFgBK1GB4Y05GY
|
||||
MJJFRkSu6d/Ph5ypzBVw2YMT/nsOo5VwMUGLgS7YVjU+u/HNWz80J3oO17mNZllj
|
||||
PvORJcnjwlroDnS58KoJ7GDgejv3ESWADvX1OHLE4cRkiQGeLoEU4pxdCxXRqX0U
|
||||
PbwIkZN9mXVcrmPHq8MWi4eC/V7hnbZETMHuWhUoiNdOEfsAXr3iP4KjyyRdwc7a
|
||||
d/xgcK06UVQRL/HbEYGiQL056mc=
|
||||
-----END CERTIFICATE-----
|
19
sample/soap/ssl/files/client.cert
Normal file
19
sample/soap/ssl/files/client.cert
Normal file
|
@ -0,0 +1,19 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIDKDCCAhCgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
|
||||
MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
|
||||
DTA0MDEzMTAzMTQ1OFoXDTM1MDEyMzAzMTQ1OFowZTELMAkGA1UEBgwCSlAxEjAQ
|
||||
BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRAwDgYDVQQDDAdleGFtcGxl
|
||||
MSIwIAYJKoZIhvcNAQkBDBNleGFtcGxlQGV4YW1wbGUub3JnMIGfMA0GCSqGSIb3
|
||||
DQEBAQUAA4GNADCBiQKBgQDRWssrK8Gyr+500hpLjCGR3+AHL8/hEJM5zKi/MgLW
|
||||
jTkvsgOwbYwXOiNtAbR9y4/ucDq7EY+cMUMHES4uFaPTcOaAV0aZRmk8AgslN1tQ
|
||||
gNS6ew7/Luq3DcVeWkX8PYgR9VG0mD1MPfJ6+IFA5d3vKpdBkBgN4l46jjO0/2Xf
|
||||
ewIDAQABo4GPMIGMMAwGA1UdEwEB/wQCMAAwMQYJYIZIAYb4QgENBCQWIlJ1Ynkv
|
||||
T3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFOFvay0H7lr2
|
||||
xUx6waYEV2bVDYQhMAsGA1UdDwQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYI
|
||||
KwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBABd2dYWqbDIWf5sWFvslezxJv8gI
|
||||
w64KCJBuyJAiDuf+oazr3016kMzAlt97KecLZDusGNagPrq02UX7YMoQFsWJBans
|
||||
cDtHrkM0al5r6/WGexNMgtYbNTYzt/IwodISGBgZ6dsOuhznwms+IBsTNDAvWeLP
|
||||
lt2tOqD8kEmjwMgn0GDRuKjs4EoboA3kMULb1p9akDV9ZESU3eOtpS5/G5J5msLI
|
||||
9WXbYBjcjvkLuJH9VsJhb+R58Vl0ViemvAHhPilSl1SPWVunGhv6FcIkdBEi1k9F
|
||||
e8BNMmsEjFiANiIRvpdLRbiGBt0KrKTndVfsmoKCvY48oCOvnzxtahFxfs8=
|
||||
-----END CERTIFICATE-----
|
15
sample/soap/ssl/files/client.key
Normal file
15
sample/soap/ssl/files/client.key
Normal file
|
@ -0,0 +1,15 @@
|
|||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICWwIBAAKBgQDRWssrK8Gyr+500hpLjCGR3+AHL8/hEJM5zKi/MgLWjTkvsgOw
|
||||
bYwXOiNtAbR9y4/ucDq7EY+cMUMHES4uFaPTcOaAV0aZRmk8AgslN1tQgNS6ew7/
|
||||
Luq3DcVeWkX8PYgR9VG0mD1MPfJ6+IFA5d3vKpdBkBgN4l46jjO0/2XfewIDAQAB
|
||||
AoGAZcz8llWErtsV3QB9gNb3S/PNADGjqBFjReva8n3jG2k4sZSibpwWTwUaTNtT
|
||||
ZQgjSRKRvH1hk9XwffNAvXAQZNNkuj/16gO2oO45nyLj4dO365ujLptWnVIWDHOE
|
||||
uN0GeiZO+VzcCisT0WCq4tvtLeH8svrxzA8cbXIEyOK7NiECQQDwo2zPFyKAZ/Cu
|
||||
lDJ6zKT+RjfWwW7DgWzirAlTrt4ViMaW+IaDH29TmQpb4V4NuR3Xi+2Xl4oicu6S
|
||||
36TW9+/FAkEA3rgfOQJuLlWSnw1RTGwvnC816a/W7iYYY7B+0U4cDbfWl7IoXT4y
|
||||
M8nV/HESooviZLqBwzAYSoj3fFKYBKpGPwJAUO8GN5iWWA2dW3ooiDiv/X1sZmRk
|
||||
dojfMFWgRW747tEzya8Ivq0h6kH8w+5GjeMG8Gn1nRiwsulo6Ckj7dEx6QJACyui
|
||||
7UIQ8qP6GZ4aYMHgVW4Mvy7Bkeo5OO7GPYs0Xv/EdJFL8vlGnVBXOjUVoS9w6Gpu
|
||||
TbLg1QQvnX2rADjmEwJANxZO2GUkaWGsEif8aGW0x5g/IdaMGG27pTWk5zqix7P3
|
||||
1UDrdo/JOXhptovhRi06EppIxAxYmbh9vd9VN8Itlw==
|
||||
-----END RSA PRIVATE KEY-----
|
19
sample/soap/ssl/files/server.cert
Normal file
19
sample/soap/ssl/files/server.cert
Normal file
|
@ -0,0 +1,19 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIC/zCCAeegAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQGDAJKUDES
|
||||
MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxDjAMBgNVBAMMBVN1YkNB
|
||||
MB4XDTA0MDEzMTAzMTMxNloXDTMzMDEyMzAzMTMxNlowQzELMAkGA1UEBgwCSlAx
|
||||
EjAQBgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRIwEAYDVQQDDAlsb2Nh
|
||||
bGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANFJTxWqup3nV9dsJAku
|
||||
p+WaXnPNIzcpAA3qMGZDJTJsfa8Du7ZxTP0XJK5mETttBrn711cJxAuP3KjqnW9S
|
||||
vtZ9lY2sXJ6Zj62sN5LwG3VVe25dI28yR1EsbHjJ5Zjf9tmggMC6am52dxuHbt5/
|
||||
vHo4ngJuKE/U+eeGRivMn6gFAgMBAAGjgYUwgYIwDAYDVR0TAQH/BAIwADAxBglg
|
||||
hkgBhvhCAQ0EJBYiUnVieS9PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd
|
||||
BgNVHQ4EFgQUpZIyygD9JxFYHHOTEuWOLbCKfckwCwYDVR0PBAQDAgWgMBMGA1Ud
|
||||
JQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBBQUAA4IBAQBwAIj5SaBHaA5X31IP
|
||||
CFCJiep96awfp7RANO0cuUj+ZpGoFn9d6FXY0g+Eg5wAkCNIzZU5NHN9xsdOpnUo
|
||||
zIBbyTfQEPrge1CMWMvL6uGaoEXytq84VTitF/xBTky4KtTn6+es4/e7jrrzeUXQ
|
||||
RC46gkHObmDT91RkOEGjHLyld2328jo3DIN/VTHIryDeVHDWjY5dENwpwdkhhm60
|
||||
DR9IrNBbXWEe9emtguNXeN0iu1ux0lG1Hc6pWGQxMlRKNvGh0yZB9u5EVe38tOV0
|
||||
jQaoNyL7qzcQoXD3Dmbi1p0iRmg/+HngISsz8K7k7MBNVsSclztwgCzTZOBiVtkM
|
||||
rRlQ
|
||||
-----END CERTIFICATE-----
|
15
sample/soap/ssl/files/server.key
Normal file
15
sample/soap/ssl/files/server.key
Normal file
|
@ -0,0 +1,15 @@
|
|||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQDRSU8Vqrqd51fXbCQJLqflml5zzSM3KQAN6jBmQyUybH2vA7u2
|
||||
cUz9FySuZhE7bQa5+9dXCcQLj9yo6p1vUr7WfZWNrFyemY+trDeS8Bt1VXtuXSNv
|
||||
MkdRLGx4yeWY3/bZoIDAumpudncbh27ef7x6OJ4CbihP1PnnhkYrzJ+oBQIDAQAB
|
||||
AoGBAIf4CstW2ltQO7+XYGoex7Hh8s9lTSW/G2vu5Hbr1LTHy3fzAvdq8MvVR12O
|
||||
rk9fa+lU9vhzPc0NMB0GIDZ9GcHuhW5hD1Wg9OSCbTOkZDoH3CAFqonjh4Qfwv5W
|
||||
IPAFn9KHukdqGXkwEMdErsUaPTy9A1V/aROVEaAY+HJgq/eZAkEA/BP1QMV04WEZ
|
||||
Oynzz7/lLizJGGxp2AOvEVtqMoycA/Qk+zdKP8ufE0wbmCE3Qd6GoynavsHb6aGK
|
||||
gQobb8zDZwJBANSK6MrXlrZTtEaeZuyOB4mAmRzGzOUVkUyULUjEx2GDT93ujAma
|
||||
qm/2d3E+wXAkNSeRpjUmlQXy/2oSqnGvYbMCQQDRM+cYyEcGPUVpWpnj0shrF/QU
|
||||
9vSot/X1G775EMTyaw6+BtbyNxVgOIu2J+rqGbn3c+b85XqTXOPL0A2RLYkFAkAm
|
||||
syhSDtE9X55aoWsCNZY/vi+i4rvaFoQ/WleogVQAeGVpdo7/DK9t9YWoFBIqth0L
|
||||
mGSYFu9ZhvZkvQNV8eYrAkBJ+rOIaLDsmbrgkeDruH+B/9yrm4McDtQ/rgnOGYnH
|
||||
LjLpLLOrgUxqpzLWe++EwSLwK2//dHO+SPsQJ4xsyQJy
|
||||
-----END RSA PRIVATE KEY-----
|
5
sample/soap/ssl/files/sslclient.properties
Normal file
5
sample/soap/ssl/files/sslclient.properties
Normal file
|
@ -0,0 +1,5 @@
|
|||
# verify server's certificate
|
||||
protocol.http.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
||||
# certificates for verification
|
||||
protocol.http.ssl_config.ca_file = files/ca.cert
|
||||
protocol.http.ssl_config.ca_file = files/subca.cert
|
|
@ -0,0 +1,2 @@
|
|||
# no verify server's certificate
|
||||
protocol.http.ssl_config.verify_mode =
|
|
@ -0,0 +1,9 @@
|
|||
# verify server's certificate
|
||||
protocol.http.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
||||
# certificates for verification
|
||||
protocol.http.ssl_config.ca_file = files/ca.cert
|
||||
protocol.http.ssl_config.ca_file = files/subca.cert
|
||||
|
||||
# key and certificate for client identity
|
||||
protocol.http.ssl_config.client_cert = files/client.cert
|
||||
protocol.http.ssl_config.client_key = files/client.key
|
21
sample/soap/ssl/files/subca.cert
Normal file
21
sample/soap/ssl/files/subca.cert
Normal file
|
@ -0,0 +1,21 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
|
||||
MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
|
||||
DTA0MDEzMDAwNDMyN1oXDTM1MDEyMjAwNDMyN1owPzELMAkGA1UEBgwCSlAxEjAQ
|
||||
BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQ4wDAYDVQQDDAVTdWJDQTCC
|
||||
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ0Ou7AyRcRXnB/kVHv/6kwe
|
||||
ANzgg/DyJfsAUqW90m7Lu1nqyug8gK0RBd77yU0w5HOAMHTVSdpjZK0g2sgx4Mb1
|
||||
d/213eL9TTl5MRVEChTvQr8q5DVG/8fxPPE7fMI8eOAzd98/NOAChk+80r4Sx7fC
|
||||
kGVEE1bKwY1MrUsUNjOY2d6t3M4HHV3HX1V8ShuKfsHxgCmLzdI8U+5CnQedFgkm
|
||||
3e+8tr8IX5RR1wA1Ifw9VadF7OdI/bGMzog/Q8XCLf+WPFjnK7Gcx6JFtzF6Gi4x
|
||||
4dp1Xl45JYiVvi9zQ132wu8A1pDHhiNgQviyzbP+UjcB/tsOpzBQF8abYzgEkWEC
|
||||
AwEAAaNyMHAwDwYDVR0TAQH/BAUwAwEB/zAxBglghkgBhvhCAQ0EJBYiUnVieS9P
|
||||
cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUlCjXWLsReYzH
|
||||
LzsxwVnCXmKoB/owCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCJ/OyN
|
||||
rT8Cq2Y+G2yA/L1EMRvvxwFBqxavqaqHl/6rwsIBFlB3zbqGA/0oec6MAVnYynq4
|
||||
c4AcHTjx3bQ/S4r2sNTZq0DH4SYbQzIobx/YW8PjQUJt8KQdKMcwwi7arHP7A/Ha
|
||||
LKu8eIC2nsUBnP4NhkYSGhbmpJK+PFD0FVtD0ZIRlY/wsnaZNjWWcnWF1/FNuQ4H
|
||||
ySjIblqVQkPuzebv3Ror6ZnVDukn96Mg7kP4u6zgxOeqlJGRe1M949SS9Vudjl8X
|
||||
SF4aZUUB9pQGhsqQJVqaz2OlhGOp9D0q54xko/rekjAIcuDjl1mdX4F2WRrzpUmZ
|
||||
uY/bPeOBYiVsOYVe
|
||||
-----END CERTIFICATE-----
|
12
sample/soap/ssl/sslclient.rb
Normal file
12
sample/soap/ssl/sslclient.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
require 'http-access2'
|
||||
require 'soap/rpc/driver'
|
||||
|
||||
# setup driver
|
||||
url = "https://localhost:17443/"
|
||||
client = SOAP::RPC::Driver.new(url, 'urn:sslhelloworld')
|
||||
client.add_method("hello_world", "from")
|
||||
# load SSL properties
|
||||
client.loadproperty('files/sslclient.properties')
|
||||
|
||||
# SOAP over SSL
|
||||
p client.hello_world(__FILE__)
|
12
sample/soap/ssl/sslclient_require_noserverauth.rb
Normal file
12
sample/soap/ssl/sslclient_require_noserverauth.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
require 'http-access2'
|
||||
require 'soap/rpc/driver'
|
||||
|
||||
# setup driver
|
||||
url = "https://localhost:17443/"
|
||||
client = SOAP::RPC::Driver.new(url, 'urn:sslhelloworld')
|
||||
client.add_method("hello_world", "from")
|
||||
# load SSL properties
|
||||
client.loadproperty('files/sslclient_require_noserverauth.properties')
|
||||
|
||||
# SOAP over SSL
|
||||
p client.hello_world(__FILE__)
|
12
sample/soap/ssl/sslclient_with_clientauth.rb
Normal file
12
sample/soap/ssl/sslclient_with_clientauth.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
require 'http-access2'
|
||||
require 'soap/rpc/driver'
|
||||
|
||||
# setup driver
|
||||
url = "https://localhost:17443/"
|
||||
client = SOAP::RPC::Driver.new(url, 'urn:sslhelloworld')
|
||||
client.add_method("hello_world", "from")
|
||||
# load SSL properties
|
||||
client.loadproperty('files/sslclient_with_clientauth.properties')
|
||||
|
||||
# SOAP over SSL
|
||||
p client.hello_world(__FILE__)
|
49
sample/soap/ssl/sslserver.rb
Normal file
49
sample/soap/ssl/sslserver.rb
Normal file
|
@ -0,0 +1,49 @@
|
|||
require 'soap/rpc/httpserver'
|
||||
require 'webrick/https'
|
||||
require 'logger'
|
||||
|
||||
class HelloWorldServer < SOAP::RPC::HTTPServer
|
||||
private
|
||||
|
||||
def on_init
|
||||
@default_namespace = 'urn:sslhelloworld'
|
||||
add_method(self, 'hello_world', 'from')
|
||||
end
|
||||
|
||||
def hello_world(from)
|
||||
"Hello World, from #{ from }"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if $0 == __FILE__
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
def cert(filename)
|
||||
OpenSSL::X509::Certificate.new(File.open(File.join(DIR, filename)) { |f|
|
||||
f.read
|
||||
})
|
||||
end
|
||||
|
||||
def key(filename)
|
||||
OpenSSL::PKey::RSA.new(File.open(File.join(DIR, filename)) { |f|
|
||||
f.read
|
||||
})
|
||||
end
|
||||
|
||||
$server = HelloWorldServer.new(
|
||||
:BindAddress => "0.0.0.0",
|
||||
:Port => 17443,
|
||||
:AccessLog => [],
|
||||
:SSLEnable => true,
|
||||
:SSLCACertificateFile => File.join(DIR, 'files/ca.cert'),
|
||||
:SSLCertificate => cert('files/server.cert'),
|
||||
:SSLPrivateKey => key('files/server.key'),
|
||||
:SSLVerifyClient => nil,
|
||||
:SSLCertName => nil
|
||||
)
|
||||
trap(:INT) do
|
||||
$server.shutdown
|
||||
end
|
||||
$server.start
|
||||
end
|
45
sample/soap/ssl/sslserver_noauth.rb
Normal file
45
sample/soap/ssl/sslserver_noauth.rb
Normal file
|
@ -0,0 +1,45 @@
|
|||
require 'soap/rpc/httpserver'
|
||||
require 'webrick/https'
|
||||
require 'logger'
|
||||
|
||||
class HelloWorldServer < SOAP::RPC::HTTPServer
|
||||
private
|
||||
|
||||
def on_init
|
||||
@default_namespace = 'urn:sslhelloworld'
|
||||
add_method(self, 'hello_world', 'from')
|
||||
end
|
||||
|
||||
def hello_world(from)
|
||||
"Hello World, from #{ from }"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if $0 == __FILE__
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
def cert(filename)
|
||||
OpenSSL::X509::Certificate.new(File.open(File.join(DIR, filename)) { |f|
|
||||
f.read
|
||||
})
|
||||
end
|
||||
|
||||
def key(filename)
|
||||
OpenSSL::PKey::RSA.new(File.open(File.join(DIR, filename)) { |f|
|
||||
f.read
|
||||
})
|
||||
end
|
||||
|
||||
$server = HelloWorldServer.new(
|
||||
:BindAddress => "0.0.0.0",
|
||||
:Port => 17443,
|
||||
:AccessLog => [],
|
||||
:SSLEnable => true,
|
||||
:SSLCertName => [['OU', 'example'], ['CN', 'localhost']] # creates dummy certificate
|
||||
)
|
||||
trap(:INT) do
|
||||
$server.shutdown
|
||||
end
|
||||
$server.start
|
||||
end
|
50
sample/soap/ssl/sslserver_require_clientauth.rb
Normal file
50
sample/soap/ssl/sslserver_require_clientauth.rb
Normal file
|
@ -0,0 +1,50 @@
|
|||
require 'soap/rpc/httpserver'
|
||||
require 'webrick/https'
|
||||
require 'logger'
|
||||
|
||||
class HelloWorldServer < SOAP::RPC::HTTPServer
|
||||
private
|
||||
|
||||
def on_init
|
||||
@default_namespace = 'urn:sslhelloworld'
|
||||
add_method(self, 'hello_world', 'from')
|
||||
end
|
||||
|
||||
def hello_world(from)
|
||||
"Hello World, from #{ from }"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if $0 == __FILE__
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
def cert(filename)
|
||||
OpenSSL::X509::Certificate.new(File.open(File.join(DIR, filename)) { |f|
|
||||
f.read
|
||||
})
|
||||
end
|
||||
|
||||
def key(filename)
|
||||
OpenSSL::PKey::RSA.new(File.open(File.join(DIR, filename)) { |f|
|
||||
f.read
|
||||
})
|
||||
end
|
||||
|
||||
$server = HelloWorldServer.new(
|
||||
:BindAddress => "0.0.0.0",
|
||||
:Port => 17443,
|
||||
:AccessLog => [],
|
||||
:SSLEnable => true,
|
||||
:SSLCACertificateFile => File.join(DIR, 'files/ca.cert'),
|
||||
:SSLCertificate => cert('files/server.cert'),
|
||||
:SSLPrivateKey => key('files/server.key'),
|
||||
:SSLVerifyClient =>
|
||||
OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT|OpenSSL::SSL::VERIFY_PEER,
|
||||
:SSLClientCA => cert('files/ca.cert')
|
||||
)
|
||||
trap(:INT) do
|
||||
$server.shutdown
|
||||
end
|
||||
$server.start
|
||||
end
|
13
sample/soap/swa/client.rb
Normal file
13
sample/soap/swa/client.rb
Normal file
|
@ -0,0 +1,13 @@
|
|||
require 'soap/rpc/driver'
|
||||
require 'soap/attachment'
|
||||
|
||||
server = 'http://localhost:7000/'
|
||||
driver = SOAP::RPC::Driver.new(server, 'http://www.acmetron.com/soap')
|
||||
driver.wiredump_dev = STDERR
|
||||
driver.add_method('get_file')
|
||||
driver.add_method('put_file', 'name', 'file')
|
||||
|
||||
p driver.get_file
|
||||
file = File.open($0)
|
||||
attach = SOAP::Attachment.new(file)
|
||||
p driver.put_file($0, attach)
|
23
sample/soap/swa/server.rb
Normal file
23
sample/soap/swa/server.rb
Normal file
|
@ -0,0 +1,23 @@
|
|||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/attachment'
|
||||
|
||||
class SwAService
|
||||
def get_file
|
||||
return {
|
||||
'name' => $0,
|
||||
'file' => SOAP::Attachment.new(File.open($0))
|
||||
}
|
||||
end
|
||||
|
||||
def put_file(name, file)
|
||||
"File '#{name}' was received ok."
|
||||
end
|
||||
end
|
||||
|
||||
server = SOAP::RPC::StandaloneServer.new('SwAServer',
|
||||
'http://www.acmetron.com/soap', '0.0.0.0', 7000)
|
||||
server.add_servant(SwAService.new)
|
||||
trap(:INT) do
|
||||
server.shutdown
|
||||
end
|
||||
server.start
|
14
sample/soap/whois.rb
Normal file
14
sample/soap/whois.rb
Normal file
|
@ -0,0 +1,14 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
key = ARGV.shift
|
||||
|
||||
require 'soap/rpc/driver'
|
||||
|
||||
server = 'http://www.SoapClient.com/xml/SQLDataSoap.WSDL'
|
||||
interface = 'http://www.SoapClient.com/xml/SQLDataSoap.xsd'
|
||||
|
||||
whois = SOAP::RPC::Driver.new(server, interface)
|
||||
whois.wiredump_dev = STDERR
|
||||
whois.add_method('ProcessSRL', 'SRLFile', 'RequestName', 'key')
|
||||
|
||||
p whois.ProcessSRL('WHOIS.SRI', 'whois', key)
|
332
sample/wsdl/raa2.4/raa.rb
Normal file
332
sample/wsdl/raa2.4/raa.rb
Normal file
|
@ -0,0 +1,332 @@
|
|||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class Gem
|
||||
@@schema_type = "Gem"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
|
||||
def id
|
||||
@id
|
||||
end
|
||||
|
||||
def id=(value)
|
||||
@id = value
|
||||
end
|
||||
|
||||
def category
|
||||
@category
|
||||
end
|
||||
|
||||
def category=(value)
|
||||
@category = value
|
||||
end
|
||||
|
||||
def owner
|
||||
@owner
|
||||
end
|
||||
|
||||
def owner=(value)
|
||||
@owner = value
|
||||
end
|
||||
|
||||
def project
|
||||
@project
|
||||
end
|
||||
|
||||
def project=(value)
|
||||
@project = value
|
||||
end
|
||||
|
||||
def updated
|
||||
@updated
|
||||
end
|
||||
|
||||
def updated=(value)
|
||||
@updated = value
|
||||
end
|
||||
|
||||
def created
|
||||
@created
|
||||
end
|
||||
|
||||
def created=(value)
|
||||
@created = value
|
||||
end
|
||||
|
||||
def initialize(id = nil,
|
||||
category = nil,
|
||||
owner = nil,
|
||||
project = nil,
|
||||
updated = nil,
|
||||
created = nil)
|
||||
@id = id
|
||||
@category = category
|
||||
@owner = owner
|
||||
@project = project
|
||||
@updated = updated
|
||||
@created = created
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class Category
|
||||
@@schema_type = "Category"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
|
||||
def major
|
||||
@major
|
||||
end
|
||||
|
||||
def major=(value)
|
||||
@major = value
|
||||
end
|
||||
|
||||
def minor
|
||||
@minor
|
||||
end
|
||||
|
||||
def minor=(value)
|
||||
@minor = value
|
||||
end
|
||||
|
||||
def initialize(major = nil,
|
||||
minor = nil)
|
||||
@major = major
|
||||
@minor = minor
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class Owner
|
||||
@@schema_type = "Owner"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
|
||||
def id
|
||||
@id
|
||||
end
|
||||
|
||||
def id=(value)
|
||||
@id = value
|
||||
end
|
||||
|
||||
def email
|
||||
@email
|
||||
end
|
||||
|
||||
def email=(value)
|
||||
@email = value
|
||||
end
|
||||
|
||||
def name
|
||||
@name
|
||||
end
|
||||
|
||||
def name=(value)
|
||||
@name = value
|
||||
end
|
||||
|
||||
def initialize(id = nil,
|
||||
email = nil,
|
||||
name = nil)
|
||||
@id = id
|
||||
@email = email
|
||||
@name = name
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class Project
|
||||
@@schema_type = "Project"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
|
||||
def name
|
||||
@name
|
||||
end
|
||||
|
||||
def name=(value)
|
||||
@name = value
|
||||
end
|
||||
|
||||
def short_description
|
||||
@short_description
|
||||
end
|
||||
|
||||
def short_description=(value)
|
||||
@short_description = value
|
||||
end
|
||||
|
||||
def version
|
||||
@version
|
||||
end
|
||||
|
||||
def version=(value)
|
||||
@version = value
|
||||
end
|
||||
|
||||
def status
|
||||
@status
|
||||
end
|
||||
|
||||
def status=(value)
|
||||
@status = value
|
||||
end
|
||||
|
||||
def url
|
||||
@url
|
||||
end
|
||||
|
||||
def url=(value)
|
||||
@url = value
|
||||
end
|
||||
|
||||
def download
|
||||
@download
|
||||
end
|
||||
|
||||
def download=(value)
|
||||
@download = value
|
||||
end
|
||||
|
||||
def license
|
||||
@license
|
||||
end
|
||||
|
||||
def license=(value)
|
||||
@license = value
|
||||
end
|
||||
|
||||
def description
|
||||
@description
|
||||
end
|
||||
|
||||
def description=(value)
|
||||
@description = value
|
||||
end
|
||||
|
||||
def updated
|
||||
@updated
|
||||
end
|
||||
|
||||
def updated=(value)
|
||||
@updated = value
|
||||
end
|
||||
|
||||
def history
|
||||
@history
|
||||
end
|
||||
|
||||
def history=(value)
|
||||
@history = value
|
||||
end
|
||||
|
||||
def dependency
|
||||
@dependency
|
||||
end
|
||||
|
||||
def dependency=(value)
|
||||
@dependency = value
|
||||
end
|
||||
|
||||
def initialize(name = nil,
|
||||
short_description = nil,
|
||||
version = nil,
|
||||
status = nil,
|
||||
url = nil,
|
||||
download = nil,
|
||||
license = nil,
|
||||
description = nil,
|
||||
updated = nil,
|
||||
history = nil,
|
||||
dependency = nil)
|
||||
@name = name
|
||||
@short_description = short_description
|
||||
@version = version
|
||||
@status = status
|
||||
@url = url
|
||||
@download = download
|
||||
@license = license
|
||||
@description = description
|
||||
@updated = updated
|
||||
@history = history
|
||||
@dependency = dependency
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class ProjectDependency
|
||||
@@schema_type = "ProjectDependency"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
|
||||
def project
|
||||
@project
|
||||
end
|
||||
|
||||
def project=(value)
|
||||
@project = value
|
||||
end
|
||||
|
||||
def version
|
||||
@version
|
||||
end
|
||||
|
||||
def version=(value)
|
||||
@version = value
|
||||
end
|
||||
|
||||
def description
|
||||
@description
|
||||
end
|
||||
|
||||
def description=(value)
|
||||
@description = value
|
||||
end
|
||||
|
||||
def initialize(project = nil,
|
||||
version = nil,
|
||||
description = nil)
|
||||
@project = project
|
||||
@version = version
|
||||
@description = description
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class GemArray < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "GemArray"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class OwnerArray < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "OwnerArray"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class ProjectArray < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "ProjectArray"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class ProjectDependencyArray < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "ProjectDependencyArray"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
end
|
||||
|
||||
# http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/
|
||||
class StringArray < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "StringArray"
|
||||
@@schema_ns = "http://www.ruby-lang.org/xmlns/soap/type/RAA/0.0.3/"
|
||||
end
|
||||
|
||||
# http://xml.apache.org/xml-soap
|
||||
class Map < Array
|
||||
# Contents type should be dumped here...
|
||||
@@schema_type = "Map"
|
||||
@@schema_ns = "http://xml.apache.org/xml-soap"
|
||||
end
|
||||
|
117
sample/wsdl/raa2.4/wsdlDriver.rb
Normal file
117
sample/wsdl/raa2.4/wsdlDriver.rb
Normal file
|
@ -0,0 +1,117 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
# You can generate raa.rb required here with the command;
|
||||
# wsdl2ruby.rb --wsdl http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/ --classdef
|
||||
require 'raa'
|
||||
require 'soap/wsdlDriver'
|
||||
require 'pp'
|
||||
|
||||
RAA_WSDL = 'http://www.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/'
|
||||
|
||||
raa = SOAP::WSDLDriverFactory.new(RAA_WSDL).create_driver
|
||||
raa.generate_explicit_type = true
|
||||
# raa.wiredump_dev = STDERR
|
||||
|
||||
def sec(msg)
|
||||
puts
|
||||
puts "--------"
|
||||
puts "-- " + msg
|
||||
puts
|
||||
end
|
||||
|
||||
def subsec(msg)
|
||||
puts "-- " + msg
|
||||
end
|
||||
|
||||
sec("retrieve a gem (RAA Information) which has specified name")
|
||||
name = 'soap4r'
|
||||
pp raa.gem(name)
|
||||
|
||||
sec("retrieve dependents of the project")
|
||||
name = 'http-access2'; version = nil
|
||||
pp raa.dependents(name, version)
|
||||
|
||||
sec("number of registered gems")
|
||||
puts raa.size
|
||||
|
||||
sec("retrieve all registered gem names")
|
||||
p raa.names
|
||||
|
||||
sec("retrieve gems of specified category")
|
||||
major = 'Library'; minor = 'XML'
|
||||
p raa.list_by_category(major, minor)
|
||||
|
||||
sec("retrieve category tree")
|
||||
pp raa.tree_by_category
|
||||
|
||||
sec("retrieve gems which is updated recently")
|
||||
idx = 0
|
||||
p raa.list_recent_updated(idx)
|
||||
subsec("next 10 gems")
|
||||
idx += 1
|
||||
p raa.list_recent_updated(idx)
|
||||
subsec("next 10 gems")
|
||||
idx += 1
|
||||
p raa.list_recent_updated(idx)
|
||||
|
||||
sec("retrieve gems which is created recently")
|
||||
p raa.list_recent_created(idx)
|
||||
|
||||
sec("retrieve gems which is updated in 7 days")
|
||||
date = Time.now - 7 * 24 * 60 * 60; idx = 0
|
||||
p raa.list_updated_since(date, idx)
|
||||
|
||||
sec("retrieve gems which is created in 7 days")
|
||||
p raa.list_created_since(date, idx)
|
||||
|
||||
sec("retrieve gems of specified owner")
|
||||
owner_id = 8 # NaHi
|
||||
p raa.list_by_owner(owner_id)
|
||||
|
||||
sec("search gems with keyword")
|
||||
substring = 'soap'
|
||||
pp raa.search(substring)
|
||||
|
||||
# There are several search interface to search a field explicitly.
|
||||
# puts raa.search_name(substring, idx)
|
||||
# puts raa.search_short_description(substring, idx)
|
||||
# puts raa.search_owner(substring, idx)
|
||||
# puts raa.search_version(substring, idx)
|
||||
# puts raa.search_status(substring, idx)
|
||||
# puts raa.search_description(substring, idx)
|
||||
|
||||
sec("retrieve owner info")
|
||||
owner_id = 8
|
||||
pp raa.owner(owner_id)
|
||||
|
||||
sec("retrieve owners")
|
||||
idx = 0
|
||||
p raa.list_owner(idx)
|
||||
|
||||
sec("update 'sampleproject'")
|
||||
name = 'sampleproject'
|
||||
pass = 'sampleproject'
|
||||
gem = raa.gem(name)
|
||||
p gem.project.version
|
||||
gem.project.version.succ!
|
||||
gem.updated = Time.now
|
||||
raa.update(name, pass, gem)
|
||||
p raa.gem(name).project.version
|
||||
|
||||
sec("update pass phrase")
|
||||
raa.update_pass(name, 'sampleproject', 'foo')
|
||||
subsec("update check")
|
||||
gem = raa.gem(name)
|
||||
gem.project.description = 'Current pass phrase is "foo"'
|
||||
gem.updated = Time.now
|
||||
raa.update(name, 'foo', gem)
|
||||
#
|
||||
subsec("recover pass phrase")
|
||||
raa.update_pass(name, 'foo', 'sampleproject')
|
||||
subsec("update check")
|
||||
gem = raa.gem(name)
|
||||
gem.project.description = 'Current pass phrase is "sampleproject"'
|
||||
gem.updated = Time.now
|
||||
raa.update(name, 'sampleproject', gem)
|
||||
|
||||
sec("done")
|
119
test/soap/header/server.cgi
Normal file
119
test/soap/header/server.cgi
Normal file
|
@ -0,0 +1,119 @@
|
|||
require 'pstore'
|
||||
require 'soap/rpc/cgistub'
|
||||
require 'soap/header/simplehandler'
|
||||
|
||||
|
||||
class AuthHeaderPortServer < SOAP::RPC::CGIStub
|
||||
PortName = 'http://tempuri.org/authHeaderPort'
|
||||
SupportPortName = 'http://tempuri.org/authHeaderSupportPort'
|
||||
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
||||
SessionDB = File.join(File.expand_path(File.dirname(__FILE__)), 'session.pstoredb')
|
||||
|
||||
class AuthHeaderService
|
||||
def self.create
|
||||
new
|
||||
end
|
||||
|
||||
def deposit(amt)
|
||||
"deposit #{amt} OK"
|
||||
end
|
||||
|
||||
def withdrawal(amt)
|
||||
"withdrawal #{amt} OK"
|
||||
end
|
||||
end
|
||||
|
||||
class AuthHeaderSupportService
|
||||
def delete_sessiondb
|
||||
File.unlink(SessionDB) if File.file?(SessionDB)
|
||||
backup = SessionDB + "~"
|
||||
File.unlink(backup) if File.file?(backup)
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(*arg)
|
||||
super
|
||||
add_rpc_servant(AuthHeaderService.new, PortName)
|
||||
add_rpc_servant(AuthHeaderSupportService.new, SupportPortName)
|
||||
add_rpc_headerhandler(ServerAuthHeaderHandler.new)
|
||||
end
|
||||
|
||||
class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler
|
||||
Users = {
|
||||
'NaHi' => 'passwd',
|
||||
'HiNa' => 'wspass'
|
||||
}
|
||||
|
||||
def initialize
|
||||
super(MyHeaderName)
|
||||
@db = PStore.new(SessionDB)
|
||||
@db.transaction do
|
||||
@db["root"] = {} unless @db.root?("root")
|
||||
end
|
||||
@userid = @sessionid = nil
|
||||
end
|
||||
|
||||
def login(userid, passwd)
|
||||
userid and passwd and Users[userid] == passwd
|
||||
end
|
||||
|
||||
def auth(sessionid)
|
||||
in_sessiondb do |root|
|
||||
root[sessionid][0]
|
||||
end
|
||||
end
|
||||
|
||||
def create_session(userid)
|
||||
in_sessiondb do |root|
|
||||
while true
|
||||
key = create_sessionkey
|
||||
break unless root[key]
|
||||
end
|
||||
root[key] = [userid]
|
||||
key
|
||||
end
|
||||
end
|
||||
|
||||
def destroy_session(sessionkey)
|
||||
in_sessiondb do |root|
|
||||
root.delete(sessionkey)
|
||||
end
|
||||
end
|
||||
|
||||
def on_simple_outbound
|
||||
{ "sessionid" => @sessionid }
|
||||
end
|
||||
|
||||
def on_simple_inbound(my_header, mu)
|
||||
auth = false
|
||||
userid = my_header["userid"]
|
||||
passwd = my_header["passwd"]
|
||||
if login(userid, passwd)
|
||||
auth = true
|
||||
elsif sessionid = my_header["sessionid"]
|
||||
if userid = auth(sessionid)
|
||||
destroy_session(sessionid)
|
||||
auth = true
|
||||
end
|
||||
end
|
||||
raise RuntimeError.new("authentication failed") unless auth
|
||||
@userid = userid
|
||||
@sessionid = create_session(userid)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_sessionkey
|
||||
Time.now.usec.to_s
|
||||
end
|
||||
|
||||
def in_sessiondb
|
||||
@db.transaction do
|
||||
yield(@db["root"])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
status = AuthHeaderPortServer.new('AuthHeaderPortServer', nil).start
|
247
test/soap/header/test_authheader.rb
Normal file
247
test/soap/header/test_authheader.rb
Normal file
|
@ -0,0 +1,247 @@
|
|||
require 'test/unit'
|
||||
require 'soap/rpc/driver'
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/header/simplehandler'
|
||||
|
||||
|
||||
module SOAP
|
||||
module Header
|
||||
|
||||
|
||||
class TestAuthHeader < Test::Unit::TestCase
|
||||
Port = 17171
|
||||
PortName = 'http://tempuri.org/authHeaderPort'
|
||||
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
||||
DummyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "dummy")
|
||||
|
||||
class AuthHeaderPortServer < SOAP::RPC::StandaloneServer
|
||||
class AuthHeaderService
|
||||
def self.create
|
||||
new
|
||||
end
|
||||
|
||||
def deposit(amt)
|
||||
"deposit #{amt} OK"
|
||||
end
|
||||
|
||||
def withdrawal(amt)
|
||||
"withdrawal #{amt} OK"
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(*arg)
|
||||
super
|
||||
add_rpc_servant(AuthHeaderService.new, PortName)
|
||||
ServerAuthHeaderHandler.init
|
||||
add_rpc_request_headerhandler(ServerAuthHeaderHandler)
|
||||
end
|
||||
|
||||
class ServerAuthHeaderHandler < SOAP::Header::SimpleHandler
|
||||
class << self
|
||||
def create
|
||||
new
|
||||
end
|
||||
|
||||
def init
|
||||
@users = {
|
||||
'NaHi' => 'passwd',
|
||||
'HiNa' => 'wspass'
|
||||
}
|
||||
@sessions = {}
|
||||
end
|
||||
|
||||
def login(userid, passwd)
|
||||
userid and passwd and @users[userid] == passwd
|
||||
end
|
||||
|
||||
def auth(sessionid)
|
||||
@sessions[sessionid][0]
|
||||
end
|
||||
|
||||
def create_session(userid)
|
||||
while true
|
||||
key = create_sessionkey
|
||||
break unless @sessions[key]
|
||||
end
|
||||
@sessions[key] = [userid]
|
||||
key
|
||||
end
|
||||
|
||||
def destroy_session(sessionkey)
|
||||
@sessions.delete(sessionkey)
|
||||
end
|
||||
|
||||
def sessions
|
||||
@sessions
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_sessionkey
|
||||
Time.now.usec.to_s
|
||||
end
|
||||
end
|
||||
|
||||
def initialize
|
||||
super(MyHeaderName)
|
||||
@userid = @sessionid = nil
|
||||
end
|
||||
|
||||
def on_simple_outbound
|
||||
{ "sessionid" => @sessionid }
|
||||
end
|
||||
|
||||
def on_simple_inbound(my_header, mu)
|
||||
auth = false
|
||||
userid = my_header["userid"]
|
||||
passwd = my_header["passwd"]
|
||||
if self.class.login(userid, passwd)
|
||||
auth = true
|
||||
elsif sessionid = my_header["sessionid"]
|
||||
if userid = self.class.auth(sessionid)
|
||||
self.class.destroy_session(sessionid)
|
||||
auth = true
|
||||
end
|
||||
end
|
||||
raise RuntimeError.new("authentication failed") unless auth
|
||||
@userid = userid
|
||||
@sessionid = self.class.create_session(userid)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
|
||||
def initialize(userid, passwd, mustunderstand)
|
||||
super(MyHeaderName)
|
||||
@sessionid = nil
|
||||
@userid = userid
|
||||
@passwd = passwd
|
||||
@mustunderstand = mustunderstand
|
||||
end
|
||||
|
||||
def on_simple_outbound
|
||||
if @sessionid
|
||||
{ "sessionid" => @sessionid }
|
||||
else
|
||||
{ "userid" => @userid, "passwd" => @passwd }
|
||||
end
|
||||
end
|
||||
|
||||
def on_simple_inbound(my_header, mustunderstand)
|
||||
@sessionid = my_header["sessionid"]
|
||||
end
|
||||
|
||||
def sessionid
|
||||
@sessionid
|
||||
end
|
||||
end
|
||||
|
||||
class DummyHeaderHandler < SOAP::Header::SimpleHandler
|
||||
def initialize(mustunderstand)
|
||||
super(DummyHeaderName)
|
||||
@mustunderstand = mustunderstand
|
||||
end
|
||||
|
||||
def on_simple_outbound
|
||||
{ XSD::QName.new("foo", "bar") => nil }
|
||||
end
|
||||
|
||||
def on_simple_inbound(my_header, mustunderstand)
|
||||
end
|
||||
end
|
||||
|
||||
def setup
|
||||
@endpoint = "http://localhost:#{Port}/"
|
||||
setup_server
|
||||
setup_client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = AuthHeaderPortServer.new(self.class.name, nil, '0.0.0.0', Port)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@t = Thread.new {
|
||||
@server.start
|
||||
}
|
||||
while @server.status != :Running
|
||||
sleep 0.1
|
||||
unless @t.alive?
|
||||
@t.join
|
||||
raise
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def setup_client
|
||||
@client = SOAP::RPC::Driver.new(@endpoint, PortName)
|
||||
@client.wiredump_dev = STDERR if $DEBUG
|
||||
@client.add_method('deposit', 'amt')
|
||||
@client.add_method('withdrawal', 'amt')
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
teardown_client
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@t.kill
|
||||
@t.join
|
||||
end
|
||||
|
||||
def teardown_client
|
||||
@client.reset_stream
|
||||
end
|
||||
|
||||
def test_success_no_mu
|
||||
h = ClientAuthHeaderHandler.new('NaHi', 'passwd', false)
|
||||
@client.headerhandler << h
|
||||
do_transaction_check(h)
|
||||
end
|
||||
|
||||
def test_success_mu
|
||||
h = ClientAuthHeaderHandler.new('NaHi', 'passwd', true)
|
||||
@client.headerhandler << h
|
||||
do_transaction_check(h)
|
||||
end
|
||||
|
||||
def test_no_mu
|
||||
h = ClientAuthHeaderHandler.new('NaHi', 'passwd', true)
|
||||
@client.headerhandler << h
|
||||
@client.headerhandler << DummyHeaderHandler.new(false)
|
||||
do_transaction_check(h)
|
||||
end
|
||||
|
||||
def test_mu
|
||||
h = ClientAuthHeaderHandler.new('NaHi', 'passwd', true)
|
||||
@client.headerhandler << h
|
||||
@client.headerhandler << (h2 = DummyHeaderHandler.new(true))
|
||||
assert_raise(SOAP::UnhandledMustUnderstandHeaderError) do
|
||||
assert_equal("deposit 150 OK", @client.deposit(150))
|
||||
end
|
||||
@client.headerhandler.delete(h2)
|
||||
@client.headerhandler << (h2 = DummyHeaderHandler.new(false))
|
||||
do_transaction_check(h)
|
||||
end
|
||||
|
||||
def do_transaction_check(h)
|
||||
assert_equal("deposit 150 OK", @client.deposit(150))
|
||||
serversess = AuthHeaderPortServer::ServerAuthHeaderHandler.sessions[h.sessionid]
|
||||
assert_equal("NaHi", serversess[0])
|
||||
assert_equal("withdrawal 120 OK", @client.withdrawal(120))
|
||||
serversess = AuthHeaderPortServer::ServerAuthHeaderHandler.sessions[h.sessionid]
|
||||
assert_equal("NaHi", serversess[0])
|
||||
end
|
||||
|
||||
def test_authfailure
|
||||
h = ClientAuthHeaderHandler.new('NaHi', 'pa', false)
|
||||
@client.headerhandler << h
|
||||
assert_raises(RuntimeError) do
|
||||
@client.deposit(150)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
128
test/soap/header/test_authheader_cgi.rb
Normal file
128
test/soap/header/test_authheader_cgi.rb
Normal file
|
@ -0,0 +1,128 @@
|
|||
require 'test/unit'
|
||||
require 'soap/rpc/driver'
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/header/simplehandler'
|
||||
require 'logger'
|
||||
require 'webrick'
|
||||
require 'rbconfig'
|
||||
|
||||
|
||||
module SOAP
|
||||
module Header
|
||||
|
||||
|
||||
class TestAuthHeaderCGI < Test::Unit::TestCase
|
||||
# This test shuld be run after installing ruby.
|
||||
RUBYBIN = File.join(
|
||||
Config::CONFIG["bindir"],
|
||||
Config::CONFIG["ruby_install_name"] + Config::CONFIG["EXEEXT"]
|
||||
)
|
||||
RUBYBIN << " -d" if $DEBUG
|
||||
|
||||
Port = 17171
|
||||
PortName = 'http://tempuri.org/authHeaderPort'
|
||||
SupportPortName = 'http://tempuri.org/authHeaderSupportPort'
|
||||
MyHeaderName = XSD::QName.new("http://tempuri.org/authHeader", "auth")
|
||||
|
||||
class ClientAuthHeaderHandler < SOAP::Header::SimpleHandler
|
||||
def initialize(userid, passwd)
|
||||
super(MyHeaderName)
|
||||
@sessionid = nil
|
||||
@userid = userid
|
||||
@passwd = passwd
|
||||
end
|
||||
|
||||
def on_simple_outbound
|
||||
if @sessionid
|
||||
{ "sessionid" => @sessionid }
|
||||
else
|
||||
{ "userid" => @userid, "passwd" => @passwd }
|
||||
end
|
||||
end
|
||||
|
||||
def on_simple_inbound(my_header, mustunderstand)
|
||||
@sessionid = my_header["sessionid"]
|
||||
end
|
||||
|
||||
def sessionid
|
||||
@sessionid
|
||||
end
|
||||
end
|
||||
|
||||
def setup
|
||||
@endpoint = "http://localhost:#{Port}/"
|
||||
setup_server
|
||||
setup_client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@endpoint = "http://localhost:#{Port}/server.cgi"
|
||||
logger = Logger.new(STDERR)
|
||||
logger.level = Logger::Severity::ERROR
|
||||
@server = WEBrick::HTTPServer.new(
|
||||
:BindAddress => "0.0.0.0",
|
||||
:Logger => logger,
|
||||
:Port => Port,
|
||||
:AccessLog => [],
|
||||
:DocumentRoot => File.dirname(File.expand_path(__FILE__)),
|
||||
:CGIPathEnv => ENV['PATH'],
|
||||
:CGIInterpreter => RUBYBIN
|
||||
)
|
||||
@t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
@server.start
|
||||
}
|
||||
while @server.status != :Running
|
||||
sleep 0.1
|
||||
unless @t.alive?
|
||||
@t.join
|
||||
raise
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def setup_client
|
||||
@client = SOAP::RPC::Driver.new(@endpoint, PortName)
|
||||
@client.wiredump_dev = STDERR if $DEBUG
|
||||
@client.add_method('deposit', 'amt')
|
||||
@client.add_method('withdrawal', 'amt')
|
||||
@supportclient = SOAP::RPC::Driver.new(@endpoint, SupportPortName)
|
||||
@supportclient.add_method('delete_sessiondb')
|
||||
end
|
||||
|
||||
def teardown
|
||||
@supportclient.delete_sessiondb
|
||||
teardown_server
|
||||
teardown_client
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@t.kill
|
||||
@t.join
|
||||
end
|
||||
|
||||
def teardown_client
|
||||
@client.reset_stream
|
||||
@supportclient.reset_stream
|
||||
end
|
||||
|
||||
def test_success
|
||||
h = ClientAuthHeaderHandler.new('NaHi', 'passwd')
|
||||
@client.headerhandler << h
|
||||
assert_equal("deposit 150 OK", @client.deposit(150))
|
||||
assert_equal("withdrawal 120 OK", @client.withdrawal(120))
|
||||
end
|
||||
|
||||
def test_authfailure
|
||||
h = ClientAuthHeaderHandler.new('NaHi', 'pa')
|
||||
@client.headerhandler << h
|
||||
assert_raises(RuntimeError) do
|
||||
@client.deposit(150)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
1
test/soap/ssl/README
Normal file
1
test/soap/ssl/README
Normal file
|
@ -0,0 +1 @@
|
|||
* certificates and keys in this directory is copied from http-access2 test.
|
23
test/soap/ssl/ca.cert
Normal file
23
test/soap/ssl/ca.cert
Normal file
|
@ -0,0 +1,23 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIID0DCCArigAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
|
||||
MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
|
||||
DTA0MDEzMDAwNDIzMloXDTM2MDEyMjAwNDIzMlowPDELMAkGA1UEBgwCSlAxEjAQ
|
||||
BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQswCQYDVQQDDAJDQTCCASIw
|
||||
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANbv0x42BTKFEQOE+KJ2XmiSdZpR
|
||||
wjzQLAkPLRnLB98tlzs4xo+y4RyY/rd5TT9UzBJTIhP8CJi5GbS1oXEerQXB3P0d
|
||||
L5oSSMwGGyuIzgZe5+vZ1kgzQxMEKMMKlzA73rbMd4Jx3u5+jdbP0EDrPYfXSvLY
|
||||
bS04n2aX7zrN3x5KdDrNBfwBio2/qeaaj4+9OxnwRvYP3WOvqdW0h329eMfHw0pi
|
||||
JI0drIVdsEqClUV4pebT/F+CPUPkEh/weySgo9wANockkYu5ujw2GbLFcO5LXxxm
|
||||
dEfcVr3r6t6zOA4bJwL0W/e6LBcrwiG/qPDFErhwtgTLYf6Er67SzLyA66UCAwEA
|
||||
AaOB3DCB2TAPBgNVHRMBAf8EBTADAQH/MDEGCWCGSAGG+EIBDQQkFiJSdWJ5L09w
|
||||
ZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRJ7Xd380KzBV7f
|
||||
USKIQ+O/vKbhDzAOBgNVHQ8BAf8EBAMCAQYwZAYDVR0jBF0wW4AUSe13d/NCswVe
|
||||
31EiiEPjv7ym4Q+hQKQ+MDwxCzAJBgNVBAYMAkpQMRIwEAYDVQQKDAlKSU4uR1Iu
|
||||
SlAxDDAKBgNVBAsMA1JSUjELMAkGA1UEAwwCQ0GCAQAwDQYJKoZIhvcNAQEFBQAD
|
||||
ggEBAIu/mfiez5XN5tn2jScgShPgHEFJBR0BTJBZF6xCk0jyqNx/g9HMj2ELCuK+
|
||||
r/Y7KFW5c5M3AQ+xWW0ZSc4kvzyTcV7yTVIwj2jZ9ddYMN3nupZFgBK1GB4Y05GY
|
||||
MJJFRkSu6d/Ph5ypzBVw2YMT/nsOo5VwMUGLgS7YVjU+u/HNWz80J3oO17mNZllj
|
||||
PvORJcnjwlroDnS58KoJ7GDgejv3ESWADvX1OHLE4cRkiQGeLoEU4pxdCxXRqX0U
|
||||
PbwIkZN9mXVcrmPHq8MWi4eC/V7hnbZETMHuWhUoiNdOEfsAXr3iP4KjyyRdwc7a
|
||||
d/xgcK06UVQRL/HbEYGiQL056mc=
|
||||
-----END CERTIFICATE-----
|
19
test/soap/ssl/client.cert
Normal file
19
test/soap/ssl/client.cert
Normal file
|
@ -0,0 +1,19 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIDKDCCAhCgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
|
||||
MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
|
||||
DTA0MDEzMTAzMTQ1OFoXDTM1MDEyMzAzMTQ1OFowZTELMAkGA1UEBgwCSlAxEjAQ
|
||||
BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRAwDgYDVQQDDAdleGFtcGxl
|
||||
MSIwIAYJKoZIhvcNAQkBDBNleGFtcGxlQGV4YW1wbGUub3JnMIGfMA0GCSqGSIb3
|
||||
DQEBAQUAA4GNADCBiQKBgQDRWssrK8Gyr+500hpLjCGR3+AHL8/hEJM5zKi/MgLW
|
||||
jTkvsgOwbYwXOiNtAbR9y4/ucDq7EY+cMUMHES4uFaPTcOaAV0aZRmk8AgslN1tQ
|
||||
gNS6ew7/Luq3DcVeWkX8PYgR9VG0mD1MPfJ6+IFA5d3vKpdBkBgN4l46jjO0/2Xf
|
||||
ewIDAQABo4GPMIGMMAwGA1UdEwEB/wQCMAAwMQYJYIZIAYb4QgENBCQWIlJ1Ynkv
|
||||
T3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFOFvay0H7lr2
|
||||
xUx6waYEV2bVDYQhMAsGA1UdDwQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYI
|
||||
KwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBABd2dYWqbDIWf5sWFvslezxJv8gI
|
||||
w64KCJBuyJAiDuf+oazr3016kMzAlt97KecLZDusGNagPrq02UX7YMoQFsWJBans
|
||||
cDtHrkM0al5r6/WGexNMgtYbNTYzt/IwodISGBgZ6dsOuhznwms+IBsTNDAvWeLP
|
||||
lt2tOqD8kEmjwMgn0GDRuKjs4EoboA3kMULb1p9akDV9ZESU3eOtpS5/G5J5msLI
|
||||
9WXbYBjcjvkLuJH9VsJhb+R58Vl0ViemvAHhPilSl1SPWVunGhv6FcIkdBEi1k9F
|
||||
e8BNMmsEjFiANiIRvpdLRbiGBt0KrKTndVfsmoKCvY48oCOvnzxtahFxfs8=
|
||||
-----END CERTIFICATE-----
|
15
test/soap/ssl/client.key
Normal file
15
test/soap/ssl/client.key
Normal file
|
@ -0,0 +1,15 @@
|
|||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICWwIBAAKBgQDRWssrK8Gyr+500hpLjCGR3+AHL8/hEJM5zKi/MgLWjTkvsgOw
|
||||
bYwXOiNtAbR9y4/ucDq7EY+cMUMHES4uFaPTcOaAV0aZRmk8AgslN1tQgNS6ew7/
|
||||
Luq3DcVeWkX8PYgR9VG0mD1MPfJ6+IFA5d3vKpdBkBgN4l46jjO0/2XfewIDAQAB
|
||||
AoGAZcz8llWErtsV3QB9gNb3S/PNADGjqBFjReva8n3jG2k4sZSibpwWTwUaTNtT
|
||||
ZQgjSRKRvH1hk9XwffNAvXAQZNNkuj/16gO2oO45nyLj4dO365ujLptWnVIWDHOE
|
||||
uN0GeiZO+VzcCisT0WCq4tvtLeH8svrxzA8cbXIEyOK7NiECQQDwo2zPFyKAZ/Cu
|
||||
lDJ6zKT+RjfWwW7DgWzirAlTrt4ViMaW+IaDH29TmQpb4V4NuR3Xi+2Xl4oicu6S
|
||||
36TW9+/FAkEA3rgfOQJuLlWSnw1RTGwvnC816a/W7iYYY7B+0U4cDbfWl7IoXT4y
|
||||
M8nV/HESooviZLqBwzAYSoj3fFKYBKpGPwJAUO8GN5iWWA2dW3ooiDiv/X1sZmRk
|
||||
dojfMFWgRW747tEzya8Ivq0h6kH8w+5GjeMG8Gn1nRiwsulo6Ckj7dEx6QJACyui
|
||||
7UIQ8qP6GZ4aYMHgVW4Mvy7Bkeo5OO7GPYs0Xv/EdJFL8vlGnVBXOjUVoS9w6Gpu
|
||||
TbLg1QQvnX2rADjmEwJANxZO2GUkaWGsEif8aGW0x5g/IdaMGG27pTWk5zqix7P3
|
||||
1UDrdo/JOXhptovhRi06EppIxAxYmbh9vd9VN8Itlw==
|
||||
-----END RSA PRIVATE KEY-----
|
19
test/soap/ssl/server.cert
Normal file
19
test/soap/ssl/server.cert
Normal file
|
@ -0,0 +1,19 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIC/zCCAeegAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQGDAJKUDES
|
||||
MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxDjAMBgNVBAMMBVN1YkNB
|
||||
MB4XDTA0MDEzMTAzMTMxNloXDTMzMDEyMzAzMTMxNlowQzELMAkGA1UEBgwCSlAx
|
||||
EjAQBgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRIwEAYDVQQDDAlsb2Nh
|
||||
bGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANFJTxWqup3nV9dsJAku
|
||||
p+WaXnPNIzcpAA3qMGZDJTJsfa8Du7ZxTP0XJK5mETttBrn711cJxAuP3KjqnW9S
|
||||
vtZ9lY2sXJ6Zj62sN5LwG3VVe25dI28yR1EsbHjJ5Zjf9tmggMC6am52dxuHbt5/
|
||||
vHo4ngJuKE/U+eeGRivMn6gFAgMBAAGjgYUwgYIwDAYDVR0TAQH/BAIwADAxBglg
|
||||
hkgBhvhCAQ0EJBYiUnVieS9PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd
|
||||
BgNVHQ4EFgQUpZIyygD9JxFYHHOTEuWOLbCKfckwCwYDVR0PBAQDAgWgMBMGA1Ud
|
||||
JQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBBQUAA4IBAQBwAIj5SaBHaA5X31IP
|
||||
CFCJiep96awfp7RANO0cuUj+ZpGoFn9d6FXY0g+Eg5wAkCNIzZU5NHN9xsdOpnUo
|
||||
zIBbyTfQEPrge1CMWMvL6uGaoEXytq84VTitF/xBTky4KtTn6+es4/e7jrrzeUXQ
|
||||
RC46gkHObmDT91RkOEGjHLyld2328jo3DIN/VTHIryDeVHDWjY5dENwpwdkhhm60
|
||||
DR9IrNBbXWEe9emtguNXeN0iu1ux0lG1Hc6pWGQxMlRKNvGh0yZB9u5EVe38tOV0
|
||||
jQaoNyL7qzcQoXD3Dmbi1p0iRmg/+HngISsz8K7k7MBNVsSclztwgCzTZOBiVtkM
|
||||
rRlQ
|
||||
-----END CERTIFICATE-----
|
15
test/soap/ssl/server.key
Normal file
15
test/soap/ssl/server.key
Normal file
|
@ -0,0 +1,15 @@
|
|||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICXQIBAAKBgQDRSU8Vqrqd51fXbCQJLqflml5zzSM3KQAN6jBmQyUybH2vA7u2
|
||||
cUz9FySuZhE7bQa5+9dXCcQLj9yo6p1vUr7WfZWNrFyemY+trDeS8Bt1VXtuXSNv
|
||||
MkdRLGx4yeWY3/bZoIDAumpudncbh27ef7x6OJ4CbihP1PnnhkYrzJ+oBQIDAQAB
|
||||
AoGBAIf4CstW2ltQO7+XYGoex7Hh8s9lTSW/G2vu5Hbr1LTHy3fzAvdq8MvVR12O
|
||||
rk9fa+lU9vhzPc0NMB0GIDZ9GcHuhW5hD1Wg9OSCbTOkZDoH3CAFqonjh4Qfwv5W
|
||||
IPAFn9KHukdqGXkwEMdErsUaPTy9A1V/aROVEaAY+HJgq/eZAkEA/BP1QMV04WEZ
|
||||
Oynzz7/lLizJGGxp2AOvEVtqMoycA/Qk+zdKP8ufE0wbmCE3Qd6GoynavsHb6aGK
|
||||
gQobb8zDZwJBANSK6MrXlrZTtEaeZuyOB4mAmRzGzOUVkUyULUjEx2GDT93ujAma
|
||||
qm/2d3E+wXAkNSeRpjUmlQXy/2oSqnGvYbMCQQDRM+cYyEcGPUVpWpnj0shrF/QU
|
||||
9vSot/X1G775EMTyaw6+BtbyNxVgOIu2J+rqGbn3c+b85XqTXOPL0A2RLYkFAkAm
|
||||
syhSDtE9X55aoWsCNZY/vi+i4rvaFoQ/WleogVQAeGVpdo7/DK9t9YWoFBIqth0L
|
||||
mGSYFu9ZhvZkvQNV8eYrAkBJ+rOIaLDsmbrgkeDruH+B/9yrm4McDtQ/rgnOGYnH
|
||||
LjLpLLOrgUxqpzLWe++EwSLwK2//dHO+SPsQJ4xsyQJy
|
||||
-----END RSA PRIVATE KEY-----
|
56
test/soap/ssl/sslsvr.rb
Normal file
56
test/soap/ssl/sslsvr.rb
Normal file
|
@ -0,0 +1,56 @@
|
|||
require 'webrick/https'
|
||||
require 'logger'
|
||||
require 'rbconfig'
|
||||
|
||||
require 'soap/rpc/httpserver'
|
||||
|
||||
class HelloWorldServer < SOAP::RPC::HTTPServer
|
||||
private
|
||||
|
||||
def on_init
|
||||
self.level = Logger::Severity::FATAL
|
||||
@default_namespace = 'urn:ssltst'
|
||||
add_method(self, 'hello_world', 'from')
|
||||
end
|
||||
|
||||
def hello_world(from)
|
||||
"Hello World, from #{ from }"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if $0 == __FILE__
|
||||
PORT = 17171
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
def cert(filename)
|
||||
OpenSSL::X509::Certificate.new(File.open(File.join(DIR, filename)) { |f|
|
||||
f.read
|
||||
})
|
||||
end
|
||||
|
||||
def key(filename)
|
||||
OpenSSL::PKey::RSA.new(File.open(File.join(DIR, filename)) { |f|
|
||||
f.read
|
||||
})
|
||||
end
|
||||
|
||||
$server = HelloWorldServer.new(
|
||||
:BindAddress => "0.0.0.0",
|
||||
:Port => PORT,
|
||||
:AccessLog => [],
|
||||
:SSLEnable => true,
|
||||
:SSLCACertificateFile => File.join(DIR, 'ca.cert'),
|
||||
:SSLCertificate => cert('server.cert'),
|
||||
:SSLPrivateKey => key('server.key'),
|
||||
:SSLVerifyClient => nil, #OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT|OpenSSL::SSL::VERIFY_PEER,
|
||||
:SSLClientCA => cert('ca.cert'),
|
||||
:SSLCertName => nil
|
||||
)
|
||||
trap(:INT) do
|
||||
$server.shutdown if $server
|
||||
end
|
||||
STDOUT.sync = true
|
||||
STDOUT.puts $$
|
||||
$server.start
|
||||
end
|
21
test/soap/ssl/subca.cert
Normal file
21
test/soap/ssl/subca.cert
Normal file
|
@ -0,0 +1,21 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
|
||||
MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
|
||||
DTA0MDEzMDAwNDMyN1oXDTM1MDEyMjAwNDMyN1owPzELMAkGA1UEBgwCSlAxEjAQ
|
||||
BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQ4wDAYDVQQDDAVTdWJDQTCC
|
||||
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ0Ou7AyRcRXnB/kVHv/6kwe
|
||||
ANzgg/DyJfsAUqW90m7Lu1nqyug8gK0RBd77yU0w5HOAMHTVSdpjZK0g2sgx4Mb1
|
||||
d/213eL9TTl5MRVEChTvQr8q5DVG/8fxPPE7fMI8eOAzd98/NOAChk+80r4Sx7fC
|
||||
kGVEE1bKwY1MrUsUNjOY2d6t3M4HHV3HX1V8ShuKfsHxgCmLzdI8U+5CnQedFgkm
|
||||
3e+8tr8IX5RR1wA1Ifw9VadF7OdI/bGMzog/Q8XCLf+WPFjnK7Gcx6JFtzF6Gi4x
|
||||
4dp1Xl45JYiVvi9zQ132wu8A1pDHhiNgQviyzbP+UjcB/tsOpzBQF8abYzgEkWEC
|
||||
AwEAAaNyMHAwDwYDVR0TAQH/BAUwAwEB/zAxBglghkgBhvhCAQ0EJBYiUnVieS9P
|
||||
cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUlCjXWLsReYzH
|
||||
LzsxwVnCXmKoB/owCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCJ/OyN
|
||||
rT8Cq2Y+G2yA/L1EMRvvxwFBqxavqaqHl/6rwsIBFlB3zbqGA/0oec6MAVnYynq4
|
||||
c4AcHTjx3bQ/S4r2sNTZq0DH4SYbQzIobx/YW8PjQUJt8KQdKMcwwi7arHP7A/Ha
|
||||
LKu8eIC2nsUBnP4NhkYSGhbmpJK+PFD0FVtD0ZIRlY/wsnaZNjWWcnWF1/FNuQ4H
|
||||
ySjIblqVQkPuzebv3Ror6ZnVDukn96Mg7kP4u6zgxOeqlJGRe1M949SS9Vudjl8X
|
||||
SF4aZUUB9pQGhsqQJVqaz2OlhGOp9D0q54xko/rekjAIcuDjl1mdX4F2WRrzpUmZ
|
||||
uY/bPeOBYiVsOYVe
|
||||
-----END CERTIFICATE-----
|
212
test/soap/ssl/test_ssl.rb
Normal file
212
test/soap/ssl/test_ssl.rb
Normal file
|
@ -0,0 +1,212 @@
|
|||
require 'test/unit'
|
||||
begin
|
||||
require 'http-access2'
|
||||
rescue LoadError
|
||||
end
|
||||
require 'soap/rpc/driver'
|
||||
|
||||
if defined?(HTTPAccess2)
|
||||
|
||||
module SOAP; module SSL
|
||||
|
||||
|
||||
class TestSSL < Test::Unit::TestCase
|
||||
PORT = 17171
|
||||
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
require 'rbconfig'
|
||||
RUBY = File.join(
|
||||
Config::CONFIG["bindir"],
|
||||
Config::CONFIG["ruby_install_name"] + Config::CONFIG["EXEEXT"]
|
||||
)
|
||||
|
||||
def setup
|
||||
@url = "https://localhost:#{PORT}/hello"
|
||||
@serverpid = @client = nil
|
||||
@verify_callback_called = false
|
||||
setup_server
|
||||
setup_client
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_client
|
||||
teardown_server
|
||||
end
|
||||
|
||||
def streamhandler
|
||||
@client.instance_eval("@servant").instance_eval("@streamhandler").client
|
||||
end
|
||||
|
||||
def test_options
|
||||
cfg = streamhandler.ssl_config
|
||||
assert_nil(cfg.client_cert)
|
||||
assert_nil(cfg.client_key)
|
||||
assert_nil(cfg.client_ca)
|
||||
assert_equal(OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT, cfg.verify_mode)
|
||||
assert_nil(cfg.verify_callback)
|
||||
assert_nil(cfg.timeout)
|
||||
assert_equal(OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv2, cfg.options)
|
||||
assert_equal("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH", cfg.ciphers)
|
||||
assert_instance_of(OpenSSL::X509::Store, cfg.cert_store)
|
||||
# dummy call to ensure sslsvr initialization finished.
|
||||
assert_raise(OpenSSL::SSL::SSLError) do
|
||||
@client.hello_world("ssl client")
|
||||
end
|
||||
end
|
||||
|
||||
def test_verification
|
||||
cfg = @client.options
|
||||
cfg["protocol.http.ssl_config.verify_callback"] = method(:verify_callback).to_proc
|
||||
begin
|
||||
@verify_callback_called = false
|
||||
@client.hello_world("ssl client")
|
||||
assert(false)
|
||||
rescue OpenSSL::SSL::SSLError => ssle
|
||||
assert_equal("certificate verify failed", ssle.message)
|
||||
assert(@verify_callback_called)
|
||||
end
|
||||
#
|
||||
cfg["protocol.http.ssl_config.client_cert"] = File.join(DIR, "client.cert")
|
||||
cfg["protocol.http.ssl_config.client_key"] = File.join(DIR, "client.key")
|
||||
@verify_callback_called = false
|
||||
begin
|
||||
@client.hello_world("ssl client")
|
||||
assert(false)
|
||||
rescue OpenSSL::SSL::SSLError => ssle
|
||||
assert_equal("certificate verify failed", ssle.message)
|
||||
assert(@verify_callback_called)
|
||||
end
|
||||
#
|
||||
cfg["protocol.http.ssl_config.ca_file"] = File.join(DIR, "ca.cert")
|
||||
@verify_callback_called = false
|
||||
begin
|
||||
@client.hello_world("ssl client")
|
||||
assert(false)
|
||||
rescue OpenSSL::SSL::SSLError => ssle
|
||||
assert_equal("certificate verify failed", ssle.message)
|
||||
assert(@verify_callback_called)
|
||||
end
|
||||
#
|
||||
cfg["protocol.http.ssl_config.ca_file"] = File.join(DIR, "subca.cert")
|
||||
@verify_callback_called = false
|
||||
assert_equal("Hello World, from ssl client", @client.hello_world("ssl client"))
|
||||
assert(@verify_callback_called)
|
||||
#
|
||||
cfg["protocol.http.ssl_config.verify_depth"] = "1"
|
||||
@verify_callback_called = false
|
||||
begin
|
||||
@client.hello_world("ssl client")
|
||||
assert(false)
|
||||
rescue OpenSSL::SSL::SSLError => ssle
|
||||
assert_equal("certificate verify failed", ssle.message)
|
||||
assert(@verify_callback_called)
|
||||
end
|
||||
#
|
||||
cfg["protocol.http.ssl_config.verify_depth"] = ""
|
||||
cfg["protocol.http.ssl_config.cert_store"] = OpenSSL::X509::Store.new
|
||||
cfg["protocol.http.ssl_config.verify_mode"] = OpenSSL::SSL::VERIFY_PEER.to_s
|
||||
begin
|
||||
@client.hello_world("ssl client")
|
||||
assert(false)
|
||||
rescue OpenSSL::SSL::SSLError => ssle
|
||||
assert_equal("certificate verify failed", ssle.message)
|
||||
end
|
||||
#
|
||||
cfg["protocol.http.ssl_config.verify_mode"] = ""
|
||||
assert_equal("Hello World, from ssl client", @client.hello_world("ssl client"))
|
||||
end
|
||||
|
||||
def test_property
|
||||
testpropertyname = File.join(DIR, 'soapclient.properties')
|
||||
File.open(testpropertyname, "w") do |f|
|
||||
f <<<<__EOP__
|
||||
protocol.http.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
||||
# depth: 1 causes an error (intentional)
|
||||
protocol.http.ssl_config.verify_depth = 1
|
||||
protocol.http.ssl_config.client_cert = #{File.join(DIR, 'client.cert')}
|
||||
protocol.http.ssl_config.client_key = #{File.join(DIR, 'client.key')}
|
||||
protocol.http.ssl_config.ca_file = #{File.join(DIR, 'ca.cert')}
|
||||
protocol.http.ssl_config.ca_file = #{File.join(DIR, 'subca.cert')}
|
||||
protocol.http.ssl_config.ciphers = ALL
|
||||
__EOP__
|
||||
end
|
||||
begin
|
||||
@client.loadproperty(testpropertyname)
|
||||
@client.options["protocol.http.ssl_config.verify_callback"] = method(:verify_callback).to_proc
|
||||
@verify_callback_called = false
|
||||
begin
|
||||
@client.hello_world("ssl client")
|
||||
assert(false)
|
||||
rescue OpenSSL::SSL::SSLError => ssle
|
||||
assert_equal("certificate verify failed", ssle.message)
|
||||
assert(@verify_callback_called)
|
||||
end
|
||||
#
|
||||
@client.options["protocol.http.ssl_config.verify_depth"] = ""
|
||||
@verify_callback_called = false
|
||||
assert_equal("Hello World, from ssl client", @client.hello_world("ssl client"))
|
||||
assert(@verify_callback_called)
|
||||
ensure
|
||||
File.unlink(testpropertyname)
|
||||
end
|
||||
end
|
||||
|
||||
def test_ciphers
|
||||
cfg = @client.options
|
||||
cfg["protocol.http.ssl_config.client_cert"] = File.join(DIR, 'client.cert')
|
||||
cfg["protocol.http.ssl_config.client_key"] = File.join(DIR, 'client.key')
|
||||
cfg["protocol.http.ssl_config.ca_file"] = File.join(DIR, "ca.cert")
|
||||
cfg["protocol.http.ssl_config.ca_file"] = File.join(DIR, "subca.cert")
|
||||
#cfg.timeout = 123
|
||||
assert_equal("Hello World, from ssl client", @client.hello_world("ssl client"))
|
||||
#
|
||||
cfg["protocol.http.ssl_config.ciphers"] = "!ALL"
|
||||
begin
|
||||
@client.hello_world("ssl client")
|
||||
assert(false)
|
||||
rescue OpenSSL::SSL::SSLError => ssle
|
||||
assert_equal("no ciphers available", ssle.message)
|
||||
end
|
||||
#
|
||||
cfg["protocol.http.ssl_config.ciphers"] = "ALL"
|
||||
assert_equal("Hello World, from ssl client", @client.hello_world("ssl client"))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def q(str)
|
||||
%Q["#{str}"]
|
||||
end
|
||||
|
||||
def setup_server
|
||||
svrcmd = "#{q(RUBY)} "
|
||||
svrcmd << "-d " if $DEBUG
|
||||
svrcmd << File.join(DIR, "sslsvr.rb")
|
||||
svrout = IO.popen(svrcmd)
|
||||
@serverpid = Integer(svrout.gets.chomp)
|
||||
end
|
||||
|
||||
def setup_client
|
||||
@client = SOAP::RPC::Driver.new(@url, 'urn:ssltst')
|
||||
@client.add_method("hello_world", "from")
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
Process.kill('INT', @serverpid)
|
||||
end
|
||||
|
||||
def teardown_client
|
||||
@client.reset_stream
|
||||
end
|
||||
|
||||
def verify_callback(ok, cert)
|
||||
@verify_callback_called = true
|
||||
p ["client", ok, cert] if $DEBUG
|
||||
ok
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end; end
|
||||
|
||||
end
|
83
test/soap/struct/test_struct.rb
Normal file
83
test/soap/struct/test_struct.rb
Normal file
|
@ -0,0 +1,83 @@
|
|||
require 'test/unit'
|
||||
require 'soap/rpc/httpserver'
|
||||
require 'soap/rpc/driver'
|
||||
|
||||
|
||||
module SOAP; module Struct
|
||||
|
||||
|
||||
class TestStruct < Test::Unit::TestCase
|
||||
Namespace = "urn:example.com:simpletype-rpc"
|
||||
class Server < ::SOAP::RPC::HTTPServer
|
||||
@@test_struct = ::Struct.new(:one, :two)
|
||||
|
||||
def on_init
|
||||
add_method(self, 'a_method')
|
||||
end
|
||||
|
||||
def a_method
|
||||
@@test_struct.new("string", 1)
|
||||
end
|
||||
end
|
||||
|
||||
Port = 17171
|
||||
|
||||
def setup
|
||||
setup_server
|
||||
setup_client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = Server.new(
|
||||
:Port => Port,
|
||||
:AccessLog => [],
|
||||
:SOAPDefaultNamespace => Namespace
|
||||
)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@server_thread = start_server_thread(@server)
|
||||
end
|
||||
|
||||
def setup_client
|
||||
@client = ::SOAP::RPC::Driver.new("http://localhost:#{Port}/", Namespace)
|
||||
@client.wiredump_dev = STDERR if $DEBUG
|
||||
@client.add_method('a_method')
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
teardown_client
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@server_thread.kill
|
||||
@server_thread.join
|
||||
end
|
||||
|
||||
def teardown_client
|
||||
@client.reset_stream
|
||||
end
|
||||
|
||||
def start_server_thread(server)
|
||||
t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
server.start
|
||||
}
|
||||
while server.status != :Running
|
||||
sleep 0.1
|
||||
unless t.alive?
|
||||
t.join
|
||||
raise
|
||||
end
|
||||
end
|
||||
t
|
||||
end
|
||||
|
||||
def test_struct
|
||||
assert_equal("string", @client.a_method.one)
|
||||
assert_equal(1, @client.a_method.two)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end; end
|
77
test/soap/swa/test_file.rb
Normal file
77
test/soap/swa/test_file.rb
Normal file
|
@ -0,0 +1,77 @@
|
|||
require 'test/unit'
|
||||
require 'soap/rpc/driver'
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/attachment'
|
||||
|
||||
|
||||
module SOAP
|
||||
module SWA
|
||||
|
||||
|
||||
class TestFile < Test::Unit::TestCase
|
||||
Port = 17171
|
||||
THIS_FILE = File.expand_path(__FILE__)
|
||||
|
||||
class SwAService
|
||||
def get_file
|
||||
return {
|
||||
'name' => $0,
|
||||
'file' => SOAP::Attachment.new(File.open(THIS_FILE)) # closed when GCed.
|
||||
}
|
||||
end
|
||||
|
||||
def put_file(name, file)
|
||||
"File '#{name}' was received ok."
|
||||
end
|
||||
end
|
||||
|
||||
def setup
|
||||
@server = SOAP::RPC::StandaloneServer.new('SwAServer',
|
||||
'http://www.acmetron.com/soap', '0.0.0.0', Port)
|
||||
@server.add_servant(SwAService.new)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@t = Thread.new {
|
||||
@server.start
|
||||
}
|
||||
while @server.status != :Running
|
||||
sleep 0.1
|
||||
unless @t.alive?
|
||||
@t.join
|
||||
raise
|
||||
end
|
||||
end
|
||||
@endpoint = "http://localhost:#{Port}/"
|
||||
@client = SOAP::RPC::Driver.new(@endpoint, 'http://www.acmetron.com/soap')
|
||||
@client.add_method('get_file')
|
||||
@client.add_method('put_file', 'name', 'file')
|
||||
@client.wiredump_dev = STDERR if $DEBUG
|
||||
end
|
||||
|
||||
def teardown
|
||||
@server.shutdown
|
||||
@t.kill
|
||||
@t.join
|
||||
@client.reset_stream
|
||||
end
|
||||
|
||||
def test_file
|
||||
assert_equal(
|
||||
File.open(THIS_FILE) { |f| f.read },
|
||||
@client.get_file['file'].content
|
||||
)
|
||||
assert_equal(
|
||||
"File 'foo' was received ok.",
|
||||
@client.put_file('foo',
|
||||
SOAP::Attachment.new(File.open(THIS_FILE)))
|
||||
)
|
||||
assert_equal(
|
||||
"File 'bar' was received ok.",
|
||||
@client.put_file('bar',
|
||||
SOAP::Attachment.new(File.open(THIS_FILE) { |f| f.read }))
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
2
test/soap/wsdlDriver/README.txt
Normal file
2
test/soap/wsdlDriver/README.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
echo_version.rb is generated by wsdl2ruby.rb;
|
||||
% wsdl2ruby.rb --wsdl simpletype.wsdl --classdef --force
|
20
test/soap/wsdlDriver/echo_version.rb
Normal file
20
test/soap/wsdlDriver/echo_version.rb
Normal file
|
@ -0,0 +1,20 @@
|
|||
# urn:example.com:simpletype-rpc-type
|
||||
class Version_struct
|
||||
@@schema_type = "version_struct"
|
||||
@@schema_ns = "urn:example.com:simpletype-rpc-type"
|
||||
|
||||
attr_accessor :version
|
||||
attr_accessor :msg
|
||||
|
||||
def initialize(version = nil, msg = nil)
|
||||
@version = version
|
||||
@msg = msg
|
||||
end
|
||||
end
|
||||
|
||||
# urn:example.com:simpletype-rpc-type
|
||||
module Versions
|
||||
C_16 = "1.6"
|
||||
C_18 = "1.8"
|
||||
C_19 = "1.9"
|
||||
end
|
63
test/soap/wsdlDriver/simpletype.wsdl
Normal file
63
test/soap/wsdlDriver/simpletype.wsdl
Normal file
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<definitions name="echo_version"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:tns="urn:example.com:simpletype-rpc"
|
||||
xmlns:txd="urn:example.com:simpletype-rpc-type"
|
||||
targetNamespace="urn:example.com:simpletype-rpc"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||
<types>
|
||||
<xsd:schema targetNamespace="urn:example.com:simpletype-rpc-type">
|
||||
<xsd:complexType name="version_struct">
|
||||
<xsd:all>
|
||||
<xsd:element name="version" type="txd:versions" />
|
||||
<xsd:element name="msg" type="xsd:string" />
|
||||
</xsd:all>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:simpleType name="versions">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="1.6"/>
|
||||
<xsd:enumeration value="1.8"/>
|
||||
<xsd:enumeration value="1.9"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
|
||||
<message name="msg_version">
|
||||
<part name="version" type="txd:versions"/>
|
||||
</message>
|
||||
|
||||
<message name="msg_version_struct">
|
||||
<part name="return" type="txd:version_struct"/>
|
||||
</message>
|
||||
|
||||
<portType name="echo_version_port_type">
|
||||
<operation name="echo_version">
|
||||
<input message="tns:msg_version"/>
|
||||
<output message="tns:msg_version_struct"/>
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding name="echo_version_binding" type="tns:echo_version_port_type">
|
||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
|
||||
<operation name="echo_version">
|
||||
<soap:operation soapAction="urn:example.com:simpletype-rpc"/>
|
||||
<input>
|
||||
<soap:body use="encoded" namespace="urn:example.com:simpletype-rpc"
|
||||
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="encoded" namespace="urn:example.com:simpletype-rpc"
|
||||
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
|
||||
</output>
|
||||
</operation>
|
||||
</binding>
|
||||
|
||||
<service name="echo_version_service">
|
||||
<port name="echo_version_port" binding="tns:echo_version_binding">
|
||||
<soap:address location="http://localhost:10080"/>
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
92
test/soap/wsdlDriver/test_simpletype.rb
Normal file
92
test/soap/wsdlDriver/test_simpletype.rb
Normal file
|
@ -0,0 +1,92 @@
|
|||
require 'test/unit'
|
||||
require 'soap/rpc/httpserver'
|
||||
require 'soap/wsdlDriver'
|
||||
|
||||
|
||||
module SOAP
|
||||
|
||||
|
||||
class TestSimpleType < Test::Unit::TestCase
|
||||
class Server < ::SOAP::RPC::HTTPServer
|
||||
def on_init
|
||||
add_method(self, 'echo_version', 'version')
|
||||
end
|
||||
|
||||
def echo_version(version)
|
||||
# "2.0" is out of range.
|
||||
Version_struct.new(version || "2.0", 'checked')
|
||||
end
|
||||
end
|
||||
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
require File.join(DIR, 'echo_version')
|
||||
|
||||
Port = 17171
|
||||
|
||||
def setup
|
||||
setup_server
|
||||
setup_client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = Server.new(
|
||||
:Port => Port,
|
||||
:AccessLog => [],
|
||||
:SOAPDefaultNamespace => "urn:example.com:simpletype-rpc"
|
||||
)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@server_thread = start_server_thread(@server)
|
||||
end
|
||||
|
||||
def setup_client
|
||||
wsdl = File.join(DIR, 'simpletype.wsdl')
|
||||
@client = ::SOAP::WSDLDriverFactory.new(wsdl).create_driver
|
||||
@client.endpoint_url = "http://localhost:#{Port}/"
|
||||
@client.generate_explicit_type = false
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
teardown_client
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@server_thread.kill
|
||||
@server_thread.join
|
||||
end
|
||||
|
||||
def teardown_client
|
||||
@client.reset_stream
|
||||
end
|
||||
|
||||
def start_server_thread(server)
|
||||
t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
server.start
|
||||
}
|
||||
while server.status != :Running
|
||||
sleep 0.1
|
||||
unless t.alive?
|
||||
t.join
|
||||
raise
|
||||
end
|
||||
end
|
||||
t
|
||||
end
|
||||
|
||||
def test_ping
|
||||
result = @client.echo_version("1.9")
|
||||
assert_equal("1.9", result.version)
|
||||
assert_equal("checked", result.msg)
|
||||
assert_raise(::XSD::ValueSpaceError) do
|
||||
@client.echo_version("2.0")
|
||||
end
|
||||
assert_raise(::XSD::ValueSpaceError) do
|
||||
@client.echo_version(nil) # nil => "2.0" => out of range
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
68
test/wsdl/multiplefault.wsdl
Normal file
68
test/wsdl/multiplefault.wsdl
Normal file
|
@ -0,0 +1,68 @@
|
|||
<?xml version="1.0"?>
|
||||
<definitions name="MultipleFaultTest"
|
||||
targetNamespace="urn:jp.gr.jin.rrr.example.ele"
|
||||
xmlns:tns="urn:jp.gr.jin.rrr.example.ele"
|
||||
xmlns:typens="urn:jp.gr.jin.rrr.example.datatypes"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
|
||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||
|
||||
<types>
|
||||
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
|
||||
targetNamespace="urn:jp.gr.jin.rrr.example.datatypes">
|
||||
<xsd:complexType name="AuthenticationError">
|
||||
<all>
|
||||
<element name="message" type="xsd:string" />
|
||||
<element name="backtrace" type="xoapenc:Array" />
|
||||
</all>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="AuthorizationError">
|
||||
<all>
|
||||
<element name="message" type="xsd:string" />
|
||||
<element name="backtrace" type="xoapenc:Array" />
|
||||
</all>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
|
||||
<message name="inputmsg"/>
|
||||
<message name="outputmsg"/>
|
||||
<message name="faultmsg1" >
|
||||
<part name="exception" type="typens:AuthenticationError" />
|
||||
</message>
|
||||
<message name="faultmsg2" >
|
||||
<part name="exception" type="typens:AuthorizationError" />
|
||||
</message>
|
||||
|
||||
<portType name="MultipleFaultPortType">
|
||||
<operation name="myoperation">
|
||||
<input message="tns:inputmsg"/>
|
||||
<output message="tns:outputmsg"/>
|
||||
<fault message="tns:faultmsg1"/>
|
||||
<fault message="tns:faultmsg2"/>
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding name="MultipleFaultBinding" type="tns:MultipleFaultPortType">
|
||||
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
|
||||
<operation name="myoperation">
|
||||
<soap:operation soapAction="urn:jp.gr.jin.rrr.example.ele"/>
|
||||
<input>
|
||||
<soap:body use="encoded" namespace="urn:jp.gr.jin.rrr.example.ele"
|
||||
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
|
||||
</input>
|
||||
<output>
|
||||
<soap:body use="encoded" namespace="urn:jp.gr.jin.rrr.example.ele"
|
||||
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
|
||||
</output>
|
||||
</operation>
|
||||
</binding>
|
||||
|
||||
<service name="MultipleFaultService">
|
||||
<port name="MultipleFaultPortType" binding="tns:MultipleFaultBinding">
|
||||
<soap:address location="http://localhost:17171/"/>
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
67
test/wsdl/simpletype/simpletype.wsdl
Normal file
67
test/wsdl/simpletype/simpletype.wsdl
Normal file
|
@ -0,0 +1,67 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<definitions name="ping_service"
|
||||
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:tns="urn:example.com:simpletype"
|
||||
targetNamespace="urn:example.com:simpletype"
|
||||
xmlns="http://schemas.xmlsoap.org/wsdl/">
|
||||
<types>
|
||||
<xsd:schema targetNamespace="urn:example.com:simpletype">
|
||||
<xsd:element name="ruby">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element minOccurs="1" maxOccurs="1" name="version" type="tns:version"/>
|
||||
<xsd:element minOccurs="0" maxOccurs="1" name="date" type="xsd:dateTime"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
|
||||
<xsd:simpleType name="version">
|
||||
<xsd:restriction base="xsd:string">
|
||||
<xsd:enumeration value="1.6"/>
|
||||
<xsd:enumeration value="1.8"/>
|
||||
<xsd:enumeration value="1.9"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
||||
</types>
|
||||
|
||||
<message name="ping_in">
|
||||
<part name="parameters" element="tns:ruby"/>
|
||||
</message>
|
||||
|
||||
<message name="ping_out">
|
||||
<part name="parameters" element="xsd:string"/>
|
||||
</message>
|
||||
|
||||
<message name="versionmsg">
|
||||
<part name="version" element="tns:version"/>
|
||||
</message>
|
||||
|
||||
<portType name="ping_port_type">
|
||||
<operation name="ping">
|
||||
<input message="tns:ping_in"/>
|
||||
<output message="tns:ping_out"/>
|
||||
</operation>
|
||||
|
||||
<operation name="echo_version">
|
||||
<input message="tns:versionmsg"/>
|
||||
<output message="tns:versionmsg"/>
|
||||
</operation>
|
||||
</portType>
|
||||
|
||||
<binding name="ping_binding" type="tns:ping_port_type">
|
||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
|
||||
<operation name="ping">
|
||||
<soap:operation soapAction="urn:example.com:simpletype" style="document"/>
|
||||
<input><soap:body use="literal"/></input>
|
||||
<output><soap:body use="literal"/></output>
|
||||
</operation>
|
||||
</binding>
|
||||
|
||||
<service name="ping_service">
|
||||
<port name="ping_port" binding="tns:ping_binding">
|
||||
<soap:address location="http://localhost:10080"/>
|
||||
</port>
|
||||
</service>
|
||||
</definitions>
|
81
test/wsdl/simpletype/test_simpletype.rb
Normal file
81
test/wsdl/simpletype/test_simpletype.rb
Normal file
|
@ -0,0 +1,81 @@
|
|||
require 'test/unit'
|
||||
require 'soap/rpc/standaloneServer'
|
||||
require 'soap/wsdlDriver'
|
||||
|
||||
|
||||
module WSDL
|
||||
module SimpleType
|
||||
|
||||
|
||||
class TestSimpleType < Test::Unit::TestCase
|
||||
class Server < ::SOAP::RPC::StandaloneServer
|
||||
def on_init
|
||||
add_method(self, 'ruby', 'version', 'date')
|
||||
end
|
||||
|
||||
def ruby(version, date)
|
||||
"#{version} (#{date})"
|
||||
end
|
||||
end
|
||||
|
||||
DIR = File.dirname(File.expand_path(__FILE__))
|
||||
|
||||
Port = 17171
|
||||
|
||||
def setup
|
||||
setup_server
|
||||
setup_client
|
||||
end
|
||||
|
||||
def setup_server
|
||||
@server = Server.new('Test', "urn:example.com:simpletype", '0.0.0.0', Port)
|
||||
@server.level = Logger::Severity::ERROR
|
||||
@server_thread = start_server_thread(@server)
|
||||
end
|
||||
|
||||
def setup_client
|
||||
wsdl = File.join(DIR, 'simpletype.wsdl')
|
||||
@client = ::SOAP::WSDLDriverFactory.new(wsdl).create_driver
|
||||
@client.endpoint_url = "http://localhost:#{Port}/"
|
||||
@client.generate_explicit_type = false
|
||||
end
|
||||
|
||||
def teardown
|
||||
teardown_server
|
||||
teardown_client
|
||||
end
|
||||
|
||||
def teardown_server
|
||||
@server.shutdown
|
||||
@server_thread.kill
|
||||
@server_thread.join
|
||||
end
|
||||
|
||||
def teardown_client
|
||||
@client.reset_stream
|
||||
end
|
||||
|
||||
def start_server_thread(server)
|
||||
t = Thread.new {
|
||||
Thread.current.abort_on_exception = true
|
||||
server.start
|
||||
}
|
||||
while server.status != :Running
|
||||
sleep 0.1
|
||||
unless t.alive?
|
||||
t.join
|
||||
raise
|
||||
end
|
||||
end
|
||||
t
|
||||
end
|
||||
|
||||
def test_ping
|
||||
header, body = @client.ping(nil, {:version => "1.9", :date => "2004-01-01T00:00:00Z"})
|
||||
assert_equal("1.9 (2004-01-01T00:00:00Z)", body)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
39
test/wsdl/test_multiplefault.rb
Normal file
39
test/wsdl/test_multiplefault.rb
Normal file
|
@ -0,0 +1,39 @@
|
|||
require 'test/unit'
|
||||
require 'wsdl/parser'
|
||||
require 'wsdl/soap/classDefCreator'
|
||||
|
||||
|
||||
module WSDL
|
||||
|
||||
|
||||
class TestMultipleFault < Test::Unit::TestCase
|
||||
def self.setup(filename)
|
||||
@@filename = filename
|
||||
end
|
||||
|
||||
def test_multiplefault
|
||||
@wsdl = WSDL::Parser.new.parse(File.open(@@filename) { |f| f.read })
|
||||
classdefstr = WSDL::SOAP::ClassDefCreator.new(@wsdl).dump
|
||||
yield_eval_binding(classdefstr) do |b|
|
||||
assert_equal(
|
||||
WSDL::TestMultipleFault::AuthenticationError,
|
||||
eval("AuthenticationError", b)
|
||||
)
|
||||
assert_equal(
|
||||
WSDL::TestMultipleFault::AuthorizationError,
|
||||
eval("AuthorizationError", b)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def yield_eval_binding(evaled)
|
||||
b = binding
|
||||
eval(evaled, b)
|
||||
yield(b)
|
||||
end
|
||||
end
|
||||
|
||||
TestMultipleFault.setup(File.join(File.dirname(__FILE__), 'multiplefault.wsdl'))
|
||||
|
||||
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue