diff --git a/client.js b/client.js new file mode 100644 index 00000000..8984c44d --- /dev/null +++ b/client.js @@ -0,0 +1,25 @@ + +var http = require('http'); + +var times = 50; + +while (times--) { + var req = http.request({ + port: 3000 + , method: 'POST' + , headers: { 'Content-Type': 'application/x-www-form-urlencoded' } + }); + + req.on('response', function(res){ + console.log(res.statusCode); + }); + + var n = 500000; + while (n--) { + req.write('foo=bar&bar=baz&'); + } + + req.write('foo=bar&bar=baz'); + + req.end(); +} \ No newline at end of file diff --git a/lib/request.js b/lib/request.js index 54600e62..a49a16fb 100644 --- a/lib/request.js +++ b/lib/request.js @@ -310,7 +310,7 @@ req.is = function(type){ var fn = this.app.is(type); if (fn) return fn(this); var contentType = this.headers['content-type']; - if (!contentType) return; + if (!contentType) return false; if (!~type.indexOf('/')) type = mime.lookup(type); if (~type.indexOf('*')) { type = type.split('/'); diff --git a/test.js b/test.js new file mode 100644 index 00000000..a415de76 --- /dev/null +++ b/test.js @@ -0,0 +1,13 @@ + +var express = require('./'); +var app = express(); + +app.use(express.logger('dev')); +app.use(express.bodyParser()); + +app.post('/', function(req, res){ + res.send('done\n'); +}); + +app.listen(3000); +console.log('listening on port 3000'); \ No newline at end of file diff --git a/test/req.is.js b/test/req.is.js new file mode 100644 index 00000000..1efdd878 --- /dev/null +++ b/test/req.is.js @@ -0,0 +1,101 @@ + +var express = require('../') + , request = require('./support/http'); + +function req(ct) { + var req = { + headers: { 'content-type': ct } + , app: express() + , __proto__: express.request + }; + + return req; +} + +describe('req.is()', function(){ + it('should ignore charset', function(){ + req('application/json; charset=utf-8') + .is('json') + .should.be.true; + }) + + describe('when content-type is not present', function(){ + it('should return false', function(){ + req('') + .is('json') + .should.be.false; + }) + }) + + describe('when given an extension', function(){ + it('should lookup the mime type', function(){ + req('application/json') + .is('json') + .should.be.true; + + req('text/html') + .is('json') + .should.be.false; + }) + }) + + describe('when given a mime type', function(){ + it('should match', function(){ + req('application/json') + .is('application/json') + .should.be.true; + + req('image/jpeg') + .is('application/json') + .should.be.false; + }) + }) + + describe('when given */subtype', function(){ + it('should match', function(){ + req('application/json') + .is('*/json') + .should.be.true; + + req('image/jpeg') + .is('*/json') + .should.be.false; + }) + + describe('with a charset', function(){ + it('should match', function(){ + req('text/html; charset=utf-8') + .is('*/html') + .should.be.true; + + req('text/plain; charset=utf-8') + .is('*/html') + .should.be.false; + }) + }) + }) + + describe('when given type/*', function(){ + it('should match', function(){ + req('image/png') + .is('image/*') + .should.be.true; + + req('text/html') + .is('image/*') + .should.be.false; + }) + + describe('with a charset', function(){ + it('should match', function(){ + req('text/html; charset=utf-8') + .is('text/*') + .should.be.true; + + req('something/html; charset=utf-8') + .is('text/*') + .should.be.false; + }) + }) + }) +})