savonrb / savon

Heavy metal SOAP client
https://www.savonrb.com
MIT License
2.07k stars 616 forks source link

SOAPFault error for operation 'set_json_quote_pricing' after upgrading from Savon 2.12 to 2.15 #1015

Open yrmallu opened 3 weeks ago

yrmallu commented 3 weeks ago

Description

After upgrading Savon from version 2.12 to 2.15, I've started encountering a SOAPFault error when attempting to call the set_json_quote_pricing operation, which exists in the WSDL. The error message is:

Savon::SOAPFault: (SOAP-ENV:Server) Procedure 'setJSONQuotePricingIn' not present

It's important to note that the operation set_json_quote_pricing and the error message refer to setJSONQuotePricingIn, which appears to be related to the input message name in the WSDL, not the operation name itself.

Steps to Reproduce

  1. Upgrade Savon gem from version 2.12 to 2.15.
  2. Attempt to call the set_json_quote_pricing operation with appropriate parameters as shown in the code sample below.
  3. Observe that a SOAPFault error is being raised with the mentioned error message.

Code Sample


require 'savon'

client = Savon.client(wsdl: 'http://example/quote?wsdl')
response = client.call(:set_json_quote_pricing, message: { data: pricing_json })

Expected Behavior
The expected behavior is for the set_json_quote_pricing operation to be successfully called without any SOAPFault being raised, as was the case with Savon version 2.12.

Actual Behavior
When calling the set_json_quote_pricing operation, a SOAPFault error occurs indicating an issue with a procedure named setJSONQuotePricingIn.

Environment
Ruby version: 3.3.4
Savon version: 2.15
HTTPi version: 4.0.4
pcai commented 3 weeks ago

Thanks. Can you provide an example wsdl (or the relevant part of it)? Or can you record the calls in both versions (enable http logging) and post the output from savon so we can see what changed?

Won't be able to reproduce your issue to fix it otherwise.

yrmallu commented 3 weeks ago

@pcai Thank you for your prompt response. Below are the SOAP request and response logs for both version 2.12.0 (which works as expected) and version 2.15.1 (where the issue occurs).

MY WSDL file looks like

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://example/quote" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" name="ServiceController" targetNamespace="http://example/quote">

<operation name="setVendorQuoteStatus">
  <documentation>setVendorQuoteStatus</documentation>
  <input message="tns:setVendorQuoteStatusIn"/>
  <output message="tns:setVendorQuoteStatusOut"/>
</operation>
<message name="setVendorQuoteStatusIn">
  <part name="data" type="xsd:string"/>
</message>
<message name="setVendorQuoteStatusOut">
  <part name="return" type="xsd:boolean"/>
</message>
<binding name="ServiceControllerBinding" type="tns:ServiceControllerPort">
  <operation name="setVendorQuoteStatus">
    <soap:operation soapAction="http://example/quote#setVendorQuoteStatus"/>
    <input>
      <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://example/quote"/>
    </input>
    <output>
      <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://example/quote"/>
    </output>
  </operation>
</binding>

<operation name="setJSONQuotePricing">
  <documentation>setJSONQuotePricing</documentation>
  <input message="tns:setJSONQuotePricingIn"/>
  <output message="tns:setJSONQuotePricingOut"/>
</operation>
<message name="setJSONQuotePricingIn">
  <part name="data" type="xsd:string"/>
</message>
<message name="setJSONQuotePricingOut">
  <part name="return" type="xsd:boolean"/>
</message>
<binding name="ServiceControllerBinding" type="tns:ServiceControllerPort">
  <operation name="setJSONQuotePricing">
    <soap:operation soapAction="http://example/quote#setJSONQuotePricing"/>
    <input>
      <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://example/quote"/>
    </input>
    <output>
      <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://example/quote"/>
    </output>
  </operation>
</binding>

Version 2.12.0 Logs:

Request:

