When you're using soap4r, you don't have access to the bare httpclient - which means you have absolutely no way of passing in custom HTTP headers (note, not SOAP headers which definitely have an API).
Monkeypatch time!
See the patchfile below. You need to a) vendor soap4r (if you haven't already), then b) update several files with the given patch.
Then you can pass in your customised headers directly via the soap driver before you call the soap method. Here's an example of use:
driver = SOAP::RPC::Driver.new(url, SCHEMA) driver.add_method 'MySoapMethod', 'MyParam' driver.options["protocol.http_custom_headers"] = {'MySpecialHeader1' => 'abc', 'MySpecialHeader2' => 'xyz'} driver.MySoapMethod 'MyValue'
and here's the necessary patches (note: they're in svn-diff style):
Index: vendor/gems/soap4r-1.5.8/lib/soap/rpc/proxy.rb =================================================================== --- vendor/gems/soap4r-1.5.8/lib/soap/rpc/proxy.rb (revision 4217) +++ vendor/gems/soap4r-1.5.8/lib/soap/rpc/proxy.rb (working copy) @@ -32,6 +32,7 @@ attr_accessor :allow_unqualified_element attr_accessor :default_encodingstyle attr_accessor :generate_explicit_type + attr_accessor :http_headers attr_accessor :use_default_namespace attr_accessor :return_response_as_xml attr_reader :headerhandler @@ -57,6 +58,7 @@ @allow_unqualified_element = true @default_encodingstyle = nil @generate_explicit_type = true + @http_headers = nil @use_default_namespace = false @return_response_as_xml = false @headerhandler = Header::HandlerSet.new @@ -135,7 +137,9 @@ :generate_explicit_type => @generate_explicit_type, :use_default_namespace => - op_info.use_default_namespace || @use_default_namespace + op_info.use_default_namespace || @use_default_namespace, + :http_headers => @http_headers + ) resopt = create_encoding_opt( :envelopenamespace => @options["soap.envelope.responsenamespace"], @@ -168,6 +172,9 @@ end reqopt[:external_content] = nil conn_data = marshal(req_env, reqopt) + if reqopt[:http_headers].present? + conn_data.extheaders = reqopt[:http_headers] + end if ext = reqopt[:external_content] mime = MIMEMessage.new ext.each do |k, v| @@ -299,6 +305,7 @@ opt[:default_encodingstyle] = @default_encodingstyle opt[:allow_unqualified_element] = @allow_unqualified_element opt[:generate_explicit_type] = @generate_explicit_type + opt[:http_headers] = @http_headers opt[:no_indent] = @options["soap.envelope.no_indent"] opt[:use_numeric_character_reference] = @options["soap.envelope.use_numeric_character_reference"] Index: vendor/gems/soap4r-1.5.8/lib/soap/rpc/driver.rb =================================================================== --- vendor/gems/soap4r-1.5.8/lib/soap/rpc/driver.rb (revision 4217) +++ vendor/gems/soap4r-1.5.8/lib/soap/rpc/driver.rb (working copy) @@ -211,6 +211,9 @@ opt.add_hook("protocol.generate_explicit_type") do |key, value| @proxy.generate_explicit_type = value end + opt.add_hook("protocol.http_custom_headers") do |key, value| + @proxy.http_headers = value + end opt.add_hook("protocol.use_default_namespace") do |key, value| @proxy.use_default_namespace = value end Index: vendor/gems/soap4r-1.5.8/lib/soap/streamHandler.rb =================================================================== --- vendor/gems/soap4r-1.5.8/lib/soap/streamHandler.rb (revision 4217) +++ vendor/gems/soap4r-1.5.8/lib/soap/streamHandler.rb (working copy) @@ -34,6 +34,8 @@ attr_accessor :is_nocontent attr_accessor :soapaction + attr_accessor :extheaders + def initialize(send_string = nil) @send_string = send_string @send_contenttype = nil @@ -42,6 +44,7 @@ @is_fault = false @is_nocontent = false @soapaction = nil + @extheaders = nil end end @@ -230,6 +233,13 @@ extheader['Content-Type'] = conn_data.send_contenttype extheader['SOAPAction'] = "\"#{ conn_data.soapaction }\"" extheader['Accept-Encoding'] = 'gzip' if send_accept_encoding_gzip? + # allow us to pass in custom HTTP headers + if conn_data.extheaders.present? + conn_data.extheaders.each do |key, value| + extheader[key] = value + end + end + send_string = conn_data.send_string @wiredump_dev << "Wire dump:\n\n" if @wiredump_dev begin
No comments:
Post a Comment