Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

xmlrpc

baalexander331.5kMIT1.3.2TypeScript support: definitely-typed

A pure JavaScript XML-RPC client and server.

xml-rpc, xmlrpc, xml, rpc

readme

The What

The xmlrpc module is a pure JavaScript XML-RPC server and client for node.js.

Pure JavaScript means that the XML parsing and XML building use pure JavaScript libraries, so no extra C dependencies or build requirements. The xmlrpc module can be used as an XML-RPC server, receiving method calls and responding with method responses, or as an XML-RPC client, making method calls and receiving method responses, or as both.

The How

To Install

npm install xmlrpc

To Use

The file client_server.js in the example directory has a nicely commented example of using xmlrpc as an XML-RPC server and client (they even talk to each other!).

A brief example:

var xmlrpc = require('xmlrpc')

// Creates an XML-RPC server to listen to XML-RPC method calls
var server = xmlrpc.createServer({ host: 'localhost', port: 9090 })
// Handle methods not found
server.on('NotFound', function(method, params) {
  console.log('Method ' + method + ' does not exist');
})
// Handle method calls by listening for events with the method call name
server.on('anAction', function (err, params, callback) {
  console.log('Method call params for \'anAction\': ' + params)

  // ...perform an action...

  // Send a method response with a value
  callback(null, 'aResult')
})
console.log('XML-RPC server listening on port 9091')

// Waits briefly to give the XML-RPC server time to start up and start
// listening
setTimeout(function () {
  // Creates an XML-RPC client. Passes the host information on where to
  // make the XML-RPC calls.
  var client = xmlrpc.createClient({ host: 'localhost', port: 9090, path: '/'})

  // Sends a method call to the XML-RPC server
  client.methodCall('anAction', ['aParam'], function (error, value) {
    // Results of the method response
    console.log('Method response for \'anAction\': ' + value)
  })

}, 1000)

Output from the example:

XML-RPC server listening on port 9090
Method call params for 'anAction': aParam
Method response for 'anAction': aResult

Date/Time Formatting

XML-RPC dates are formatted according to ISO 8601. There are a number of formatting options within the boundaries of the standard. The decoder detects those formats and parses them automatically, but for encoding dates to ISO 8601 some options can be specified to match your specific implementation.

The formatting options can be set through xmlrpc.dateFormatter.setOpts(options);, where the options parameter is an object, with the following (optional) boolean members:

  • colons - enables/disables formatting the time portion with a colon as separator (default: true)
  • hyphens - enables/disables formatting the date portion with a hyphen as separator (default: false)
  • local - encode as local time instead of UTC (true = local, false = utc, default: true)
  • ms - enables/disables output of milliseconds (default: false)
  • offset - enables/disables output of UTC offset in case of local time (default: false)

Default format: 20140101T11:20:00

UTC Example:

xmlrpc.dateFormatter.setOpts({
  colons: true
, hyphens: true
, local: false
, ms: true
}) // encoding output: '2014-01-01T16:20:00.000Z'

Local date + offset example:

xmlrpc.dateFormatter.setOpts({
  colons: true
, hyphens: true
, local: true
, ms: false
, offset: true
}) // encoding output: '2014-01-01T11:20:00-05:00'

Cookies support

It is possible to turn on cookies support for XML-RPC client by special options flag. If turned on then all the cookies received from server will be bounced back with subsequent calls to the server. You also may manipulate cookies manually by the setCookie/getCookie call.

var client = xmlrpc.createClient({
  host: 'localhost',
  port: 9090,
  cookies: true
});

client.setCookie('login', 'bilbo');

//This call will send provided cookie to the server
client.methodCall('someAction', [], function(error, value) {
  //Here we may get cookie received from server if we know its name
  console.log(client.getCookie('session'));
});

Custom Types

If you need to parse to a specific format or need to handle custom data types that are not supported by default, it is possible to extend the serializer with a user-defined type for your specific needs.

A custom type can be defined as follows:

var xmlrpc = require('xmlrpc');
var util = require('util');

// create your custom class
var YourType = function (raw) {
  xmlrpc.CustomType.call(this, raw);
};

// inherit everything
util.inherits(YourType, xmlrpc.CustomType);

// set a custom tagName (defaults to 'customType')
YourType.prototype.tagName = 'yourType';

// optionally, override the serializer
YourType.prototype.serialize = function (xml) {
  var value = somefunction(this.raw);
  return xml.ele(this.tagName).txt(value);
}

and then make your method calls, wrapping your variables inside your new type definition:

var client = xmlrpc.createClient('YOUR_ENDPOINT');
client.methodCall('YOUR_METHOD', [new YourType(yourVariable)], yourCallback);

To Debug (client-side)

Error callbacks on the client are enriched with request and response information and the returned body as long as a http connection was made, to aide with request debugging. Example:

