17size_t pc_amqp_protocol_header(uint8_t *buf,
size_t cap)
19 static const uint8_t hdr[8] = {
'A',
'M',
'Q',
'P', 0, 0, 9, 1};
20 if (!buf || cap <
sizeof(hdr))
24 memcpy(buf, hdr,
sizeof(hdr));
29static size_t write_frame_header(uint8_t *buf, uint8_t type, uint16_t channel, uint32_t size)
38size_t pc_amqp_build_frame(uint8_t *buf,
size_t cap, uint8_t type, uint16_t channel,
const uint8_t *payload,
41 if (!buf || (payload_len && !payload) || payload_len > 0xFFFFFFFFu)
45 size_t total = AMQP_FRAME_OVERHEAD + payload_len;
50 size_t p = write_frame_header(buf, type, channel, (uint32_t)payload_len);
53 memcpy(buf + p, payload, payload_len);
56 buf[p++] = AMQP_FRAME_END;
60size_t pc_amqp_build_method(uint8_t *buf,
size_t cap, uint16_t channel, uint16_t class_id, uint16_t method_id,
61 const uint8_t *args,
size_t args_len)
63 if (!buf || (args_len && !args))
67 size_t payload_len = 4 + args_len;
68 size_t total = AMQP_FRAME_OVERHEAD + payload_len;
74 size_t p = write_frame_header(buf, AMQP_FRAME_METHOD, channel, (uint32_t)payload_len);
79 memcpy(buf + p, args, args_len);
82 buf[p++] = AMQP_FRAME_END;
86size_t pc_amqp_build_content_header(uint8_t *buf,
size_t cap, uint16_t channel, uint16_t class_id, uint64_t body_size,
87 uint16_t property_flags,
const uint8_t *properties,
size_t properties_len)
89 if (!buf || (properties_len && !properties))
93 size_t payload_len = 2 + 2 + 8 + 2 + properties_len;
94 size_t total = AMQP_FRAME_OVERHEAD + payload_len;
99 size_t p = write_frame_header(buf, AMQP_FRAME_HEADER, channel, (uint32_t)payload_len);
106 memcpy(buf + p, properties, properties_len);
109 buf[p++] = AMQP_FRAME_END;
113size_t pc_amqp_build_heartbeat(uint8_t *buf,
size_t cap)
115 return pc_amqp_build_frame(buf, cap, AMQP_FRAME_HEARTBEAT, 0,
nullptr, 0);
118bool pc_amqp_parse_frame(
const uint8_t *buf,
size_t len, AmqpFrame *out,
size_t *consumed)
120 if (!buf || !out || len < AMQP_FRAME_OVERHEAD)
127 if (size > len - AMQP_FRAME_OVERHEAD)
131 size_t total = AMQP_FRAME_OVERHEAD + (size_t)size;
132 if (buf[7 + size] != AMQP_FRAME_END)
138 out->payload = buf + 7;
139 out->payload_len = size;
147bool pc_amqp_parse_method(
const uint8_t *payload,
size_t payload_len, uint16_t *class_id, uint16_t *method_id,
148 const uint8_t **args,
size_t *args_len)
150 if (!payload || payload_len < 4)
168 *args_len = payload_len - 4;
AMQP 0-9-1 frame codec (PC_ENABLE_AMQP) - zero-heap frame builder + parser for the RabbitMQ wire prot...
Fixed-width integer serializers into a raw uint8_t* buffer - one source of truth.
size_t pc_wr64be(uint8_t *p, uint64_t v)
Write v big-endian at p.
uint32_t pc_rd32be(const uint8_t *p)
Read a big-endian u32 at p.
size_t pc_wr16be(uint8_t *p, uint16_t v)
Write v big-endian at p.
uint16_t pc_rd16be(const uint8_t *p)
Read a big-endian u16 at p.
size_t pc_wr32be(uint8_t *p, uint32_t v)
Write v big-endian at p.