mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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
This commit is contained in:
parent
8a8dd65199
commit
ff1b89a96d
26 changed files with 476 additions and 218 deletions
|
@ -11,6 +11,8 @@ require 'soap/processor'
|
|||
require 'soap/mapping'
|
||||
require 'soap/rpc/rpc'
|
||||
require 'soap/rpc/element'
|
||||
require 'soap/streamHandler'
|
||||
require 'soap/mimemessage'
|
||||
|
||||
|
||||
module SOAP
|
||||
|
@ -47,42 +49,96 @@ class Router
|
|||
end
|
||||
|
||||
# Routing...
|
||||
def route(soap_string, charset = nil)
|
||||
opt = options
|
||||
opt[:charset] = charset
|
||||
is_fault = false
|
||||
#def route(soap_string, charset = nil)
|
||||
def route(conn_data)
|
||||
soap_response = nil
|
||||
begin
|
||||
header, body = Processor.unmarshal(soap_string, opt)
|
||||
env = unmarshal(conn_data)
|
||||
if env.nil?
|
||||
raise ArgumentError.new("Illegal SOAP marshal format.")
|
||||
end
|
||||
# So far, header is omitted...
|
||||
soap_request = body.request
|
||||
soap_request = env.body.request
|
||||
unless soap_request.is_a?(SOAPStruct)
|
||||
raise RPCRoutingError.new("Not an RPC style.")
|
||||
end
|
||||
soap_response = dispatch(soap_request)
|
||||
rescue Exception
|
||||
soap_response = fault($!)
|
||||
is_fault = true
|
||||
conn_data.is_fault = true
|
||||
end
|
||||
|
||||
opt = options
|
||||
opt[:external_content] = nil
|
||||
header = SOAPHeader.new
|
||||
body = SOAPBody.new(soap_response)
|
||||
response_string = Processor.marshal(header, body, opt)
|
||||
|
||||
return response_string, is_fault
|
||||
env = SOAPEnvelope.new(header, body)
|
||||
response_string = Processor.marshal(env, opt)
|
||||
conn_data.send_string = response_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
|
||||
end
|
||||
|
||||
# Create fault response string.
|
||||
def create_fault_response(e, charset = nil)
|
||||
header = SOAPHeader.new
|
||||
soap_response = fault(e)
|
||||
body = SOAPBody.new(soap_response)
|
||||
body = SOAPBody.new(fault(e))
|
||||
env = SOAPEnvelope.new(header, body)
|
||||
opt = options
|
||||
opt[:external_content] = nil
|
||||
opt[:charset] = charset
|
||||
Processor.marshal(header, body, opt)
|
||||
response_string = Processor.marshal(env, opt)
|
||||
conn_data = StreamHandler::ConnectionData.new(response_string)
|
||||
conn_data.is_fault = true
|
||||
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
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def unmarshal(conn_data)
|
||||
opt = options
|
||||
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] =
|
||||
StreamHandler.parse_media_type(mime.root.headers['content-type'].str)
|
||||
env = Processor.unmarshal(mime.root.content, opt)
|
||||
else
|
||||
opt[:charset] = ::SOAP::StreamHandler.parse_media_type(contenttype)
|
||||
env = Processor.unmarshal(conn_data.receive_string, opt)
|
||||
end
|
||||
charset = opt[:charset]
|
||||
conn_data.send_contenttype = "text/xml; charset=\"#{charset}\""
|
||||
env
|
||||
end
|
||||
|
||||
# Create new response.
|
||||
def create_response(qname, result)
|
||||
name = fqname(qname)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue