Skip to content

Commit 800d67c

Browse files
authored
Use json-stringify-safe to prevent circular references (refs #102) (#182)
1 parent 5422246 commit 800d67c

File tree

4 files changed

+20
-20
lines changed

4 files changed

+20
-20
lines changed

lib/client.js

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22

3+
var stringify = require('json-stringify-safe');
34
var parsers = require('./parsers');
45
var zlib = require('zlib');
56
var utils = require('./utils');
@@ -116,16 +117,8 @@ proto.process = function process(kwargs) {
116117

117118
proto.send = function send(kwargs, ident) {
118119
var self = this;
119-
120-
// stringify, but don't choke on circular references, see: http://stackoverflow.com/questions/11616630/json-stringify-avoid-typeerror-converting-circular-structure-to-json
121-
var cache = [];
122-
var skwargs = JSON.stringify(kwargs, function(k, v) {
123-
if (typeof v === 'object' && v !== null) {
124-
if (cache.indexOf(v) !== -1) return;
125-
cache.push(v);
126-
}
127-
return v;
128-
});
120+
121+
var skwargs = stringify(kwargs);
129122

130123
zlib.deflate(skwargs, function(err, buff) {
131124
var message = buff.toString('base64'),

lib/parsers.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
var cookie = require('cookie');
44
var urlParser = require('url');
5+
var stringify = require('json-stringify-safe');
6+
57
var utils = require('./utils');
68

79
module.exports.parseText = function parseText(message, kwargs) {
@@ -138,7 +140,7 @@ module.exports.parseRequest = function parseRequest(req, kwargs) {
138140

139141
if (data && {}.toString.call(data) !== '[object String]') {
140142
// Make sure the request body is a string
141-
data = JSON.stringify(data);
143+
data = stringify(data);
142144
}
143145

144146
// client ip:

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
},
2828
"dependencies": {
2929
"cookie": "0.1.0",
30+
"json-stringify-safe": "^5.0.1",
3031
"lsmod": "1.0.0",
3132
"node-uuid": "~1.4.1",
3233
"stack-trace": "0.0.7"

test/raven.client.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -263,20 +263,24 @@ describe('raven.Client', function() {
263263

264264
it('shouldn\'t choke on circular references', function(done) {
265265
// See: https://github.com/mattrobenolt/raven-node/pull/46
266-
var scope = nock('https://app.getsentry.com')
267-
.filteringRequestBody(/.*/, '*')
268-
.post('/api/269/store/', '*')
269-
.reply(200, 'OK');
266+
var old = zlib.deflate;
267+
zlib.deflate = function mockSend(skwargs) {
268+
zlib.deflate = old;
270269

271-
client.on('logged', function() {
272-
scope.done();
270+
var kwargs = JSON.parse(skwargs);
271+
kwargs.should.have.property('extra', {
272+
foo: '[Circular ~]'
273+
});
273274
done();
274-
});
275+
};
276+
275277
// create circular reference
276278
var kwargs = {
277-
extra: {}
279+
extra: {
280+
foo: null
281+
}
278282
};
279-
kwargs.extra.kwargs = kwargs;
283+
kwargs.extra.foo = kwargs;
280284
client.captureError(new Error('wtf?'), kwargs);
281285
});
282286
});

0 commit comments

Comments
 (0)