File tree 2 files changed +35
-5
lines changed 2 files changed +35
-5
lines changed Original file line number Diff line number Diff line change @@ -113,6 +113,8 @@ exports.Decoder = Decoder;
113
113
114
114
function Encoder ( ) { }
115
115
116
+ var ERROR_PACKET = exports . ERROR + '"encode error"' ;
117
+
116
118
/**
117
119
* Encode a packet as a single string if non-binary, or as a
118
120
* buffer sequence, depending on packet type.
@@ -128,8 +130,7 @@ Encoder.prototype.encode = function(obj, callback){
128
130
129
131
if ( exports . BINARY_EVENT === obj . type || exports . BINARY_ACK === obj . type ) {
130
132
encodeAsBinary ( obj , callback ) ;
131
- }
132
- else {
133
+ } else {
133
134
var encoding = encodeAsString ( obj ) ;
134
135
callback ( [ encoding ] ) ;
135
136
}
@@ -166,13 +167,26 @@ function encodeAsString(obj) {
166
167
167
168
// json data
168
169
if ( null != obj . data ) {
169
- str += JSON . stringify ( obj . data ) ;
170
+ var payload = tryStringify ( obj . data ) ;
171
+ if ( payload !== false ) {
172
+ str += payload ;
173
+ } else {
174
+ return ERROR_PACKET ;
175
+ }
170
176
}
171
177
172
178
debug ( 'encoded %j as %s' , obj , str ) ;
173
179
return str ;
174
180
}
175
181
182
+ function tryStringify ( str ) {
183
+ try {
184
+ return JSON . stringify ( str ) ;
185
+ } catch ( e ) {
186
+ return false ;
187
+ }
188
+ }
189
+
176
190
/**
177
191
* Encode packet as 'buffer sequence' by removing blobs, and
178
192
* deconstructing packet into object with placeholders and
Original file line number Diff line number Diff line change 1
1
var parser = require ( '../index.js' ) ;
2
2
var expect = require ( 'expect.js' ) ;
3
3
var helpers = require ( './helpers.js' ) ;
4
- var encode = parser . encode ;
5
- var decode = parser . decode ;
6
4
7
5
describe ( 'parser' , function ( ) {
8
6
@@ -61,6 +59,24 @@ describe('parser', function(){
61
59
} ) ;
62
60
} ) ;
63
61
62
+ it ( 'properly handles circular objects' , function ( ) {
63
+ var a = { } ;
64
+ a . b = a ;
65
+
66
+ var data = {
67
+ type : parser . EVENT ,
68
+ data : a ,
69
+ id : 1 ,
70
+ nsp : '/'
71
+ }
72
+
73
+ var encoder = new parser . Encoder ( ) ;
74
+
75
+ encoder . encode ( data , function ( encodedPackets ) {
76
+ expect ( encodedPackets [ 0 ] ) . to . be ( '4"encode error"' ) ;
77
+ } ) ;
78
+ } ) ;
79
+
64
80
it ( 'decodes a bad binary packet' , function ( ) {
65
81
try {
66
82
var decoder = new parser . Decoder ( ) ;
You can’t perform that action at this time.
0 commit comments