diff options
author | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-01-06 02:20:51 +0000 |
---|---|---|
committer | nahi <nahi@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-01-06 02:20:51 +0000 |
commit | 21f32101fa805273d531a836774ac0d4f77a1820 (patch) | |
tree | 5449bd61cebdf6486cb443c0013a8573204fb50c /lib/soap/wsdlDriver.rb | |
parent | edf1de364648307059f0363bb83f8f8ec95fdc6f (diff) | |
download | ruby-21f32101fa805273d531a836774ac0d4f77a1820.tar.gz ruby-21f32101fa805273d531a836774ac0d4f77a1820.tar.xz ruby-21f32101fa805273d531a836774ac0d4f77a1820.zip |
* import soap4r/1.5.2;
* lib/soap/{attachment.rb,baseData.rb,encodingstyle/soapHandler.rb}:
introduce SOAPExternalReference class as a referenct to SOAPEnvelope
external content.
* lib/soap/{attachment.rb,mimemessage.rb}: great SwA (SOAP messages
with Attachments) support code by Jamie Herre.
* lib/soap/{element.rb,marshal.rb,parser.rb,processor.rb,
streamHandler.rb,wsdlDriver.rb}: SwA support.
* lib/soap/rpc/{cgistub.rb,driver.rb,element.rb,proxy.rb,router.rb,
soaplet.rb}: SwA support and refactoring.
* lib/soap/generator.rb, lib/soap/mapping/mapping.rb: follow
SOAPReference#initialize signature change.
* lib/soap/mapping/factory.rb: deleted unused methods.
* lib/soap/mapping/rubytypeFactory.rb: do no ignore case while xsi:type
string <-> Ruby class name matching.
* lib/xsd/datatypes.rb: check the smallest positive non-zero
single-precision float exactly instead of packing with "f".
[ruby-talk:88822]
* test/soap/test_basetype.rb, test/xsd/test_xsd.rb: use 1.402e-45, not
1.4e-45. 1.4e-45 is smaller than 2 ** -149...
* test/soap/test_basetype.rb, test/soap/marshal/test_marshal.rb,
test/xsd/test_xsd.rb: use "(-1.0 / (1.0 / 0.0))" instead of "-0.0".
* test/soap/test_streamhandler.rb: revert to the previous test that
warns "basic_auth unsupported under net/http".
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@5384 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/soap/wsdlDriver.rb')
-rw-r--r-- | lib/soap/wsdlDriver.rb | 79 |
1 files changed, 57 insertions, 22 deletions
diff --git a/lib/soap/wsdlDriver.rb b/lib/soap/wsdlDriver.rb index 096175147..cd93e3dee 100644 --- a/lib/soap/wsdlDriver.rb +++ b/lib/soap/wsdlDriver.rb @@ -12,6 +12,7 @@ require 'xsd/qname' require 'soap/element' require 'soap/baseData' require 'soap/streamHandler' +require 'soap/mimemessage' require 'soap/mapping' require 'soap/mapping/wsdlRegistry' require 'soap/rpc/rpc' @@ -212,6 +213,7 @@ class WSDLDriver method.type = XSD::QName.new # Request should not be typed. req_header = nil req_body = SOAPBody.new(method) + req_env = SOAPEnvelope.new(req_header, req_body) if @wiredump_file_base @streamhandler.wiredump_file_base = @@ -221,19 +223,19 @@ class WSDLDriver begin opt = create_options opt[:decode_typemap] = @rpc_decode_typemap - res_header, res_body = invoke(req_header, req_body, op_info, opt) - if res_body.fault - raise SOAP::FaultError.new(res_body.fault) + res_env = invoke(req_env, op_info, opt) + if res_env.body.fault + raise SOAP::FaultError.new(res_env.body.fault) end rescue SOAP::FaultError => e Mapping.fault2exception(e) end - ret = res_body.response ? - Mapping.soap2obj(res_body.response, @mapping_registry) : nil + ret = res_env.body.response ? + Mapping.soap2obj(res_env.body.response, @mapping_registry) : nil - if res_body.outparams - outparams = res_body.outparams.collect { |outparam| + if res_env.body.outparams + outparams = res_env.body.outparams.collect { |outparam| Mapping.soap2obj(outparam) } return [ret].concat(outparams) @@ -249,14 +251,15 @@ class WSDLDriver op_info = @operations[name] req_header = header_from_obj(header_obj, op_info) req_body = body_from_obj(body_obj, op_info) + req_env = SOAPEnvelope.new(req_header, req_body) opt = create_options - res_header, res_body = invoke(req_header, req_body, op_info, opt) - if res_body.fault - raise SOAP::FaultError.new(res_body.fault) + res_env = invoke(req_env, op_info, opt) + if res_env.body.fault + raise SOAP::FaultError.new(res_env.body.fault) end - res_body_obj = res_body.response ? - Mapping.soap2obj(res_body.response, @mapping_registry) : nil - return res_header, res_body_obj + res_body_obj = res_env.body.response ? + Mapping.soap2obj(res_env.body.response, @mapping_registry) : nil + return res_env.header, res_body_obj end private @@ -269,18 +272,50 @@ class WSDLDriver o end - def invoke(req_header, req_body, op_info, opt) - send_string = Processor.marshal(req_header, req_body, opt) + def invoke(req_env, op_info, opt) + opt[:external_content] = nil + send_string = Processor.marshal(req_env, opt) log(DEBUG) { "invoke: sending string #{ send_string }" } - data = @streamhandler.send(send_string, op_info.soapaction) - log(DEBUG) { "invoke: received string #{ data.receive_string }" } - if data.receive_string.empty? + conn_data = StreamHandler::ConnectionData.new(send_string) + if ext = opt[: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(conn_data, op_info.soapaction) + log(DEBUG) { "invoke: received string #{ conn_data.receive_string }" } + if conn_data.receive_string.empty? return nil, nil end - opt[:charset] = @mandatorycharset || - StreamHandler.parse_media_type(data.receive_contenttype) - res_header, res_body = Processor.unmarshal(data.receive_string, opt) - return res_header, res_body + unmarshal(conn_data, opt) + end + + def unmarshal(conn_data, opt) + contenttype = conn_data.receive_contenttype + if /#{MIMEMessage::MultipartContentType}/i =~ contenttype + opt[:external_content] = {} + mime = MIMEMessage.parse("Content-Type: " + contenttype, + conn_data.receive_string) + mime.parts.each do |part| + value = Attachment.new(part.content) + value.contentid = part.contentid + obj = SOAPAttachment.new(value) + opt[:external_content][value.contentid] = obj if value.contentid + end + opt[:charset] = @mandatorycharset || + StreamHandler.parse_media_type(mime.root.headers['content-type'].str) + env = Processor.unmarshal(mime.root.content, opt) + else + opt[:charset] = @mandatorycharset || + ::SOAP::StreamHandler.parse_media_type(contenttype) + env = Processor.unmarshal(conn_data.receive_string, opt) + end + env end def header_from_obj(obj, op_info) |