var client = xmlrpc.createClient({ host: 'example.com', port: 80 });
client.methodCall('FAULTY_METHOD', [], function (error, value) {
  if (error) {
    console.log('error:', error);
    console.log('req headers:', error.req && error.req._header);
    console.log('res code:', error.res && error.res.statusCode);
    console.log('res body:', error.body);
  } else {
    console.log('value:', value);
  }
});

// error: [Error: Unknown XML-RPC tag 'TITLE']
// req headers: POST / HTTP/1.1
// User-Agent: NodeJS XML-RPC Client
// ...
// res code: 200
// res body: <!doctype html>
// ...

To Test

Build Status

XML-RPC must be precise so there are an extensive set of test cases in the test directory. Vows is the testing framework and Travis CI is used for Continuous Integration.

To run the test suite:

npm test

If submitting a bug fix, please update the appropriate test file too.

The License (MIT)

Released under the MIT license. See the LICENSE file for the complete wording.

Contributors

Thank you to all the authors and everyone who has filed an issue to help make xmlrpc better.

changelog

1.3.2 / 2016-06-16

  • Drops support CI/Support for node v0.8
  • Adds support for node v6.x
  • Adds support for emojies
  • Removes Makefile in favor of npm test
  • Updates XMLBuilder to 8.2
  • Updates Sax to 1.2

1.3.1 / 2015-05-23

  • Adds option to specify xml encoding.
  • Updates XMLBuilder to 2.6.
  • Adds support for Node v0.12.

1.3.0 / 2015-01-09

  • Reworked DateFormatter to improve ISO-8601 implementation.
  • Updates XMLBuilder to 2.4.
  • Updates sax to 0.6.
  • Adds more detail to Client request errors to ease debugging.

1.2.0 / 2014-01-12

  • Adds (tested) support for Node v0.10 and v0.11.
  • Drops support for Node v0.6.
  • Adds a Custom Type serializer for non-standard XML-RPC types.

1.1.1 / 2013-09-22

  • Adds CDATA deserialization.
  • Updates XMLBuilder to get rid of warnings at installation time.
  • Cleans up unformatted code.
  • Removes vestigial code from ancient v0.4 days.

1.1.0 / 2012-11-13

  • Supports optional listening handler in Server.
  • Adds close function to server.
  • Adds cookie support to client.
  • Changes minimum Node engine to v0.6.

1.0.2 / 2012-07-29

  • Server responds with a 404 if it does not handle the method.
  • Client returns an error if the server returns a 404.

1.0.1 / 2012-04-29

  • Fixes content-length header value when sending multi-byte characters.

1.0.0 / 2012-03-28

  • Replaces builder/parser logic with marshaller/unmarshaller.
  • Uses XML-RPC's nil for JavaScript null values and vice versa.
  • Client and parser are now re-entrant safe.
  • Moves test strings to fixture files.
  • Adds 30+ test cases.
  • Special thanks to @agnat for his work on the (un)marshaller and tests.

0.9.4 / 2012-03-03

  • Handles chunked method calls.
  • Supports ISO-8859-1 encodings.

0.9.3 / 2012-01-21

  • Values with no type now default to String as per XML-RPC spec.

0.9.2 / 2011-12-10

  • Replaces the XML parser with the Sax.js module.
  • Uses Travic CI for Continuous Integration.
  • Fixes accidental global variable.

0.9.1 / 2011-11-29

  • Returns an Error on invalid XML-RPC.
  • Updates to latest version of xmlbuilder to fix install warning.

0.9.0 / 2011-11-01

  • Supports the Base64 datatype.
  • Supports the i8 datatype, treating it as a float.
  • Fixes issue where not returning for faults containing no params.
  • Standardizes how to handle empty params. Last failing test now passes.
  • Enforces null value for error param in callbacks.
  • Updates to latest version of xmlbuilder.

0.8.1 / 2011-09-01

  • Supports passing the URI as a string to client or server.
  • Host is now an optional parameter for client or server.
  • Fixes bug when performing a method call multiple times.
  • Removes node_modules directory. Use npm install . if cloning.

0.8.0 / 2011-08-14

  • Supports HTTPS server and client.
  • Improves Basic Auth support.
  • Errors returned are now an instance of Error, not a String.
  • Fixes bug with structs and whitespace.
  • Fixes bug with empty arrays responses.

0.7.1 / 2011-08-02

  • Handles chunked method responses.
  • Fixes parsing multi-line strings values in the String parameter.
  • Allows for custom headers in the HTTP request.

0.7.0 / 2011-07-12

  • Renames Client.call() to Client.methodCall().
  • Adds better support for sending and parsing empty String parameters.
  • Client handles errors on http request. Includes handling of invalid URLs.
  • Updates documentation.

0.6.2 / 2011-06-15

  • Fixes issue with parsing non-value whitespace in method calls.

0.6.1 / 2011-06-03

  • Supports CDATA when generating XML calls or responses.

0.6.0 / 2011-05-18

  • Initial release to NPM. Considered stable enough for public use.