# 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
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please see Improve the docs, or visit Documenting-ruby.org.