# File soap/rpc/proxy.rb, line 40
def initialize(endpoint_url, soapaction, options)
@endpoint_url = endpoint_url
@soapaction = soapaction
@options = options
@streamhandler = HTTPStreamHandler.new(
@options["protocol.http"] ||= ::SOAP::Property.new)
@operation = {}
@mandatorycharset = nil
@allow_unqualified_element = true
@default_encodingstyle = nil
@generate_explicit_type = true
@headerhandler = Header::HandlerSet.new
@mapping_registry = nil
@literal_mapping_registry = ::SOAP::Mapping::WSDLLiteralRegistry.new
end
# File soap/rpc/proxy.rb, line 90
def add_document_operation(soapaction, name, param_def, opt = {})
opt[:request_style] ||= :document
opt[:response_style] ||= :document
opt[:request_use] ||= :literal
opt[:response_use] ||= :literal
# default values of these values are unqualified in XML Schema.
# set true for backward compatibility.
unless opt.key?(:elementformdefault)
opt[:elementformdefault] = true
end
unless opt.key?(:attributeformdefault)
opt[:attributeformdefault] = true
end
@operation[name] = Operation.new(soapaction, param_def, opt)
end
#add_method is for shortcut of typical rpc/encoded method definition.
# File soap/rpc/proxy.rb, line 81
def add_rpc_operation(qname, soapaction, name, param_def, opt = {})
opt[:request_qname] = qname
opt[:request_style] ||= :rpc
opt[:response_style] ||= :rpc
opt[:request_use] ||= :encoded
opt[:response_use] ||= :encoded
@operation[name] = Operation.new(soapaction, param_def, opt)
end
# File soap/rpc/proxy.rb, line 116
def call(name, *params)
unless op_info = @operation[name]
raise MethodDefinitionError, "method: #{name} not defined"
end
mapping_opt = create_mapping_opt
req_header = create_request_header
req_body = SOAPBody.new(
op_info.request_body(params, @mapping_registry,
@literal_mapping_registry, mapping_opt)
)
reqopt = create_encoding_opt(
:soapaction => op_info.soapaction || @soapaction,
:envelopenamespace => @options["soap.envelope.requestnamespace"],
:default_encodingstyle =>
@default_encodingstyle || op_info.request_default_encodingstyle,
:elementformdefault => op_info.elementformdefault,
:attributeformdefault => op_info.attributeformdefault
)
resopt = create_encoding_opt(
:envelopenamespace => @options["soap.envelope.responsenamespace"],
:default_encodingstyle =>
@default_encodingstyle || op_info.response_default_encodingstyle,
:elementformdefault => op_info.elementformdefault,
:attributeformdefault => op_info.attributeformdefault
)
env = route(req_header, req_body, reqopt, resopt)
raise EmptyResponseError unless env
receive_headers(env.header)
begin
check_fault(env.body)
rescue ::SOAP::FaultError => e
op_info.raise_fault(e, @mapping_registry, @literal_mapping_registry)
end
op_info.response_obj(env.body, @mapping_registry,
@literal_mapping_registry, mapping_opt)
end
# File soap/rpc/proxy.rb, line 178
def check_fault(body)
if body.fault
raise SOAP::FaultError.new(body.fault)
end
end
# File soap/rpc/proxy.rb, line 60
def endpoint_url
@endpoint_url
end
# File soap/rpc/proxy.rb, line 64
def endpoint_url=(endpoint_url)
@endpoint_url = endpoint_url
reset_stream
end
# File soap/rpc/proxy.rb, line 56
def inspect
"#<#{self.class}:#{@endpoint_url}>"
end
# File soap/rpc/proxy.rb, line 111
def invoke(req_header, req_body, opt = nil)
opt ||= create_encoding_opt
route(req_header, req_body, opt, opt)
end
# File soap/rpc/proxy.rb, line 69
def reset_stream
@streamhandler.reset(@endpoint_url)
end
# File soap/rpc/proxy.rb, line 153
def route(req_header, req_body, reqopt, resopt)
req_env = ::SOAP::SOAPEnvelope.new(req_header, req_body)
unless reqopt[:envelopenamespace].nil?
set_envelopenamespace(req_env, reqopt[:envelopenamespace])
end
reqopt[:external_content] = nil
conn_data = marshal(req_env, reqopt)
if ext = reqopt[:external_content]
mime = MIMEMessage.new
ext.each do |k, v|
mime.add_attachment(v.data)
end
mime.add_part(conn_data.send_string + "\r\n")
mime.close
conn_data.send_string = mime.content_str
conn_data.send_contenttype = mime.headers['content-type'].str
end
conn_data = @streamhandler.send(@endpoint_url, conn_data,
reqopt[:soapaction])
if conn_data.receive_string.empty?
return nil
end
unmarshal(conn_data, resopt)
end