worker-1  | I, [2024-08-24T03:34:57.213633 #1]  INFO -- : SOAP request: http://example/quote
worker-1  | I, [2024-08-24T03:34:57.214002 #1]  INFO -- : SOAPAction: "http://example/quote#setJSONQuotePricing", Content-Type: text/xml;charset=UTF-8, Content-Length: 39253
worker-1  | D, [2024-08-24T03:34:57.218191 #1] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?>
worker-1  | <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://example/quote" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
worker-1  |   <env:Body>
worker-1  |     <tns:setJSONQuotePricing>
worker-1  |       <data>...</data>
worker-1  |     </tns:setJSONQuotePricing>
worker-1  |   </env:Body>
worker-1  | </env:Envelope>

Response:

worker-1  | I, [2024-08-24T03:34:57.672429 #1]  INFO -- : SOAP response (status 200)
worker-1  | D, [2024-08-24T03:34:57.672762 #1] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?>
worker-1  | <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://example/quote" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
worker-1  |   <SOAP-ENV:Body>
worker-1  |     <ns1:setJSONQuotePricingResponse>
worker-1  |       <return xsi:type="xsd:boolean">true</return>
worker-1  |     </ns1:setJSONQuotePricingResponse>
worker-1  |   </SOAP-ENV:Body>
worker-1  | </SOAP-ENV:Envelope>

Version 2.15.1 Logs:

Request:

api-1     | I, [2024-08-24T03:59:57.888515 #1]  INFO -- : SOAP request: http://example/quote
api-1     | I, [2024-08-24T03:59:57.888681 #1]  INFO -- : SOAPAction: "http://example/quote#setVendorQuoteStatus"
api-1     | Content-Type: text/xml;charset=UTF-8
api-1     | Content-Length: 698
api-1     | D, [2024-08-24T03:59:57.890289 #1] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?>
api-1     | <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://example/quote" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/">
api-1     |   <env:Body>
api-1     |     <tns:setVendorQuoteStatusIn>
api-1     |       <data>{"quoteReference":"test","message":null,"vendor":null,"status":0}</data>
api-1     |     </tns:setVendorQuoteStatusIn>
api-1     |   </env:Body>
api-1     | </env:Envelope>

Response:

Response:
api-1     | I, [2024-08-24T03:59:58.033572 #1]  INFO -- : SOAP response (status 500)
api-1     | D, [2024-08-24T03:59:58.033741 #1] DEBUG -- : date: Sat, 24 Aug 2024 03:59:57 GMT
api-1     | server: Apache
api-1     | content-length: 313
api-1     | content-type: text/xml; charset=utf-8
api-1     | D, [2024-08-24T03:59:58.034075 #1] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?>
api-1     | <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
api-1     |   <SOAP-ENV:Body>
api-1     |     <SOAP-ENV:Fault>
api-1     |       <faultcode>SOAP-ENV:Server</faultcode>
api-1     |       <faultstring>Procedure 'setVendorQuoteStatusIn' not present</faultstring>
api-1     |     </SOAP-ENV:Fault>
api-1     |   </SOAP-ENV:Body>
api-1     | </SOAP-ENV:Envelope>

Log trace:

| I, [2024-08-24T03:59:58.057232 #1]  INFO -- : SOAPFault: (SOAP-ENV:Server) Procedure 'setVendorQuoteStatusIn' not present  ["/usr/local/bundle/gems/savon-2.15.1/lib/savon/response.rb:132:in `raise_soap_and_http_errors!'", "/usr/local/bundle/gems/savon-2.15.1/lib/savon/response.rb:20:in `initialize'", "/usr/local/bundle/gems/savon-2.15.1/lib/savon/operation.rb:76:in `new'", "/usr/local/bundle/gems/savon-2.15.1/lib/savon/operation.rb:76:in `create_response'", "/usr/local/bundle/gems/savon-2.15.1/lib/savon/operation.rb:65:in `call'", "/usr/local/bundle/gems/savon-2.15.1/lib/savon/client.rb:37:in `call'", "/app/app/models/psp.rb:70:in `set_vendor_quote_status'", "/app/app/models/health.rb:225:in `psp_connection'", "/app/app/models/health.rb:96:in `initialize'", "/app/app/models/health.rb:74:in `new'", "/app/app/models/health.rb:74:in `get'", "/app/app/controllers/utils_controller.rb:4:in `health'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/abstract_controller/base.rb:228:in `process_action'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_controller/metal/rendering.rb:30:in `process_action'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/abstract_controller/callbacks.rb:42:in `block in process_action'", "/usr/local/bundle/gems/activesupport-6.1.7.8/lib/active_support/callbacks.rb:98:in `run_callbacks'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/abstract_controller/callbacks.rb:41:in `process_action'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_controller/metal/rescue.rb:22:in `process_action'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'", "/usr/local/bundle/gems/activesupport-6.1.7.8/lib/active_support/notifications.rb:203:in `block in instrument'", "/usr/local/bundle/gems/activesupport-6.1.7.8/lib/active_support/notifications/instrumenter.rb:24:in `instrument'", "/usr/local/bundle/gems/activesupport-6.1.7.8/lib/active_support/notifications.rb:203:in `instrument'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_controller/metal/instrumentation.rb:33:in `process_action'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_controller/metal/params_wrapper.rb:249:in `process_action'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/abstract_controller/base.rb:165:in `process'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_controller/metal.rb:190:in `dispatch'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_controller/metal.rb:254:in `dispatch'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/routing/route_set.rb:50:in `dispatch'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/routing/route_set.rb:33:in `serve'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/journey/router.rb:50:in `block in serve'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/journey/router.rb:32:in `each'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/journey/router.rb:32:in `serve'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/routing/route_set.rb:842:in `call'", "/usr/local/bundle/gems/rack-2.2.9/lib/rack/session/abstract/id.rb:266:in `context'", "/usr/local/bundle/gems/rack-2.2.9/lib/rack/session/abstract/id.rb:260:in `call'", "/usr/local/bundle/gems/rack-2.2.9/lib/rack/etag.rb:27:in `call'", "/usr/local/bundle/gems/rack-2.2.9/lib/rack/conditional_get.rb:27:in `call'", "/usr/local/bundle/gems/rack-2.2.9/lib/rack/head.rb:12:in `call'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'", "/usr/local/bundle/gems/activesupport-6.1.7.8/lib/active_support/callbacks.rb:98:in `run_callbacks'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/callbacks.rb:26:in `call'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/executor.rb:14:in `call'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'", "/usr/local/bundle/gems/lograge-0.11.2/lib/lograge/rails_ext/rack/logger.rb:15:in `call_app'", "/usr/local/bundle/gems/railties-6.1.7.8/lib/rails/rack/logger.rb:28:in `call'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'", "/usr/local/bundle/gems/request_store-1.7.0/lib/request_store/middleware.rb:19:in `call'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/request_id.rb:26:in `call'", "/usr/local/bundle/gems/rack-2.2.9/lib/rack/runtime.rb:22:in `call'", "/usr/local/bundle/gems/activesupport-6.1.7.8/lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/executor.rb:14:in `call'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/static.rb:24:in `call'", "/usr/local/bundle/gems/rack-2.2.9/lib/rack/sendfile.rb:110:in `call'", "/usr/local/bundle/gems/actionpack-6.1.7.8/lib/action_dispatch/middleware/host_authorization.rb:142:in `call'", "/usr/local/bundle/gems/railties-6.1.7.8/lib/rails/engine.rb:539:in `call'", "/usr/local/bundle/gems/puma-5.6.8/lib/puma/configuration.rb:252:in `call'", "/usr/local/bundle/gems/puma-5.6.8/lib/puma/request.rb:77:in `block in handle_request'", "/usr/local/bundle/gems/puma-5.6.8/lib/puma/thread_pool.rb:340:in `with_force_shutdown'", "/usr/local/bundle/gems/puma-5.6.8/lib/puma/request.rb:76:in `handle_request'", "/usr/local/bundle/gems/puma-5.6.8/lib/puma/server.rb:443:in `process_client'", "/usr/local/bundle/gems/puma-5.6.8/lib/puma/thread_pool.rb:147:in `block in spawn_thread'"]