Skip to content

Commit aa386e1

Browse files
authoredOct 6, 2016
Merge pull request #28 from strongloop/soap-fixes
Debug support & fixed warning msgs
2 parents f5c2d53 + 8a67a21 commit aa386e1

File tree

9 files changed

+105
-32
lines changed

9 files changed

+105
-32
lines changed
 

‎example/weather.js

+27-9
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,45 @@ soap.createClient(url, clientOptions, function(err, client) {
2626
//navigate to the correct operation in the client using [service][port][operation] since GetCityWeatherByZIP operation is used
2727
//by more than one port.
2828
var method = client['Weather']['WeatherSoap']['GetCityWeatherByZIP'];
29+
//this describes the entire WSDL in a tree form.
30+
var description = client.describe();
31+
//inspect GetCityWeatherByZIP operation
32+
var operation = description.Weather.WeatherSoap.GetCityWeatherByZIP;
33+
console.log('Invoking operation: ' + operation.name);
34+
2935
//you can also call
3036
method(requestArgs, function(err, result, envelope, soapHeader) {
37+
console.log('Response envelope:');
3138
//response envelope
3239
console.log(envelope);
33-
//result in SOAP envelope body which is the wrapper element. In this case, result object corresponds to GetCityForecastByZIPResponse
34-
console.log(JSON.stringify(result));
35-
//this describes the entire WSDL in a tree form.
36-
var description = client.describe();
37-
//inspect GetCityWeatherByZIP operation
38-
var operation = description.Weather.WeatherSoap.GetCityWeatherByZIP;
40+
41+
var response;
42+
if (!err) {
43+
console.log('Result:');
44+
//result in SOAP envelope body which is the wrapper element. In this case, result object corresponds to GetCityForecastByZIPResponse
45+
console.log(JSON.stringify(result));
46+
response = result;
47+
} else {
48+
response = err.root;
49+
}
3950

4051
var node = xmlHandler.jsonToXml(null, null,
41-
XMLHandler.createSOAPEnvelopeDescriptor('soap'), result);
52+
XMLHandler.createSOAPEnvelopeDescriptor('soap'), response);
53+
4254
var xml = node.end({pretty: true});
55+
console.log('jsonToXml:');
4356
console.log(xml);
4457

45-
var root = xmlHandler.xmlToJson(null, xml, null);
46-
console.log('%s', util.inspect(root, {depth: null}));
58+
var root;
59+
try {
60+
root = xmlHandler.xmlToJson(null, xml, null);
61+
} catch (error) {
62+
//do nothing
63+
}
4764

4865
var root = XMLHandler.parseXml(null, xml);
4966
var result = root.end({pretty: true});
67+
console.log('parseXml:');
5068
console.log(result);
5169

5270

‎src/client.js

+36-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ var HttpClient = require('./http'),
1616
Base = require('./base'),
1717
util = require('util'),
1818
_ = require('lodash'),
19-
debug = require('debug')('node-soap:client');
19+
debug = require('debug')('strong-soap:client'),
20+
debugDetail = require('debug')('strong-soap:client:detail'),
21+
debugSensitive = require('debug')('strong-soap:client:sensitive');
2022

2123
class Client extends Base {
2224
constructor(wsdl, endpoint, options) {
@@ -117,14 +119,19 @@ class Client extends Base {
117119
'Content-Type': 'text/xml; charset=utf-8'
118120
};
119121

122+
debug('client request. operation: %s args: %j options: %j extraHeaders: %j', operation.name, args, options, extraHeaders);
123+
120124
var soapNsURI = 'http://schemas.xmlsoap.org/soap/envelope/';
121125
var soapNsPrefix = this.wsdl.options.envelopeKey || 'soap';
122126

127+
123128
if (operation.soapVersion === '1.2') {
124129
headers['Content-Type'] = 'application/soap+xml; charset=utf-8';
125130
soapNsURI = 'http://www.w3.org/2003/05/soap-envelope';
126131
}
127132

133+
debug('client request. soapNsURI: %s soapNsPrefix: %s ', soapNsURI, soapNsPrefix);
134+
128135
if (this.SOAPAction) {
129136
soapAction = this.SOAPAction;
130137
} else if (operation.soapAction != null) {
@@ -137,7 +144,10 @@ class Client extends Base {
137144
headers.SOAPAction = '"' + soapAction + '"';
138145
}
139146

147+
debug('client request. soapAction: %s', soapAction);
148+
140149
options = options || {};
150+
debugSensitive('client request. options: %j', options);
141151

142152
//Add extra headers
143153
for (var header in this.httpHeaders) {
@@ -147,11 +157,19 @@ class Client extends Base {
147157
headers[attr] = extraHeaders[attr];
148158
}
149159

160+
debug('client request. headers: %j', headers);
161+
150162
// Allow the security object to add headers
151-
if (self.security && self.security.addHttpHeaders)
163+
if (self.security && self.security.addHttpHeaders) {
152164
self.security.addHttpHeaders(headers);
153-
if (self.security && self.security.addOptions)
165+
debugSensitive('client request. options: %j', options);
166+
}
167+
if (self.security && self.security.addOptions) {
154168
self.security.addOptions(options);
169+
debugSensitive('client request. options: %j', options);
170+
}
171+
172+
155173

156174
var nsContext = this.createNamespaceContext(soapNsPrefix, soapNsURI);
157175
var xmlHandler = this.xmlHandler || new XMLHandler(options);
@@ -168,6 +186,7 @@ class Client extends Base {
168186

169187
let schemas = defs.schemas;
170188

189+
171190
for(let uri in schemas) {
172191
let complexTypes = schemas[uri].complexTypes;
173192
if(complexTypes) {
@@ -187,9 +206,15 @@ class Client extends Base {
187206
}
188207

189208
var operationDescriptor = operation.describe(this.wsdl.definitions);
209+
debugDetail('client request. operationDescriptor: %j', operationDescriptor);
210+
190211
var inputBodyDescriptor = operationDescriptor.input.body;
212+
debug('client request. inputBodyDescriptor: %j', inputBodyDescriptor);
213+
191214
var inputHeadersDescriptor = operationDescriptor.input.headers;
192215

216+
217+
debug('client request, calling jsonToXml. args: %j', args);
193218
xmlHandler.jsonToXml(soapBodyElement, nsContext, inputBodyDescriptor, args);
194219

195220
if (self.security && self.security.postProcess) {
@@ -225,6 +250,8 @@ class Client extends Base {
225250
self.lastElapsedTime = response && response.elapsedTime;
226251
self.emit('response', body, response);
227252

253+
debug('client response. response: %j body: %j', response, body);
254+
228255
if (err) {
229256
callback(err);
230257
} else {
@@ -238,12 +265,15 @@ class Client extends Base {
238265
var outputEnvDescriptor = operationDescriptor.outputEnvelope;
239266
}
240267
try {
268+
debugDetail('client response. outputEnvDescriptor: %j', outputEnvDescriptor);
241269
obj = xmlHandler.xmlToJson(nsContext, body, outputEnvDescriptor);
242270
} catch (error) {
243271
// When the output element cannot be looked up in the wsdl and the body is JSON
244272
// instead of sending the error, we pass the body in the response.
273+
debug('client response. error message: %s', error.message);
274+
245275
if (!output) {
246-
debug('Response element is not present. Unable to convert response xml to json.');
276+
debug('client response. output not present');
247277
// If the response is JSON then return it as-is.
248278
var json = _.isObject(body) ? body : tryJSONparse(body);
249279
if (json) {
@@ -287,13 +317,15 @@ class Client extends Base {
287317
}
288318
});
289319
}
320+
debug('client response. result: %j body: %j obj.Header: %j', result, body, obj.Header);
290321

291322
callback(null, result, body, obj.Header);
292323
}
293324
}, headers, options, self);
294325

295326
// Added mostly for testability, but possibly useful for debugging
296327
self.lastRequestHeaders = req.headers;
328+
debug('client response. lastRequestHeaders: %j', self.lastRequestHeaders);
297329
}
298330
}
299331

‎src/http.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
var url = require('url');
44
var req = require('request');
5-
var debug = require('debug')('node-soap:http');
5+
var debug = require('debug')('st-soap:http');
66

77
var VERSION = require('../package.json').version;
88

@@ -35,7 +35,7 @@ class HttpClient {
3535
var path = [curl.pathname || '/', curl.search || '', curl.hash || ''].join('');
3636
var method = data ? 'POST' : 'GET';
3737
var headers = {
38-
'User-Agent': 'node-soap/' + VERSION,
38+
'User-Agent': 'strong-soap/' + VERSION,
3939
'Accept': 'text/html,application/xhtml+xml,application/xml,text/xml;q=0.9,*/*;q=0.8',
4040
'Accept-Encoding': 'none',
4141
'Accept-Charset': 'utf-8',

‎src/parser/element.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var QName = require('./qname');
44
var typeRegistry = require('./typeRegistry');
55
var helper = require('./helper');
66
var xsd = require('./xsd');
7-
var debug = require('debug')('node-soap:wsdl');
7+
var debug = require('debug')('strong-soap:wsdl:element');
88

99
var EMPTY_PREFIX = helper.EMPTY_PREFIX;
1010
var namespaces = helper.namespaces;
@@ -80,7 +80,7 @@ class Element {
8080
var ElementType = typeRegistry.getElementType(qname);
8181
if (this.constructor.allowedChildren.indexOf(qname.name) === -1 &&
8282
this.constructor.allowedChildren.indexOf('any') === -1) {
83-
g.warn('Element %s is not allowed within %j', qname, this.nsName);
83+
debug('Element %s is not allowed within %j', qname, this.nsName);
8484
}
8585

8686
if (ElementType) {
@@ -192,7 +192,7 @@ class Element {
192192
}
193193
var schema = schemas[nsURI];
194194
if (!schema) {
195-
g.warn('Schema not found: %s (%s)', qname, elementType);
195+
debug('Schema not found: %s (%s)', qname, elementType);
196196
return null;
197197
}
198198
var found = null;
@@ -220,7 +220,7 @@ class Element {
220220
break;
221221
}
222222
if (!found) {
223-
g.warn('Schema %s not found: %s %s', elementType, nsURI, nsName);
223+
debug('Schema %s not found: %s %s', elementType, nsURI, nsName);
224224
return null;
225225
}
226226
return found;

‎src/parser/wsdl.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var url = require('url');
66
var path = require('path');
77
var assert = require('assert');
88
var stripBom = require('../strip-bom');
9-
var debug = require('debug')('node-soap:wsdl');
9+
var debug = require('debug')('strong-soap:wsdl');
1010
var _ = require('lodash');
1111
var selectn = require('selectn');
1212
var utils = require('./helper');
@@ -96,7 +96,6 @@ class WSDL {
9696

9797
// prepare soap envelope xmlns definition string
9898
self.xmlnsInEnvelope = self._xmlnsMap();
99-
10099
callback(err, self);
101100
});
102101

@@ -233,7 +232,7 @@ class WSDL {
233232
try {
234233
top.startElement(stack, nsName, attrs, options);
235234
} catch (e) {
236-
debug(e);
235+
debug("WSDL error: %s ", e.message);
237236
if (self.options.strict) {
238237
throw e;
239238
} else {
@@ -268,6 +267,7 @@ class WSDL {
268267
top.endElement(stack, name);
269268
};
270269

270+
debug('WSDL xml: %s', xml);
271271
p.write(xml).close();
272272

273273
return root;
@@ -355,6 +355,7 @@ class WSDL {
355355
var request_headers = options.wsdl_headers;
356356
var request_options = options.wsdl_options;
357357

358+
debug('wsdl open. request_headers: %j request_options: %j', request_headers, request_options);
358359
var wsdl;
359360
if (!/^https?:/.test(uri)) {
360361
debug('Reading file: %s', uri);
@@ -371,7 +372,6 @@ class WSDL {
371372
});
372373
}
373374
else {
374-
debug('Reading url: %s', uri);
375375
var httpClient = options.httpClient || new HttpClient(options);
376376
httpClient.request(uri, null /* options */,
377377
function(err, response, definition) {

‎src/parser/wsdl/parameter.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
var WSDLElement = require('./wsdlElement');
22
var QName = require('../qname');
3-
var debug = require('debug')('node-soap:wsdl:parameter');
3+
var debug = require('debug')('strong-soap:wsdl:parameter');
44

55
/**
66
* Base class for Input/Output

‎src/parser/xmlHandler.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ var sax = require('sax');
33
var stream = require('stream');
44
var assert = require('assert');
55
var selectn = require('selectn');
6-
var debug = require('debug')('node-soap:wsdl:xml');
6+
var debug = require('debug')('strong-soap:xmlhandler');
77
var descriptor = require('./xsd/descriptor');
88
var ElementDescriptor = descriptor.ElementDescriptor;
99
var AttributeDescriptor = descriptor.AttributeDescriptor;
@@ -138,7 +138,7 @@ class XMLHandler {
138138
nsContext.popContext();
139139
}
140140
return node;
141-
} else if (typeof val !== 'undefined' && typeof val != null) {
141+
} else if ( val != null) {
142142
let attrs = val[this.options.attributesKey];
143143
if (typeof attrs === 'object') {
144144
for (let p in attrs) {
@@ -161,7 +161,7 @@ class XMLHandler {
161161
}
162162
}
163163

164-
if (typeof val !== 'undefined' && val !== null && ( typeof val !== 'object' || val instanceof Date)) {
164+
if (val != null && ( typeof val !== 'object' || val instanceof Date)) {
165165
// for adding a field value nsContext.popContext() shouldnt be called
166166
element.text(val);
167167
if (nameSpaceContextCreated) {
@@ -346,6 +346,7 @@ class XMLHandler {
346346
static parseXml(root, xml, cb) {
347347
let parser;
348348
let stringMode = true;
349+
debug('XMLHandler parseXML. root: %j xml: %j', root, xml);
349350
if (typeof xml === 'string') {
350351
stringMode = true;
351352
parser = sax.parser(true, {opt: {xmlns: true}});

‎src/server.js

+21-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ var url = require('url'),
1212
XMLHandler = require('./parser/xmlHandler'),
1313
Base = require('./base'),
1414
toXMLDate = require('./utils').toXMLDate,
15-
util = require('util');
15+
util = require('util'),
16+
debug = require('debug')('strong-soap:server'),
17+
debugDetail = require('debug')('strong-soap:server:detail');
1618

1719
try {
1820
compress = require('compress');
@@ -25,12 +27,12 @@ class Server extends Base {
2527
constructor(server, path, services, wsdl, options) {
2628
super(wsdl, options);
2729
var self = this;
28-
2930
options = options || {};
3031
this.path = path;
3132
this.services = services;
3233
this.xmlHandler = new XMLHandler(this.wsdl.options);
3334

35+
debug('Server parameters: path: %s services: %j wsdl: %j', path, services, wsdl);
3436
if (path[path.length - 1] !== '/')
3537
path += '/';
3638
wsdl.load(function(err) {
@@ -228,7 +230,6 @@ class Server extends Base {
228230
}
229231
}
230232

231-
g.log(' {{operationName}}: %s {{outputName}}: %s', operationName, outputName);
232233
self.emit('request', obj, operationName);
233234
if (headers)
234235
self.emit('headers', headers, operationName);
@@ -268,7 +269,9 @@ class Server extends Base {
268269

269270
try {
270271
operation = this.services[serviceName][portName][operationName];
272+
debug('Server operation: %s ', operationName);
271273
} catch (error) {
274+
debug('Server executeMethod: error: %s ', error.message);
272275
//fix - should create a fault and call sendError (..) so that this error is not lost and will be sent as Fault in soap envelope
273276
//to the client?
274277
return callback(this._envelope('', includeTimestamp));
@@ -294,7 +297,10 @@ class Server extends Base {
294297
var element = operation.output;
295298

296299
var operationDescriptor = operation.describe(self.wsdl.definitions);
300+
debugDetail('Server handleResult. operationDescriptor: %j ', operationDescriptor);
301+
297302
var outputBodyDescriptor = operationDescriptor.output.body;
303+
debugDetail('Server handleResult. outputBodyDescriptor: %j ', outputBodyDescriptor);
298304

299305
var soapNsURI = 'http://schemas.xmlsoap.org/soap/envelope/';
300306
var soapNsPrefix = self.wsdl.options.envelopeKey || 'soap';
@@ -303,14 +309,19 @@ class Server extends Base {
303309
soapNsURI = 'http://www.w3.org/2003/05/soap-envelope';
304310
}
305311

312+
debug('Server soapNsURI: %s soapNsPrefix: %s', soapNsURI, soapNsPrefix);
313+
306314
var nsContext = self.createNamespaceContext(soapNsPrefix, soapNsURI);
307315
var envelope = XMLHandler.createSOAPEnvelope(soapNsPrefix, soapNsURI);
308316

317+
309318
self.xmlHandler.jsonToXml(envelope.body, nsContext, outputBodyDescriptor, result);
310319

311320
self._envelope(envelope, includeTimestamp);
312321
var message = envelope.body.toString({pretty: true});
313322
var xml = envelope.doc.end({pretty: true});
323+
324+
debug('Server handleResult. xml: %s ', xml);
314325
callback(xml);
315326

316327
}
@@ -375,9 +386,12 @@ class Server extends Base {
375386
}
376387

377388
var operationDescriptor = operation.describe(this.wsdl.definitions);
389+
debugDetail('Server sendError. operationDescriptor: %j ', operationDescriptor);
390+
378391
//get envelope descriptor
379392
var faultEnvDescriptor = operation.descriptor.faultEnvelope.elements[0];
380393

394+
381395
var soapNsURI = 'http://schemas.xmlsoap.org/soap/envelope/';
382396
var soapNsPrefix = self.wsdl.options.envelopeKey || 'soap';
383397

@@ -394,6 +408,9 @@ class Server extends Base {
394408

395409
//there will be only one <Fault> element descriptor under <Body>
396410
var faultDescriptor = bodyDescriptor.elements[0];
411+
debugDetail('Server sendError. faultDescriptor: %j ', faultDescriptor);
412+
413+
debug('Server sendError. error.Fault: %j ', error.Fault);
397414

398415
//serialize Fault object into XML as per faultDescriptor
399416
this.xmlHandler.jsonToXml(envelope.body, nsContext, faultDescriptor, error.Fault);
@@ -402,6 +419,7 @@ class Server extends Base {
402419
var message = envelope.body.toString({pretty: true});
403420
var xml = envelope.doc.end({pretty: true});
404421

422+
debug('Server sendError. Response envelope: %s ', xml);
405423
callback(xml, statusCode);
406424
}
407425
}

‎src/soap.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ var Client = require('./client'),
1111
security = require('./security'),
1212
passwordDigest = require('./utils').passwordDigest,
1313
parser = require('./parser/index'),
14-
openWSDL = parser.WSDL.open;
14+
openWSDL = parser.WSDL.open,
15+
debug = require('debug')('strong-soap:soap');
1516

1617
var _wsdlCache = {};
1718

@@ -23,6 +24,7 @@ function _requestWSDL(url, options, callback) {
2324

2425
var wsdl = _wsdlCache[url];
2526
if (wsdl) {
27+
debug('_requestWSDL, wsdl in cache %s', wsdl);
2628
process.nextTick(function() {
2729
callback(null, wsdl);
2830
});
@@ -46,12 +48,14 @@ function createClient(url, options, callback, endpoint) {
4648
options = {};
4749
}
4850
endpoint = options.endpoint || endpoint;
51+
debug('createClient params: wsdl url: %s client options: %j', url, options);
4952
_requestWSDL(url, options, function(err, wsdl) {
5053
callback(err, wsdl && new Client(wsdl, endpoint, options));
5154
});
5255
}
5356

5457
function listen(server, pathOrOptions, services, xml) {
58+
debug('listen params: pathOrOptions: %j services: %j xml: %j', pathOrOptions, services, xml);
5559
var options = {},
5660
path = pathOrOptions,
5761
uri = null;
@@ -63,7 +67,7 @@ function listen(server, pathOrOptions, services, xml) {
6367
xml = options.xml;
6468
uri = options.uri;
6569
}
66-
70+
6771
var wsdl = new parser.WSDL(xml || services, uri, options);
6872
return new Server(server, path, services, wsdl);
6973
}

0 commit comments

Comments
 (0)
Please sign in to comment.