int aws_event_stream_read_headers_from_buffer()

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;
}