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 | ff1b89a96d0f103ff0c917c458ddd3e36e9b3718 (patch) | |
tree | 5449bd61cebdf6486cb443c0013a8573204fb50c /lib/soap/rpc/proxy.rb | |
parent | 8a8dd6519948eaf207f03c12152fc160de7370a2 (diff) |
* 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: svn+ssh://ci.ruby-lang.org/ruby/trunk@5384 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/soap/rpc/proxy.rb')
-rw-r--r-- | lib/soap/rpc/proxy.rb | 52 |
1 files changed, 42 insertions, 10 deletions
diff --git a/lib/soap/rpc/proxy.rb b/lib/soap/rpc/proxy.rb index 5825a27138..7d9dbe519e 100644 --- a/lib/soap/rpc/proxy.rb +++ b/lib/soap/rpc/proxy.rb @@ -12,6 +12,7 @@ require 'soap/mapping' require 'soap/rpc/rpc' require 'soap/rpc/element' require 'soap/streamHandler' +require 'soap/mimemessage' module SOAP @@ -79,7 +80,6 @@ public raise SOAP::RPC::MethodDefinitionError.new( "Method: #{ name } not defined.") end - Request.new(method, values) end @@ -91,21 +91,30 @@ public req_body = SOAPBody.new(req_body) end opt = create_options - send_string = Processor.marshal(req_header, req_body, opt) - data = @streamhandler.send(send_string, soapaction) - if data.receive_string.empty? + opt[:external_content] = nil + req_env = SOAPEnvelope.new(req_header, req_body) + send_string = Processor.marshal(req_env, opt) + 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, soapaction) + if conn_data.receive_string.empty? return nil, nil end - opt = create_options - 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 call(headers, name, *values) req = create_request(name, *values) - return invoke(headers, req.method, req.method.soapaction || @soapaction) + invoke(headers, req.method, req.method.soapaction || @soapaction) end def check_fault(body) @@ -116,6 +125,29 @@ public private + 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 create_header(headers) header = SOAPHeader.new() headers.each do |content, mustunderstand, encodingstyle| |