jammendolia
4/3/2008 2:55:00 PM
>
> > I'm not positive, but I think you could implement James's idea in
> > SOAP::RPC::Proxy#marshal (in /usr/lib/ruby/1.8/soap/rpc/proxy.rb
> > here).
>
> Sorry. That should be SOAP::RPC::Proxy::Operation#marshal.
Thanks for the feedback. I managed to get it working by extending the
SOAP::RPC::Proxy class like this:
require 'soap/rpc/proxy'
class CustomProxy < SOAP::RPC::Proxy
# Here, I override the route method so that I can generate a self
closed body tag.
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)
#hack to generate self-closed soap:Body tag
conn_data.send_string = conn_data.send_string.sub!('<soap:Body></
soap:Body>', '<soap:Body/>') if !
conn_data.send_string.rindex("<soap:Body></soap:Body>").nil?
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
end
end
And then, to make the soap4r generated driver use it, I modified the
generated initializer so that it no longer calls "super". I then
implemented the code from the original proxy.rb initialize which
includes instantiating the proxy. Bu instead of using the default
proxy, I use my custom one. here's an example:
Driver.rb
def initialize...
....
# we do not call the base initialize here because we
# need to use a custom proxy. So all of the super
# initialize components are performed here
# super(endpoint_url, nil)
@namespace = nil
@soapaction = nil
@options = setup_options
@wiredump_file_base = nil
@proxy = CusromProxy.new(endpoint_url, @soapaction, @options)
....
Thanks again for pointing me in the right direction.
I hope this will help someone else in the future :)
Joe