in source/event_stream.c [208:281]
int aws_event_stream_read_headers_from_buffer(
struct aws_array_list *headers,
const uint8_t *buffer,
size_t headers_len) {
if (AWS_UNLIKELY(headers_len > AWS_EVENT_STREAM_MAX_HEADERS_SIZE)) {
return aws_raise_error(AWS_ERROR_EVENT_STREAM_MESSAGE_FIELD_SIZE_EXCEEDED);
}
/* iterate the buffer per header. */
const uint8_t *buffer_start = buffer;
while ((size_t)(buffer - buffer_start) < headers_len) {
struct aws_event_stream_header_value_pair header;
AWS_ZERO_STRUCT(header);
/* get the header info from the buffer, make sure to increment buffer offset. */
header.header_name_len = *buffer;
buffer += sizeof(header.header_name_len);
memcpy((void *)header.header_name, buffer, (size_t)header.header_name_len);
buffer += header.header_name_len;
header.header_value_type = (enum aws_event_stream_header_value_type) * buffer;
buffer++;
switch (header.header_value_type) {
case AWS_EVENT_STREAM_HEADER_BOOL_FALSE:
header.header_value_len = 0;
header.header_value.static_val[0] = 0;
break;
case AWS_EVENT_STREAM_HEADER_BOOL_TRUE:
header.header_value_len = 0;
header.header_value.static_val[0] = 1;
break;
case AWS_EVENT_STREAM_HEADER_BYTE:
header.header_value_len = sizeof(uint8_t);
header.header_value.static_val[0] = *buffer;
buffer++;
break;
case AWS_EVENT_STREAM_HEADER_INT16:
header.header_value_len = sizeof(uint16_t);
memcpy(header.header_value.static_val, buffer, sizeof(uint16_t));
buffer += sizeof(uint16_t);
break;
case AWS_EVENT_STREAM_HEADER_INT32:
header.header_value_len = sizeof(uint32_t);
memcpy(header.header_value.static_val, buffer, sizeof(uint32_t));
buffer += sizeof(uint32_t);
break;
case AWS_EVENT_STREAM_HEADER_INT64:
case AWS_EVENT_STREAM_HEADER_TIMESTAMP:
header.header_value_len = sizeof(uint64_t);
memcpy(header.header_value.static_val, buffer, sizeof(uint64_t));
buffer += sizeof(uint64_t);
break;
case AWS_EVENT_STREAM_HEADER_BYTE_BUF:
case AWS_EVENT_STREAM_HEADER_STRING:
header.header_value_len = aws_read_u16(buffer);
buffer += sizeof(header.header_value_len);
header.header_value.variable_len_val = (uint8_t *)buffer;
buffer += header.header_value_len;
break;
case AWS_EVENT_STREAM_HEADER_UUID:
header.header_value_len = 16;
memcpy(header.header_value.static_val, buffer, 16);
buffer += header.header_value_len;
break;
}
if (aws_array_list_push_back(headers, (const void *)&header)) {
return AWS_OP_ERR;
}
}
return AWS_OP_SUCCESS;
}