1/*
2 * librdkafka - The Apache Kafka C/C++ library
3 *
4 * Copyright (c) 2017 Magnus Edenhill
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef _RDKAFKA_HEADER_H
30#define _RDKAFKA_HEADER_H
31
32
33
34/**
35 * @brief The header list (rd_kafka_headers_t) wraps the generic rd_list_t
36 * with additional fields to keep track of the total on-wire size.
37 */
38struct rd_kafka_headers_s {
39 rd_list_t rkhdrs_list; /**< List of (rd_kafka_header_t *) */
40 size_t rkhdrs_ser_size; /**< Total serialized size of headers */
41};
42
43
44/**
45 * @brief The header item itself is a single-allocation immutable structure
46 * (rd_kafka_header_t) containing the header name, value and value
47 * length.
48 * Both the header name and header value are nul-terminated for
49 * API convenience.
50 * The header value is a tri-state:
51 * - proper value (considered binary) with length > 0
52 * - empty value with length = 0 (pointer is non-NULL and nul-termd)
53 * - null value with length = 0 (pointer is NULL)
54 */
55typedef struct rd_kafka_header_s {
56 size_t rkhdr_ser_size; /**< Serialized size */
57 size_t rkhdr_value_size; /**< Value length (without nul-term) */
58 size_t rkhdr_name_size; /**< Header name size (w/o nul-term) */
59 char *rkhdr_value; /**< Header value (nul-terminated string but
60 * considered binary).
61 * Will be NULL for null values, else
62 * points to rkhdr_name+.. */
63 char rkhdr_name[1]; /**< Header name (nul-terminated string).
64 * Followed by allocation for value+nul */
65} rd_kafka_header_t;
66
67
68/**
69 * @returns the serialized size for the headers
70 */
71static RD_INLINE RD_UNUSED size_t
72rd_kafka_headers_serialized_size (const rd_kafka_headers_t *hdrs) {
73 return hdrs->rkhdrs_ser_size;
74}
75
76#endif /* _RDKAFKA_HEADER_H */
77