diff --git a/README.md b/README.md index 400e98b..63687b3 100755 --- a/README.md +++ b/README.md @@ -33,6 +33,15 @@ It uses callbacks that follow node.js conventions and aims to be as expressive a // if you chose a non-existant db, you'd get { error: "not_found", reason: "no_db_file" } in place of `err` }); + // It utilizes mikeal's [request module](https://github.com/mikeal/request) and exposes its methods via setRequestOptions method call on any couchdb entity + //i.e. + db.setRequestOptions({ + timeout: 2000, + // oauth signing, aws auth can be put here... + }).info(function(err, response){ + console.log(response); + }); + Refer to [my website](http://www.dbarnes.info/node-couchdb-api/) for documentation and resources. ## Changelog diff --git a/lib/client.js b/lib/client.js index e3fc867..161e69e 100755 --- a/lib/client.js +++ b/lib/client.js @@ -7,6 +7,25 @@ var request = require("request").defaults({ encoding: "utf8" }), _ = require("underscore"), proto = {}; +/** + * Request options overrides + * @param Object + */ +proto._requestOpts = {}; + +/** + * Method that allows to override + * request defaults such as headers, timeout etc + * @see https://github.com/mikeal/request + * @param {Object} [options] + * + * @return {Object} chainable + */ +proto.setRequestOptions = function(options) { + _.extend(this._requestOpts, options); + return this; +} + /** * Prepares the URL options before a request * @@ -201,7 +220,9 @@ proto._get = function (url, options, callback) { options = options || {}; this._set_url(url, options); - + _.extend(options, this._requestOpts); + this._requestOpts = {}; + if (options.stream) { if (!options.changes) { options.encoding = null; @@ -242,6 +263,9 @@ proto._put = function (url, body, options, callback) { options = options || {}; this._set_url(url, options); + _.extend(options, this._requestOpts); + this._requestOpts = {}; + if (options.stream) { body.pipe(request.put(options, this._callback(callback, options))); } else { @@ -282,6 +306,8 @@ proto._post = function (url, body, options, callback) { options = options || {}; this._set_url(url, options); this._set_body(body, options); + _.extend(options, this._requestOpts); + this._requestOpts = {}; request.post(options, this._callback(callback, options)); return this; @@ -309,6 +335,8 @@ proto._del = function (url, options, callback) { options = options || {}; this._set_url(url, options); + _.extend(options, this._requestOpts); + this._requestOpts = {}; request.del(options, this._callback(callback, options)); return this; diff --git a/test/request.js b/test/request.js new file mode 100644 index 0000000..a07c0e0 --- /dev/null +++ b/test/request.js @@ -0,0 +1,42 @@ +var _ = require("underscore"), + test = require("assert"), + config = require("./config"), + couchdb = require("../"), + server = couchdb.srv(config.url); + +module.exports = { + before: function (done) { + if (!config.party) { + server.auth = [ config.user, config.pass ]; + } + done(); + }, + after: function (done) { + done(); + }, + + "Request": { + "Test chaining": function (done) { + test.strictEqual(server, server.setRequestOptions( { form: {} } )); + done(); + }, + + "Timeout occure": function(done) { + server.setRequestOptions({timeout:1}).info(function(err, body){ + test.notEqual(err, null); + test.ok( err.code === 'ETIMEDOUT' || err.code === 'ESOCKETTIMEDOUT' ); + test.equal(server._requestOpts, {}); + done(); + }); + }, + "Options are reset on the server object": function(done) { + server.info(function(err, body){ + test.ifError(err); + if (!err) { + test.equal(body.couchdb, "Welcome"); + } + done(); + }) + } + } +};