in aws-runtime/protocols/aws-event-stream/common/src/aws/sdk/kotlin/runtime/protocol/eventstream/Message.kt [49:87]
public fun decode(buffer: Buffer): Message {
val totalLen = buffer.readUInt()
check(totalLen <= MAX_MESSAGE_SIZE.toUInt()) { "Invalid Message size: $totalLen" }
// read into new ByteArray so we can validate the CRC
val messageBytes = ByteArray(totalLen.toInt() - MESSAGE_CRC_BYTE_LEN)
val messageBuffer = SdkByteBuffer.of(messageBytes)
// add back in the totalLen so we can read the prelude
messageBuffer.writeUInt(totalLen)
buffer.readFully(messageBuffer)
val prelude = Prelude.decode(messageBuffer)
val remaining = prelude.totalLen - PRELUDE_BYTE_LEN_WITH_CRC - MESSAGE_CRC_BYTE_LEN
check(messageBuffer.readRemaining >= remaining.toULong()) { "Invalid buffer, not enough remaining; have: ${messageBuffer.readRemaining}; expected $remaining" }
val message = MessageBuilder()
// read headers
var headerBytesConsumed = 0UL
while (headerBytesConsumed < prelude.headersLength.toULong()) {
val start = messageBuffer.readPosition
val header = Header.decode(messageBuffer)
headerBytesConsumed += messageBuffer.readPosition - start
message.addHeader(header)
}
check(headerBytesConsumed == prelude.headersLength.toULong()) { "Invalid Message: expected ${prelude.headersLength} header bytes; consumed $headerBytesConsumed" }
val payload = ByteArray(prelude.payloadLen)
messageBuffer.readFully(payload)
message.payload = payload
val expectedCrc = buffer.readUInt()
val computedCrc = messageBytes.crc32()
check(computedCrc == expectedCrc) {
"Message checksum mismatch; expected=0x${expectedCrc.toString(16)}; calculated=0x${computedCrc.toString(16)}"
}
return message.build()
}