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