Skip to content

Commit

Permalink
Fixed namespace resolution in case of complexType extension. (#1145)
Browse files Browse the repository at this point in the history
* Adding complex wsdl test "should parse complex wsdls" in file "wsdl-parse-test.js".

* Fixed namespace resolution in case of complexType extension.

Co-authored-by: Stephane Tondini <stondini@cbhbank.com>
  • Loading branch information
stondini and Stephane Tondini committed Jun 1, 2021
1 parent 290e3c1 commit a913515
Show file tree
Hide file tree
Showing 9 changed files with 436 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/wsdl/index.ts
Expand Up @@ -1087,7 +1087,7 @@ export class WSDL {
if (child.$base) {
const baseQName = splitQName(child.$base);
const childNameSpace = baseQName.prefix === TNS_PREFIX ? '' : baseQName.prefix;
childNsURI = child.xmlns[baseQName.prefix] || this.definitions.xmlns[baseQName.prefix];
childNsURI = child.xmlns[baseQName.prefix] || child.schemaXmlns[baseQName.prefix];

const foundBase = this.findSchemaType(baseQName.name, childNsURI);

Expand Down
67 changes: 66 additions & 1 deletion test/client-test.js
Expand Up @@ -1671,4 +1671,69 @@ describe('Client using stream and returnSaxStream', () => {
}, null, null);
}, baseUrl);
});
})
});

describe('Client posting complex body', () => {
let server = null;
let hostname = '127.0.0.1';
let port = 15099;
let baseUrl = 'http://' + hostname + ':' + port;
const envelope = '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
+ ' xmlns:xsd="http://www.w3.org/2001/XMLSchema"'
+ ' xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'
+ '<soap:Body><Response>Hello</Response></soap:Body></soap:Envelope>'

before(function (done) {
server = http.createServer(function (req, res) {
res.statusCode = 200;
res.write(envelope, 'utf8');
res.end();
}).listen(port, hostname, done);
});

after(function (done) {
server.close();
server = null;
done();
});

it('should serialize complex body', function (done) {
soap.createClient(__dirname + '/wsdl/complex/registration-common.wsdl', function (err, client) {
if (err) {
return void done(err);
}
assert.ok(client);

var requestBody = {
id: 'ID00000000000000000000000000000000',
lastName: 'Doe',
firstName: 'John',
dateOfBirth: '1970-01-01',
correspondenceLanguage: 'ENG',
emailAddress: 'jdoe@doe.com',
lookupPermission: 'ALLOWED',
companyAddress: {
address: {
streetName: 'Street',
postalCode: 'Code',
city: 'City',
countryCode: 'US'
},
companyName: 'ACME'
}
}

client.registerUser(requestBody, function (err, result) {
assert.ok(client.lastRequest);
assert.ok(client.lastMessage);
assert.ok(client.lastEndpoint);

console.log(client.lastMessage);
const expectedBody = '<registrationMessages:registerUserRequest xmlns:registrationMessages="http://test-soap.com/api/registration/messages" xmlns="http://test-soap.com/api/registration/messages"><registrationMessages:id>ID00000000000000000000000000000000</registrationMessages:id><registrationMessages:lastName>Doe</registrationMessages:lastName><registrationMessages:firstName>John</registrationMessages:firstName><registrationMessages:dateOfBirth>1970-01-01</registrationMessages:dateOfBirth><registrationMessages:correspondenceLanguage>ENG</registrationMessages:correspondenceLanguage><registrationMessages:emailAddress>jdoe@doe.com</registrationMessages:emailAddress><registrationMessages:lookupPermission>ALLOWED</registrationMessages:lookupPermission><registrationMessages:companyAddress><ct:address xmlns:ct="http://test-soap.com/api/common/types"><ct:streetName>Street</ct:streetName><ct:postalCode>Code</ct:postalCode><ct:city>City</ct:city><ct:countryCode>US</ct:countryCode></ct:address><ct:companyName xmlns:ct="http://test-soap.com/api/common/types">ACME</ct:companyName></registrationMessages:companyAddress></registrationMessages:registerUserRequest>';
assert.strictEqual(client.lastMessage, expectedBody);

done();
});
}, baseUrl);
});
});
73 changes: 73 additions & 0 deletions test/wsdl-parse-test.js
Expand Up @@ -72,4 +72,77 @@ describe(__filename, function () {
done();
});
});

