Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

- a little hack to enable custom request decryption #86

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
21 changes: 14 additions & 7 deletions lib/read.js
Expand Up @@ -40,8 +40,20 @@ function read(req, res, next, parse, debug, options) {

var opts = options || {}

var encoding = opts.encoding !== null
? opts.encoding || 'utf-8'
: null
var verify = opts.verify
var Decryptor = opts.decryptor

try {
stream = contentstream(req, debug, opts.inflate)
if (Decryptor) {
debug('decrypt body stream')
stream = new Decryptor()
contentstream(req, debug, opts.inflate).pipe(stream)
} else {
stream = contentstream(req, debug, opts.inflate)
}
length = stream.length
delete stream.length
} catch (err) {
Expand All @@ -50,11 +62,6 @@ function read(req, res, next, parse, debug, options) {

opts.length = length

var encoding = opts.encoding !== null
? opts.encoding || 'utf-8'
: null
var verify = opts.verify

opts.encoding = verify
? null
: encoding
Expand Down Expand Up @@ -159,4 +166,4 @@ function contentstream(req, debug, inflate) {
}

return stream
}
}
4 changes: 3 additions & 1 deletion lib/types/json.js
Expand Up @@ -54,6 +54,7 @@ function json(options) {
var strict = options.strict !== false
var type = options.type || 'json'
var verify = options.verify || false
var decryptor = options.decryptor || false

if (verify !== false && typeof verify !== 'function') {
throw new TypeError('option verify must be function')
Expand Down Expand Up @@ -117,7 +118,8 @@ function json(options) {
encoding: charset,
inflate: inflate,
limit: limit,
verify: verify
verify: verify,
decryptor: decryptor
})
}
}
Expand Down
5 changes: 4 additions & 1 deletion lib/types/raw.js
Expand Up @@ -36,6 +36,8 @@ function raw(options) {
: options.limit
var type = options.type || 'application/octet-stream'
var verify = options.verify || false
var decryptor = options.decryptor || false


if (verify !== false && typeof verify !== 'function') {
throw new TypeError('option verify must be function')
Expand Down Expand Up @@ -74,7 +76,8 @@ function raw(options) {
encoding: null,
inflate: inflate,
limit: limit,
verify: verify
verify: verify,
decryptor: decryptor
})
}
}
Expand Down
4 changes: 3 additions & 1 deletion lib/types/text.js
Expand Up @@ -38,6 +38,7 @@ function text(options) {
: options.limit
var type = options.type || 'text/plain'
var verify = options.verify || false
var decryptor = options.decryptor || false

if (verify !== false && typeof verify !== 'function') {
throw new TypeError('option verify must be function')
Expand Down Expand Up @@ -79,7 +80,8 @@ function text(options) {
encoding: charset,
inflate: inflate,
limit: limit,
verify: verify
verify: verify,
decryptor: decryptor
})
}
}
Expand Down
4 changes: 3 additions & 1 deletion lib/types/urlencoded.js
Expand Up @@ -51,6 +51,7 @@ function urlencoded(options){
: options.limit
var type = options.type || 'urlencoded'
var verify = options.verify || false
var decryptor = options.decryptor || false

if (verify !== false && typeof verify !== 'function') {
throw new TypeError('option verify must be function')
Expand Down Expand Up @@ -106,7 +107,8 @@ function urlencoded(options){
encoding: charset,
inflate: inflate,
limit: limit,
verify: verify
verify: verify,
decryptor: decryptor
})
}
}
Expand Down
3 changes: 2 additions & 1 deletion package.json
Expand Up @@ -23,7 +23,8 @@
"istanbul": "0.3.8",
"methods": "~1.1.1",
"mocha": "~2.2.1",
"supertest": "~0.15.0"
"supertest": "~0.15.0",
"readable-stream": "1.0.33"
},
"files": [
"lib/",
Expand Down
50 changes: 50 additions & 0 deletions test/body-parser.js
Expand Up @@ -6,6 +6,10 @@ var request = require('supertest');

var bodyParser = require('..');

var stream = require('stream');
var util = require('util');
var Transform = stream.Transform || require('readable-stream').Transform;

describe('bodyParser()', function(){
var server;
before(function(){
Expand Down Expand Up @@ -138,6 +142,26 @@ describe('bodyParser()', function(){
.expect(403, 'no leading space', done)
})
})

describe('with decryption transform stream', function(){
it('should apply to json', function(done){
var server = createServer({decryptor: Decryptor})
request(server)
.post('/')
.set('Content-Type', 'application/json')
.send('eyJ1c2VyIjoidG9iaSJ9')
.expect(200, '{"user":"tobi"}', done)
})

it('should apply to urlencoded', function(done){
var server = createServer({decryptor: Decryptor})
request(server)
.post('/')
.set('Content-Type', 'application/x-www-form-urlencoded')
.send('dXNlcj10b2Jp')
.expect(200, '{"user":"tobi"}', done)
})
})
})

function createServer(opts){
Expand All @@ -150,3 +174,29 @@ function createServer(opts){
})
})
}

function Decryptor() {
if (!(this instanceof Decryptor)) {
return new Decryptor()
}
Transform.call(this)
}
util.inherits(Decryptor, Transform)

Decryptor.prototype._transform = function (chunk, enc, cb) {
if (this.decrypt) {
try {
chunk = this.decrypt(chunk.toString())
} catch (err) {
if (!err.status) err.status = 403
throw err
}
}
this.push(chunk, 'utf-8')
cb()
};

Decryptor.prototype.decrypt = function(input) {
var b = new Buffer(input, "base64")
return b ? b.toString() : input
}
3 changes: 3 additions & 0 deletions test/json.js
Expand Up @@ -2,6 +2,9 @@
var assert = require('assert');
var http = require('http');
var request = require('supertest');
var stream = require('stream');
var util = require('util');
var Transform = stream.Transform || require('readable-stream').Transform;

var bodyParser = require('..');

Expand Down