loopbackio / strong-soap

SOAP driver for Node.js (A complete rewrite of node-soap)
Other
391 stars 162 forks source link

Add response's suffixes to handle S/4HANA SOAP services #273

Closed kimveasna closed 4 years ago

kimveasna commented 4 years ago

Description/Steps to reproduce

I am using loopback 4 to connect to my SAP S/4HANA system. When using the soap connector to consume services exposed in my backend (as described here https://loopback.io/doc/en/lb4/SOAP-Connector-example.html), it returns no data whereas call is successful with a response payload (as checked in debug). After analysis, it turns out SAP S/4HANA webservice's response is suffixed with ".Response"

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <ns1:BAPI_USER_GET_DETAIL.Response xmlns:ns1="urn:sap-com:document:sap:rfc:functions">
[...]
        </ns1:BAPI_USER_GET_DETAIL.Response>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

This is not handled in client.js, line 336

if (!result) {
          ['Response', 'Out', 'Output'].forEach(function(term) {
            if (obj.Body.hasOwnProperty(name + term)) {
              return result = obj.Body[name + term];
            }
          });
        }

Link to reproduction sandbox

Issue can be reproduced with a mock server which would provide the following response:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <ns1:BAPI_USER_GET_DETAIL.Response xmlns:ns1="urn:sap-com:document:sap:rfc:functions">
            <ADDRESS>
                <PERS_NO>0000023445</PERS_NO>
                <ADDR_NO>0000023425</ADDR_NO>
                <TITLE_P></TITLE_P>
                <FIRSTNAME></FIRSTNAME>
                <LASTNAME>XYZ</LASTNAME>
                <BIRTH_NAME></BIRTH_NAME>
                <MIDDLENAME></MIDDLENAME>
                <SECONDNAME></SECONDNAME>
                <FULLNAME>XYZ</FULLNAME>
                <FULLNAME_X></FULLNAME_X>
                <TITLE_ACA1></TITLE_ACA1>
                <TITLE_ACA2></TITLE_ACA2>
                <PREFIX1></PREFIX1>
                <PREFIX2></PREFIX2>
                <TITLE_SPPL></TITLE_SPPL>
                <NICKNAME></NICKNAME>
                <INITIALS></INITIALS>
                <NAMEFORMAT></NAMEFORMAT>
                <NAMCOUNTRY></NAMCOUNTRY>
                <LANGU_P></LANGU_P>
                <LANGUP_ISO></LANGUP_ISO>
                <SORT1_P></SORT1_P>
                <SORT2_P></SORT2_P>
                <DEPARTMENT></DEPARTMENT>
                <FUNCTION></FUNCTION>
                <BUILDING_P></BUILDING_P>
                <FLOOR_P></FLOOR_P>
                <ROOM_NO_P></ROOM_NO_P>
                <INITS_SIG></INITS_SIG>
                <INHOUSE_ML></INHOUSE_ML>
                <COMM_TYPE>INT</COMM_TYPE>
                <TITLE></TITLE>
                <NAME>Company address - please maintain</NAME>
                <NAME_2>Default company address for SAP users</NAME_2>
                <NAME_3></NAME_3>
                <NAME_4></NAME_4>
                <C_O_NAME></C_O_NAME>
                <CITY></CITY>
                <DISTRICT></DISTRICT>
                <CITY_NO></CITY_NO>
                <DISTRCT_NO></DISTRCT_NO>
                <CHCKSTATUS></CHCKSTATUS>
                <POSTL_COD1></POSTL_COD1>
                <POSTL_COD2></POSTL_COD2>
                <POSTL_COD3></POSTL_COD3>
                <PO_BOX></PO_BOX>
                <PO_BOX_CIT></PO_BOX_CIT>
                <PBOXCIT_NO></PBOXCIT_NO>
                <DELIV_DIS></DELIV_DIS>
                <TRANSPZONE></TRANSPZONE>
                <STREET></STREET>
                <STREET_NO></STREET_NO>
                <STR_ABBR></STR_ABBR>
                <HOUSE_NO></HOUSE_NO>
                <HOUSE_NO2></HOUSE_NO2>
                <STR_SUPPL1></STR_SUPPL1>
                <STR_SUPPL2></STR_SUPPL2>
                <STR_SUPPL3></STR_SUPPL3>
                <LOCATION></LOCATION>
                <BUILDING></BUILDING>
                <FLOOR></FLOOR>
                <ROOM_NO></ROOM_NO>
                <COUNTRY></COUNTRY>
                <COUNTRYISO></COUNTRYISO>
                <LANGU></LANGU>
                <LANGU_ISO></LANGU_ISO>
                <REGION></REGION>
                <SORT1></SORT1>
                <SORT2></SORT2>
                <TIME_ZONE></TIME_ZONE>
                <TAXJURCODE></TAXJURCODE>
                <ADR_NOTES></ADR_NOTES>
                <TEL1_NUMBR></TEL1_NUMBR>
                <TEL1_EXT></TEL1_EXT>
                <FAX_NUMBER></FAX_NUMBER>
                <FAX_EXTENS></FAX_EXTENS>
                <E_MAIL>kimveasna@xyz-it.fr</E_MAIL>
                <BUILD_LONG></BUILD_LONG>
                <REGIOGROUP></REGIOGROUP>
                <HOME_CITY></HOME_CITY>
                <HOMECITYNO></HOMECITYNO>
                <PCODE1_EXT></PCODE1_EXT>
                <PCODE2_EXT></PCODE2_EXT>
                <PCODE3_EXT></PCODE3_EXT>
                <PO_W_O_NO></PO_W_O_NO>
                <PO_BOX_REG></PO_BOX_REG>
                <POBOX_CTRY></POBOX_CTRY>
                <PO_CTRYISO></PO_CTRYISO>
                <DONT_USE_S></DONT_USE_S>
                <DONT_USE_P></DONT_USE_P>
                <HOUSE_NO3></HOUSE_NO3>
                <LANGU_CR_P></LANGU_CR_P>
                <LANGUCPISO></LANGUCPISO>
                <PO_BOX_LOBBY></PO_BOX_LOBBY>
                <DELI_SERV_TYPE></DELI_SERV_TYPE>
                <DELI_SERV_NUMBER></DELI_SERV_NUMBER>
                <COUNTY_CODE></COUNTY_CODE>
                <COUNTY></COUNTY>
                <TOWNSHIP_CODE></TOWNSHIP_CODE>
                <TOWNSHIP></TOWNSHIP>
                <XPCPT></XPCPT>
            </ADDRESS>
            <ADMINDATA>
                <ANAME>SAP*</ANAME>
                <ERDAT>2018-11-04</ERDAT>
                <TRDAT>2020-03-07</TRDAT>
            </ADMINDATA>
            <ALIAS>
                <USERALIAS></USERALIAS>
            </ALIAS>
            <COMPANY>
                <COMPANY>DEFAULT_COMPANY</COMPANY>
                <TEMPLATE_ORGTYPE></TEMPLATE_ORGTYPE>
            </COMPANY>
            <DEFAULTS>
                <STCOD></STCOD>
                <SPLD></SPLD>
                <SPLG></SPLG>
                <SPDB>H</SPDB>
                <SPDA>K</SPDA>
                <DATFM>1</DATFM>
                <DCPFM></DCPFM>
                <LANGU></LANGU>
                <CATTKENNZ></CATTKENNZ>
                <KOSTL></KOSTL>
                <START_MENU></START_MENU>
                <TIMEFM>0</TIMEFM>
            </DEFAULTS>
            <DESCRIPTION>
                <RESPONSIBLE></RESPONSIBLE>
                <TECHDESC></TECHDESC>
            </DESCRIPTION>
            <IDENTITY>
                <IDENTITY_UUID>000c299f-5430-1ee8-b886-833e4d41069a</IDENTITY_UUID>
                <BPPERSON></BPPERSON>
            </IDENTITY>
            <ISLOCKED>
                <WRNG_LOGON>U</WRNG_LOGON>
                <LOCAL_LOCK>U</LOCAL_LOCK>
                <GLOB_LOCK>U</GLOB_LOCK>
                <NO_USER_PW>U</NO_USER_PW>
            </ISLOCKED>
            <LASTMODIFIED>
                <MODDATE>2020-02-11</MODDATE>
                <MODTIME>23:00:32</MODTIME>
                <MODIFIER>XYZ</MODIFIER>
            </LASTMODIFIED>
            <LOGONDATA>
                <GLTGV>0000-00-00</GLTGV>
                <GLTGB>0000-00-00</GLTGB>
                <USTYP>A</USTYP>
                <CLASS>SUPER</CLASS>
                <ACCNT></ACCNT>
                <TZONE></TZONE>
                <LTIME>03:04:35</LTIME>
                <BCODE>AAAAAAAAAAA=</BCODE>
                <CODVN></CODVN>
                <PASSCODE>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</PASSCODE>
                <CODVC></CODVC>
                <PWDSALTEDHASH>{x-issha, 1024}tcGok4KvwLO7KrENXoYuvxl7k52t+3IBmnRmiNU7F3M=</PWDSALTEDHASH>
                <CODVS>H</CODVS>
                <SECURITY_POLICY></SECURITY_POLICY>
            </LOGONDATA>
            <REF_USER>
                <REF_USER></REF_USER>
            </REF_USER>
            <SNC>
                <GUIFLAG></GUIFLAG>
                <PNAME></PNAME>
            </SNC>
            <UCLASS>
                <LIC_TYPE></LIC_TYPE>
                <SPEC_VERS></SPEC_VERS>
                <COUNTRY_SURCHARGE>0</COUNTRY_SURCHARGE>
                <SUBSTITUTE_FROM>0000-00-00</SUBSTITUTE_FROM>
                <SUBSTITUTE_UNTIL>0000-00-00</SUBSTITUTE_UNTIL>
                <SYSID></SYSID>
                <CLIENT></CLIENT>
                <BNAME_CHARGEABLE></BNAME_CHARGEABLE>
            </UCLASS>
        </ns1:BAPI_USER_GET_DETAIL.Response>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Expected result

The expected JSON response from soap response is:

{
   "ADDRESS":{
      "PERS_NO":"0000023445",
      "ADDR_NO":"0000023425",
      "LASTNAME":"XYZ",
      "FULLNAME":"XYZ",
      "COMM_TYPE":"INT",
      "NAME":"Company address - please maintain",
      "NAME_2":"Default company address for SAP users",
      "E_MAIL":"kimveasna@xyz-it.fr"
   },
   "ADMINDATA":{
      "ANAME":"SAP*",
      "ERDAT":"2018-11-04",
      "TRDAT":"2020-03-14"
   },
   "ALIAS":{

   },
   "COMPANY":{
      "COMPANY":"DEFAULT_COMPANY"
   },
   "DEFAULTS":{
      "SPDB":"H",
      "SPDA":"K",
      "DATFM":"1",
      "TIMEFM":"0"
   },
   "DESCRIPTION":{

   },
   "IDENTITY":{
      "IDENTITY_UUID":"000c299f-5430-1ee8-b886-833e4d41069a"
   },
   "ISLOCKED":{
      "WRNG_LOGON":"U",
      "LOCAL_LOCK":"U",
      "GLOB_LOCK":"U",
      "NO_USER_PW":"U"
   },
   "LASTMODIFIED":{
      "MODDATE":"2020-02-11",
      "MODTIME":"23:00:32",
      "MODIFIER":"XYZ"
   },
   "LOGONDATA":{
      "GLTGV":"0000-00-00",
      "GLTGB":"0000-00-00",
      "USTYP":"A",
      "CLASS":"SUPER",
      "LTIME":"11:53:21",
      "BCODE":"AAAAAAAAAAA=",
      "PASSCODE":"AAAAAAAAAAAAAAAAAAAAAAAAAAA=",
      "PWDSALTEDHASH":"{x-issha, 1024}tcGok4KvwLO7KrENXoYuvxl7k52t+3IBmnRmiNU7F3M=",
      "CODVS":"H"
   },
   "REF_USER":{

   },
   "SNC":{

   },
   "UCLASS":{
      "COUNTRY_SURCHARGE":"0",
      "SUBSTITUTE_FROM":"0000-00-00",
      "SUBSTITUTE_UNTIL":"0000-00-00"
   }
}

Additional information

I may have done things in wrong orders, as the pull request has been submitted before the issue (PR 271), and my fork is available here https://github.com/kimveasna/strong-soap.

emonddr commented 4 years ago

strong-soap 2.0.0 is now available with fix.

https://www.npmjs.com/package/strong-soap

kimveasna commented 4 years ago

strong-soap 2.0.0 is now available with fix.

https://www.npmjs.com/package/strong-soap

Thanks!