I'm having an exception when trying to build custom headers with Savon 2.1.0 for Authentication, here is the sample code to reproduce the issue, I'll appreciate any help on this subject.
require 'open-uri'
require 'savon'
headers = {
'IvansWSAuthentication' => {
'User' => 'my_user',
'Password' => 'my_pass',
'ClientId' => 'my_client_id'
}
}
x12 = 'test'
client = Savon.client(
wsdl: 'https://limeservices.ivans.com/EligibilityOne.asmx?WSDL',
headers: headers
)
request_params = {
form270: x12
}
response = client.call(:send_commercial_eligibility_form_request, message: request_params)
This is the exception:
1.9.3-p392 :023 > response = client.call(:send_commercial_eligibility_form_request, message: request_params)
D, [2013-03-05T23:02:30.647097 #11590] DEBUG -- : HTTPI GET request to limeservices.ivans.com (net_http)
I, [2013-03-05T23:02:31.600016 #11590] INFO -- : SOAP request: https://limeservices.ivans.com/EligibilityOne.asmx
I, [2013-03-05T23:02:31.600157 #11590] INFO -- : IvansWSAuthentication: {"User"=>"my_user", "Password"=>"my_pass", "ClientId"=>"my_client_id"}, SOAPAction: "http://tempuri.org/SendCommercialEligibilityFormRequest", Content-Type: text/xml;charset=UTF-8, Content-Length: 389
D, [2013-03-05T23:02:31.600206 #11590] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://tempuri.org/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><tns:SendCommercialEligibilityFormRequest><tns:form270>test</tns:form270></tns:SendCommercialEligibilityFormRequest></env:Body></env:Envelope>
D, [2013-03-05T23:02:31.600474 #11590] DEBUG -- : HTTPI POST request to limeservices.ivans.com (net_http)
NoMethodError: undefined method `strip' for #<Hash:0x007fb044365a50>
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/net/http.rb:1435:in `block in initialize_http_header'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/rack-1.5.2/lib/rack/utils.rb:451:in `block in each'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/rack-1.5.2/lib/rack/utils.rb:450:in `each'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/rack-1.5.2/lib/rack/utils.rb:450:in `each'
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/net/http.rb:1433:in `initialize_http_header'
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/net/http.rb:1862:in `initialize'
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/net/http.rb:2093:in `initialize'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi/adapter/net_http.rb:87:in `new'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi/adapter/net_http.rb:87:in `request_client'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi/adapter/net_http.rb:55:in `block in do_request'
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/net/http.rb:745:in `start'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi/adapter/net_http.rb:54:in `do_request'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi/adapter/net_http.rb:31:in `request'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi.rb:137:in `request'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi.rb:109:in `post'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/savon-2.1.0/lib/savon/operation.rb:59:in `call!'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/savon-2.1.0/lib/savon/operation.rb:48:in `call'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/savon-2.1.0/lib/savon/client.rb:38:in `call'
from (irb):23
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>'1.9.3-p392 :024 >
Ok, the problem is that by setting the parameter "headers" on Savon 2.1.0, what I'm doing is setting up the headers for the HTTP request, and the HTTP Request parameter should be a key: String, since ruby HTTP library calls strip on each one of the hash values contained within the Header, it raises the exception.
My original idea was to set custom soap headers for authentication, so all I had to do was:
client = Savon.client(
wsdl: 'https://limeservices.ivans.com/EligibilityOne.asmx?WSDL',
soap_header: headers
)