11package io .socket .parser ;
22
33import io .socket .hasbinary .HasBinary ;
4+ import org .json .JSONArray ;
45import org .json .JSONException ;
6+ import org .json .JSONObject ;
57import org .json .JSONTokener ;
68
79import java .util .ArrayList ;
@@ -14,10 +16,6 @@ final public class IOParser implements Parser {
1416
1517 private static final Logger logger = Logger .getLogger (IOParser .class .getName ());
1618
17- private static Packet <String > error () {
18- return new Packet <String >(ERROR , "parser error" );
19- }
20-
2119 private IOParser () {}
2220
2321 final public static class Encoder implements Parser .Encoder {
@@ -126,12 +124,16 @@ private static Packet decodeString(String str) {
126124 int i = 0 ;
127125 int length = str .length ();
128126
129- Packet <Object > p = new Packet <Object >(Character .getNumericValue (str .charAt (0 )));
127+ Packet <Object > p = new Packet <>(Character .getNumericValue (str .charAt (0 )));
130128
131- if (p .type < 0 || p .type > types .length - 1 ) return error ();
129+ if (p .type < 0 || p .type > types .length - 1 ) {
130+ throw new DecodingException ("unknown packet type " + p .type );
131+ }
132132
133133 if (BINARY_EVENT == p .type || BINARY_ACK == p .type ) {
134- if (!str .contains ("-" ) || length <= i + 1 ) return error ();
134+ if (!str .contains ("-" ) || length <= i + 1 ) {
135+ throw new DecodingException ("illegal attachments" );
136+ }
135137 StringBuilder attachments = new StringBuilder ();
136138 while (str .charAt (++i ) != '-' ) {
137139 attachments .append (str .charAt (i ));
@@ -170,7 +172,7 @@ private static Packet decodeString(String str) {
170172 try {
171173 p .id = Integer .parseInt (id .toString ());
172174 } catch (NumberFormatException e ){
173- return error ( );
175+ throw new DecodingException ( "invalid payload" );
174176 }
175177 }
176178 }
@@ -181,7 +183,10 @@ private static Packet decodeString(String str) {
181183 p .data = new JSONTokener (str .substring (i )).nextValue ();
182184 } catch (JSONException e ) {
183185 logger .log (Level .WARNING , "An error occured while retrieving data from JSONTokener" , e );
184- return error ();
186+ throw new DecodingException ("invalid payload" );
187+ }
188+ if (!isPayloadValid (p .type , p .data )) {
189+ throw new DecodingException ("invalid payload" );
185190 }
186191 }
187192
@@ -191,6 +196,27 @@ private static Packet decodeString(String str) {
191196 return p ;
192197 }
193198
199+ private static boolean isPayloadValid (int type , Object payload ) {
200+ switch (type ) {
201+ case Parser .CONNECT :
202+ return payload instanceof JSONObject ;
203+ case Parser .ERROR :
204+ return payload instanceof String ;
205+ case Parser .DISCONNECT :
206+ return payload == null ;
207+ case Parser .EVENT :
208+ case Parser .BINARY_EVENT :
209+ return payload instanceof JSONArray
210+ && ((JSONArray ) payload ).length () > 0
211+ && !((JSONArray ) payload ).isNull (0 );
212+ case Parser .ACK :
213+ case Parser .BINARY_ACK :
214+ return payload instanceof JSONArray ;
215+ default :
216+ return false ;
217+ }
218+ }
219+
194220 @ Override
195221 public void destroy () {
196222 if (this .reconstructor != null ) {
0 commit comments