Skip to content

Commit

Permalink
Merge pull request #1118 from visionmedia/subclass
Browse files Browse the repository at this point in the history
Make superagent subclassable without need to patch all static methods
  • Loading branch information
kornelski committed Nov 27, 2016
2 parents 6c2aaa9 + 7bc01ec commit 8f1a90c
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 52 deletions.
23 changes: 15 additions & 8 deletions lib/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,21 @@ function noop(){};
* Expose `request`.
*/

var request = module.exports = require('./request').bind(null, Request);
var request = exports = module.exports = function(method, url) {
// callback
if ('function' == typeof url) {
return new exports.Request('GET', method).end(url);
}

// url first
if (1 == arguments.length) {
return new exports.Request('GET', method);
}

return new exports.Request(method, url);
}

exports.Request = Request;

/**
* Determine XHR.
Expand Down Expand Up @@ -890,13 +904,6 @@ Request.prototype.end = function(fn){
return this;
};


/**
* Expose `Request`.
*/

request.Request = Request;

/**
* GET `url` with optional callback `fn(res)`.
*
Expand Down
2 changes: 1 addition & 1 deletion lib/node/agent.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ methods.forEach(function(method){

method = method.toUpperCase();
Agent.prototype[name] = function(url, fn){
var req = request(method, url);
var req = new request.Request(method, url);
req.ca(this._ca);
req.key(this._key);
req.pfx(this._pfx);
Expand Down
24 changes: 16 additions & 8 deletions lib/node/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,25 @@ var pkg = require('../../package.json');
var RequestBase = require('../request-base');
var isFunction = require('../is-function');

var request = exports = module.exports = function(method, url) {
// callback
if ('function' == typeof url) {
return new exports.Request('GET', method).end(url);
}

// url first
if (1 == arguments.length) {
return new exports.Request('GET', method);
}

return new exports.Request(method, url);
}

/**
* Expose the request function.
* Expose `Request`.
*/

var request = exports = module.exports = require('../request').bind(null, Request);
exports.Request = Request;

/**
* Expose the agent function
Expand Down Expand Up @@ -919,12 +933,6 @@ Request.prototype._shouldUnzip = function(res){
return /^\s*(?:deflate|gzip)\s*$/.test(res.headers['content-encoding']);
};

/**
* Expose `Request`.
*/

exports.Request = Request;

// generate HTTP verb methods
if (methods.indexOf('del') == -1) {
// create a copy so we don't cause conflicts with
Expand Down
32 changes: 0 additions & 32 deletions lib/request.js

This file was deleted.

57 changes: 54 additions & 3 deletions test/use.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var setup = require('./support/setup');
var NODE = setup.NODE;
var uri = setup.uri;

var assert = require('assert');
Expand Down Expand Up @@ -27,6 +26,58 @@ describe('request', function(){
assert.equal(res.get('X-UUID'), now);
done();
})
})
})
});
});
})

describe('subclass', function() {
var OriginalRequest;
beforeEach(function(){
OriginalRequest = request.Request;
});
afterEach(function(){
request.Request = OriginalRequest;
});

it('should be an instance of Request', function(){
var req = request.get('/');
assert(req instanceof request.Request);
});

it('should use patched subclass', function(){
assert(OriginalRequest);

var constructorCalled, sendCalled;
function NewRequest() {
constructorCalled = true;
OriginalRequest.apply(this, arguments);
}
NewRequest.prototype = Object.create(OriginalRequest.prototype);
NewRequest.prototype.send = function() {
sendCalled = true;
return this;
};

request.Request = NewRequest;

var req = request.get('/').send();
assert(constructorCalled);
assert(sendCalled);
assert(req instanceof NewRequest);
assert(req instanceof OriginalRequest);
});

it('should use patched subclass in agent too', function(){
if (!request.agent) return; // Node-only

function NewRequest() {
OriginalRequest.apply(this, arguments);
}
NewRequest.prototype = Object.create(OriginalRequest.prototype);
request.Request = NewRequest;

var req = request.agent().del('/');
assert(req instanceof NewRequest);
assert(req instanceof OriginalRequest);
});
})

0 comments on commit 8f1a90c

Please sign in to comment.