it('should parse complex wsdls', function (done) {
open_wsdl(path.resolve(__dirname, 'wsdl/complex/registration-common.wsdl'), function (err, def) {

This comment has been minimized.

Copy link
@simonwebdev000000001

simonwebdev000000001 Dec 11, 2021

@stondini can you please commit realization for open_wsdl ? iam trying to use xmlToObject, but facing an error TypeError: Cannot read property 'messages' of undefined

   const wsdl = new WSDL(this.wsdl, this.options.url, {});
      const s = new Readable();
      s._read = () => {}; 
      s.push(res.data); 
      wsdl.xmlToObject(s, (...e: any) => {
        console.log('xmlToObject', e);
      });
      ```
if (err) {
return done( err );
}

if (null === def.findSchemaType('recipientAddress', 'http://test-soap.com/api/common/types')) {
return done( 'Unable to find "recipientAddress" complex type' );
}
if (null === def.findSchemaType('commonAddress', 'http://test-soap.com/api/common/types')) {
return done( 'Unable to find "commonAddress" complex type' );
}
if (null === def.findSchemaType('companyAddress', 'http://test-soap.com/api/common/types')) {
return done( 'Unable to find "companyAddress" complex type' );
}
if (null === def.findSchemaObject('http://test-soap.com/api/registration/messages', 'registerUserRequest')) {
return done( 'Unable to find "registerUserRequest" schema object' );
}

var requestBody = {
id: 'ID00000000000000000000000000000000',
lastName: 'Doe',
firstName: 'John',
dateOfBirth: '1970-01-01',
correspondenceLanguage: 'ENG',
emailAddress: 'jdoe@doe.com',
lookupPermission: 'ALLOWED',
companyAddress: {
address: {
streetName: 'Street',
postalCode: 'Code',
city: 'City',
countryCode: 'US'
},
companyName: 'ACME'
}
}

var requestAsXML = def.objectToDocumentXML(
'registerUserRequest',
requestBody,
'msg',
'http://test-soap.com/api/registration/messages',
'registerUserRequest'
);

/*
Expected XML:
<msg:registerUserRequest xmlns:msg="http://test-soap.com/api/registration/messages" xmlns="http://test-soap.com/api/registration/messages">
<msg:id>ID00000000000000000000000000000000</msg:id>
<msg:lastName>Doe</msg:lastName>
<msg:firstName>John</msg:firstName>
<msg:dateOfBirth>1970-01-01</msg:dateOfBirth>
<msg:correspondenceLanguage>ENG</msg:correspondenceLanguage>
<msg:emailAddress>jdoe@doe.com</msg:emailAddress>
<msg:lookupPermission>ALLOWED</msg:lookupPermission>
<msg:companyAddress>
<ct:address xmlns:ct="http://test-soap.com/api/common/types">
<ct:streetName>Street</ct:streetName>
<ct:postalCode>Code</ct:postalCode>
<ct:city>City</ct:city>
<ct:countryCode>US</ct:countryCode>
</ct:address>
<ct:companyName xmlns:ct="http://test-soap.com/api/common/types">ACME</ct:companyName>
</msg:companyAddress>
</msg:registerUserRequest>
*/
assert.strictEqual(requestAsXML, '<msg:registerUserRequest xmlns:msg="http://test-soap.com/api/registration/messages" xmlns="http://test-soap.com/api/registration/messages"><msg:id>ID00000000000000000000000000000000</msg:id><msg:lastName>Doe</msg:lastName><msg:firstName>John</msg:firstName><msg:dateOfBirth>1970-01-01</msg:dateOfBirth><msg:correspondenceLanguage>ENG</msg:correspondenceLanguage><msg:emailAddress>jdoe@doe.com</msg:emailAddress><msg:lookupPermission>ALLOWED</msg:lookupPermission><msg:companyAddress><ct:address xmlns:ct="http://test-soap.com/api/common/types"><ct:streetName>Street</ct:streetName><ct:postalCode>Code</ct:postalCode><ct:city>City</ct:city><ct:countryCode>US</ct:countryCode></ct:address><ct:companyName xmlns:ct="http://test-soap.com/api/common/types">ACME</ct:companyName></msg:companyAddress></msg:registerUserRequest>');

done();
});
});
});
36 changes: 36 additions & 0 deletions test/wsdl/complex/common-messages.xsd
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://test-soap.com/api/common/messages"
xmlns:tns="http://test-soap.com/api/common/messages"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="5.0">

<xsd:annotation>
<xsd:documentation>Common Messages</xsd:documentation>
</xsd:annotation>

<xsd:complexType name="errorDetailParameter">
<xsd:sequence>
<xsd:element name="key" type="xsd:string"/>
<xsd:element name="value" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="errorDetailParameters">
<xsd:sequence>
<xsd:element name="parameter" type="tns:errorDetailParameter" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>

<xsd:element name="errorDetail">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="code" type="xsd:string"/>
<xsd:element name="message" type="xsd:string"/>
<xsd:element name="parameters" type="tns:errorDetailParameters" minOccurs="0"/>
<xsd:element name="staleData" type="xsd:boolean" default="false"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

</xsd:schema>
111 changes: 111 additions & 0 deletions test/wsdl/complex/common-types.xsd
@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://test-soap.com/api/common/types"
xmlns:tns="http://test-soap.com/api/common/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
version="5.0">

<xsd:annotation>
<xsd:documentation>Common Types</xsd:documentation>
</xsd:annotation>

<xsd:simpleType name="mandatoryStringType">
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="mandatoryStringWithMaxLength35Type">
<xsd:restriction base="tns:mandatoryStringType">
<xsd:maxLength value="35"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="mandatoryStringWithMaxLength70Type">
<xsd:restriction base="tns:mandatoryStringType">
<xsd:maxLength value="70"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="emailAddressType">
<xsd:restriction base="tns:mandatoryStringType">
<xsd:maxLength value="256"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="correspondenceLanguageType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="GER"/>
<xsd:enumeration value="ITA"/>
<xsd:enumeration value="FRE"/>
<xsd:enumeration value="ENG"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="idType">
<xsd:restriction base="tns:mandatoryStringType">
<xsd:pattern value="ID[A-Z0-9]{32}"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="lookupType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="ALLOWED"/>
<xsd:enumeration value="NOT_ALLOWED"/>
<xsd:enumeration value="UNDECIDED"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="postalCodeType">
<xsd:restriction base="tns:mandatoryStringType">
<xsd:maxLength value="9"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="countryCodeType">
<xsd:annotation>
<xsd:documentation>ISO-3166</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[A-Z]{2}"/>
</xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="recipientAddress">
<xsd:sequence>
<xsd:element name="streetName" type="tns:mandatoryStringWithMaxLength70Type"/>
<xsd:element name="postalCode" type="tns:postalCodeType"/>
<xsd:element name="city" type="tns:mandatoryStringWithMaxLength35Type"/>
<xsd:element name="countryCode" type="tns:countryCodeType"/>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="commonAddress" abstract="true">
<xsd:sequence>
<xsd:element name="address" type="tns:recipientAddress"/>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="privateAddress">
<xsd:complexContent>
<xsd:extension base="tns:commonAddress"/>
</xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="companyAddress">
<xsd:complexContent>
<xsd:extension base="tns:commonAddress">
<xsd:sequence>
<xsd:element name="companyName" type="tns:mandatoryStringWithMaxLength70Type"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

<xsd:simpleType name="userIdType">
<xsd:restriction base="tns:mandatoryStringType">
<xsd:pattern value="EBID[A-Z0-9]{32}"/>
</xsd:restriction>
</xsd:simpleType>

</xsd:schema>
63 changes: 63 additions & 0 deletions test/wsdl/complex/registration-common.wsdl
@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="RegistrationCommonApi"
targetNamespace="http://test-soap.com/api/registration"
xmlns:tns="http://test-soap.com/api/registration"
xmlns:registrationMessages="http://test-soap.com/api/registration/messages"
xmlns:commonMessages="http://test-soap.com/api/common/messages"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
>

<wsdl:documentation>Registration Web Service Definition</wsdl:documentation>

<wsdl:types>
<xsd:schema targetNamespace="http://test-soap.com/api/registration" elementFormDefault="qualified">
<xsd:import namespace="http://test-soap.com/api/registration/messages" schemaLocation="registration-messages-common.xsd"/>
<xsd:import namespace="http://test-soap.com/api/common/messages" schemaLocation="common-messages.xsd"/>
<xsd:import namespace="http://test-soap.com/api/common/types" schemaLocation="common-types.xsd"/>
</xsd:schema>
</wsdl:types>

<wsdl:message name="registerUserRequestMessage">
<wsdl:part name="registerUserRequest" element="registrationMessages:registerUserRequest"/>
</wsdl:message>
<wsdl:message name="registerUserResponseMessage">
<wsdl:part name="registerUserResponse" element="registrationMessages:registerUserResponse"/>
</wsdl:message>

<wsdl:portType name="registrationCommonPortType">

<wsdl:operation name="registerUser">
<wsdl:input name="registerUserRequestMessage" message="tns:registerUserRequestMessage"/>
<wsdl:output name="registerUserResponseMessage" message="tns:registerUserResponseMessage"/>
<wsdl:fault name="errorDetail" message="tns:errorDetailMessage"/>
</wsdl:operation>

</wsdl:portType>

<wsdl:binding name="registrationCommonHttpSoapBinding" type="tns:registrationCommonPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="registerUser">
<soap:operation soapAction="http://test-soap.com/api/registration/registerUser"/>
<wsdl:input>
<soap:body parts="registerUserRequest" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body parts="registerUserResponse" use="literal"/>
</wsdl:output>
<wsdl:fault name="errorDetail">
<soap:fault name="errorDetail" use="literal"/>
</wsdl:fault>
</wsdl:operation>

</wsdl:binding>

<wsdl:service name="registrationCommon">
<wsdl:port name="registrationCommonHttpSoapPort" binding="tns:registrationCommonHttpSoapBinding">
<soap:address location="https://{{SERVER}}/api/api/v5/registration"/>
</wsdl:port>
</wsdl:service>

</wsdl:definitions>

0 comments on commit a913515

Please sign in to comment.