Skip to content

Commit

Permalink
Merge pull request #563 from mdhooge/PR557
Browse files Browse the repository at this point in the history
Server translates error object thrown from method into SOAP Fault (was PR#557)
  • Loading branch information
herom committed Feb 10, 2015
2 parents 18b4326 + 519a289 commit 13e8136
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 26 deletions.
17 changes: 17 additions & 0 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,23 @@ along with data.
};
```

### SOAP Fault

A service method can reply with a SOAP Fault to a client by `throw`ing an
object with a `Fault` property.

``` javascript
throw {
Fault: {
Code: {
Value: "soap:Sender",
Subcode: { value: "rpc:BadArguments" }
},
Reason: { Text: "Processing Error" }
}
};
```

### server security example using PasswordDigest

If server.authenticate is not defined no authentation will take place.
Expand Down
62 changes: 36 additions & 26 deletions lib/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ Server.prototype._process = function(input, URL, callback) {
body = obj.Body,
headers = obj.Header,
bindings = this.wsdl.definitions.bindings, binding,
methods, method, methodName,
method, methodName,
serviceName, portName;

if (typeof self.authenticate === 'function') {
Expand Down Expand Up @@ -183,31 +183,41 @@ Server.prototype._process = function(input, URL, callback) {
throw new Error('Failed to bind to WSDL');
}

methods = binding.methods;

if (binding.style === 'rpc') {
methodName = Object.keys(body)[0];
self._executeMethod({
serviceName: serviceName,
portName: portName,
methodName: methodName,
outputName: methodName + 'Response',
args: body[methodName],
headers: headers,
style: 'rpc'
}, callback);
} else {
var messageElemName = Object.keys(body)[0];
var pair = binding.topElements[messageElemName];
self._executeMethod({
serviceName: serviceName,
portName: portName,
methodName: pair.methodName,
outputName: pair.outputName,
args: body[messageElemName],
headers: headers,
style: 'document'
}, callback);
try {
if (binding.style === 'rpc') {
methodName = Object.keys(body)[0];
self._executeMethod({
serviceName: serviceName,
portName: portName,
methodName: methodName,
outputName: methodName + 'Response',
args: body[methodName],
headers: headers,
style: 'rpc'
}, callback);
} else {
var messageElemName = Object.keys(body)[0];
var pair = binding.topElements[messageElemName];
self._executeMethod({
serviceName: serviceName,
portName: portName,
methodName: pair.methodName,
outputName: pair.outputName,
args: body[messageElemName],
headers: headers,
style: 'document'
}, callback);
}
}
catch (e) {
if (e.Fault !== undefined) {
// 3rd param is the NS prepended to all elements
// It must match the NS defined in the Envelope (set by the _envelope method)
var fault = self.wsdl.objectToDocumentXML("Fault", e.Fault, "soap");
callback(self._envelope(fault));
}
else
throw e;
}
};

Expand Down
23 changes: 23 additions & 0 deletions test/server-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,16 @@ test.service = {
return { price: soapHeader.SomeToken };
if (args.tickerSymbol === 'trigger error') {
throw new Error('triggered server error');
} else if (args.tickerSymbol === 'SOAP Fault') {
throw {
Fault: {
Code: {
Value: "soap:Sender",
Subcode: { value: "rpc:BadArguments" }
},
Reason: { Text: "Processing Error" }
}
};
} else {
return { price: 19.56 };
}
Expand Down Expand Up @@ -134,6 +144,19 @@ describe('SOAP Server', function() {
});
});

it('should return SOAP Fault body', function(done) {
soap.createClient(test.baseUrl + '/stockquote?wsdl', function(err, client) {
assert.ok(!err);
client.GetLastTradePrice({ tickerSymbol: 'SOAP Fault' }, function(err, response, body) {
assert.ok(err);
var fault = err.root.Envelope.Body.Fault;
assert.equal(fault.Code.Value, "soap:Sender");
assert.equal(fault.Reason.Text, "Processing Error");
done();
});
});
});

// NOTE: this is actually a -client- test
/*
it('should return a valid error if the server stops responding': function(done) {
Expand Down

0 comments on commit 13e8136

Please sign in to comment.