Skip to content

Polling transport malformed request body on large requests #49

@Lahe

Description

@Lahe

Received this error when sending large text content via polling transport:

WARN  [2021-12-14 09:31:35,188] io.socket.parser.IOParser: An error occured while retrieving data from JSONTokener
! org.json.JSONException: Unterminated string at 7675 [character 7676 line 1]
! at org.json.JSONTokener.syntaxError(JSONTokener.java:507)
! at org.json.JSONTokener.nextString(JSONTokener.java:320)
! at org.json.JSONTokener.nextValue(JSONTokener.java:428)
! at org.json.JSONObject.<init>(JSONObject.java:233)
! at org.json.JSONTokener.nextValue(JSONTokener.java:431)
! at org.json.JSONObject.<init>(JSONObject.java:252)
! at org.json.JSONTokener.nextValue(JSONTokener.java:431)
! at org.json.JSONArray.<init>(JSONArray.java:125)
! at org.json.JSONTokener.nextValue(JSONTokener.java:434)
! at io.socket.parser.IOParser$Decoder.decodeString(IOParser.java:183)
! at io.socket.parser.IOParser$Decoder.add(IOParser.java:92)
! at io.socket.socketio.server.SocketIoClient.lambda$setup$2(SocketIoClient.java:161)
! at io.socket.emitter.Emitter.emit(Emitter.java:123)
! at io.socket.engineio.server.EngineIoSocket.emit(EngineIoSocket.java:185)
! at io.socket.engineio.server.EngineIoSocket.onPacket(EngineIoSocket.java:397)
! at io.socket.engineio.server.EngineIoSocket.lambda$setTransport$10(EngineIoSocket.java:300)
! at io.socket.emitter.Emitter.emit(Emitter.java:123)
! at io.socket.engineio.server.Transport.onPacket(Transport.java:104)
! at io.socket.engineio.server.transport.Polling.lambda$onData$1(Polling.java:197)
! at io.socket.engineio.parser.ParserV4.decodePayload(ParserV4.java:95)
! at io.socket.engineio.server.transport.Polling.onData(Polling.java:192)
! at io.socket.engineio.server.transport.Polling.onDataRequest(Polling.java:282)
! at io.socket.engineio.server.transport.Polling.onRequest(Polling.java:99)
! at io.socket.engineio.server.EngineIoSocket.onRequest(EngineIoSocket.java:213)
! at io.socket.engineio.server.EngineIoServer.handleRequest(EngineIoServer.java:168)
! at app.servlets.SocketIoServlet.service(SocketIoServlet.java:37)

Seems that using inputStream.read() in io.socket.engineio.server.transport.Polling.onDataRequest to stringify a large request body malforms the string.

Replacing

//noinspection ResultOfMethodCallIgnored
inputStream.read(mReadBuffer, 0, mReadBuffer.length);

with

inputStream.readLine(mReadBuffer, 0, mReadBuffer.length);

produced a valid string.

Alternatively, using a BufferedReader with request.getReader() seemed to work too.

StringBuilder buffer = new StringBuilder();
BufferedReader reader = request.getReader();
String line;
while ((line = reader.readLine()) != null) {
    buffer.append(line);
    buffer.append(System.lineSeparator());
}
String data = buffer.toString()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions