size_t aws_event_stream_write_headers_to_buffer()

in source/event_stream.c [151:206]


size_t aws_event_stream_write_headers_to_buffer(const struct aws_array_list *headers, uint8_t *buffer) {
    if (!headers || !aws_array_list_length(headers)) {
        return 0;
    }

    size_t headers_count = aws_array_list_length(headers);
    uint8_t *buffer_alias = buffer;

    for (size_t i = 0; i < headers_count; ++i) {
        struct aws_event_stream_header_value_pair *header = NULL;

        aws_array_list_get_at_ptr(headers, (void **)&header, i);
        *buffer_alias = (uint8_t)header->header_name_len;
        buffer_alias++;
        memcpy(buffer_alias, header->header_name, (size_t)header->header_name_len);
        buffer_alias += header->header_name_len;
        *buffer_alias = (uint8_t)header->header_value_type;
        buffer_alias++;
        switch (header->header_value_type) {
            case AWS_EVENT_STREAM_HEADER_BOOL_FALSE:
            case AWS_EVENT_STREAM_HEADER_BOOL_TRUE:
                break;
            case AWS_EVENT_STREAM_HEADER_BYTE:
                *buffer_alias = header->header_value.static_val[0];
                buffer_alias++;
                break;
                /* additions of integers here assume the endianness conversion has already happened */
            case AWS_EVENT_STREAM_HEADER_INT16:
                memcpy(buffer_alias, header->header_value.static_val, sizeof(uint16_t));
                buffer_alias += sizeof(uint16_t);
                break;
            case AWS_EVENT_STREAM_HEADER_INT32:
                memcpy(buffer_alias, header->header_value.static_val, sizeof(uint32_t));
                buffer_alias += sizeof(uint32_t);
                break;
            case AWS_EVENT_STREAM_HEADER_INT64:
            case AWS_EVENT_STREAM_HEADER_TIMESTAMP:
                memcpy(buffer_alias, header->header_value.static_val, sizeof(uint64_t));
                buffer_alias += sizeof(uint64_t);
                break;
            case AWS_EVENT_STREAM_HEADER_BYTE_BUF:
            case AWS_EVENT_STREAM_HEADER_STRING:
                aws_write_u16(header->header_value_len, buffer_alias);
                buffer_alias += sizeof(uint16_t);
                memcpy(buffer_alias, header->header_value.variable_len_val, header->header_value_len);
                buffer_alias += header->header_value_len;
                break;
            case AWS_EVENT_STREAM_HEADER_UUID:
                memcpy(buffer_alias, header->header_value.static_val, 16);
                buffer_alias += header->header_value_len;
                break;
        }
    }

    return buffer_alias - buffer;
}