{"record":{"id":"c7e0c53c072fbddd","repo":"dotnet/aspnetcore","slug":"error-reading-length-header","errorCode":null,"errorMessage":"Error reading length header.","messagePattern":"Error reading length header\\.","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/SignalR/clients/java/signalr/messagepack/src/main/java/com/microsoft/signalr/messagepack/MessagePackHubProtocol.java","lineNumber":86,"sourceCode":"         // MessagePack library can't handle read-only ByteBuffer - copy into an array-backed ByteBuffer if this is the case\n        if (payload.isReadOnly()) {\n            byte[] payloadBytes = new byte[payload.remaining()];\n            payload.get(payloadBytes, 0, payloadBytes.length);\n            payload = ByteBuffer.wrap(payloadBytes);\n        }\n\n        List<HubMessage> hubMessages = new ArrayList<>();\n\n        while (payload.hasRemaining()) {\n            int length;\n            try {\n                length = Utils.readLengthHeader(payload);\n                // Throw if remaining buffer is shorter than length header\n                if (payload.remaining() < length) {\n                    throw new RuntimeException(String.format(\"MessagePack message was length %d but claimed to be length %d.\", payload.remaining(), length));\n                }\n            } catch (IOException ex) {\n                throw new RuntimeException(\"Error reading length header.\", ex);\n            }\n            // Instantiate MessageUnpacker\n            try(MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(payload)) {\n\n                int itemCount = unpacker.unpackArrayHeader();\n                HubMessageType messageType = HubMessageType.values()[unpacker.unpackInt() - 1];\n\n                switch (messageType) {\n                    case INVOCATION:\n                        hubMessages.add(createInvocationMessage(unpacker, binder, itemCount, payload));\n                        break;\n                    case STREAM_ITEM:\n                        hubMessages.add(createStreamItemMessage(unpacker, binder, payload));\n                        break;\n                    case COMPLETION:\n                        hubMessages.add(createCompletionMessage(unpacker, binder, payload));\n                        break;\n                    case STREAM_INVOCATION:","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/dotnet/aspnetcore/blob/294cab2f9b2e03af6b953820c7ab497c3c8b7ad9/src/SignalR/clients/java/signalr/messagepack/src/main/java/com/microsoft/signalr/messagepack/MessagePackHubProtocol.java#L68-L104","documentation":"Wraps an IOException raised while reading the varint length prefix via Utils.readLengthHeader. It indicates an I/O-level failure at the very start of message framing, before the message body is read.","triggerScenarios":"IOException from the buffer/unpacker while reading the length-prefix bytes; a connection torn down mid-frame delivering only partial bytes.","commonSituations":"Connection dropped while a frame was in flight; malformed framing where the prefix is incomplete.","solutions":["Verify the connection is healthy and not being torn down during reads.","Ensure payloads handed to the protocol are well-formed MessagePack-with-length-prefix frames.","Check that the transport fully reassembles frames before delivery."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Java\ntry {\n    hubConnection.start().blockingAwait();\n} catch (RuntimeException ex) {\n    if (ex.getMessage() != null && ex.getMessage().contains(\"length header\")) {\n        // connection likely torn down mid-frame; reconnect or inspect transport\n    }\n}","preventionTips":["Confirm the connection is stable before parsing.","Make sure frames are fully reassembled before delivery to the protocol.","Handle transport close gracefully to avoid partial-frame parsing."],"tags":["signalr","messagepack","io","protocol"],"analyzedSha":"294cab2f9b2e03af6b953820c7ab497c3c8b7ad9","analyzedAt":"2026-08-06T20:08:02.189Z","schemaVersion":2},"datasetVersion":"2026-08-06T23:17:07.152Z"}