networking · intermediate · ~15 min
Parse HTTP/1.1 chunked framing with hex length parsing and strict CRLF validation.
HTTP/1.1 chunked transfer encoding (Transfer-Encoding: chunked) streams content in hex-length tagged chunks. A chunk parser validates hex sizes, skips CRLF delimiters, and coalesces chunks into a contiguous payload.
Implement:
int decode_http_chunks(const char *raw, uint8_t *out_payload, size_t out_cap, size_t *out_len);
<hex-length>\r\n
<chunk-data>\r\n
...
0\r\n\r\n
raw == NULL, out_payload == NULL, out_len == NULL, or out_cap == 0, return -1.\r\n (using strtoul(..., 16)).0 (terminal chunk), stop parsing and return 0.\r\n.out_cap, return -1 without buffer overflow.out_payload + *out_len, update *out_len.0 is processed. Return 0 on success.const char *data = "4\r\nWiki\r\n5\r\npedia\r\n0\r\n\r\n";
uint8_t out[32]; size_t len = 0;
decode_http_chunks(data, out, sizeof(out), &len); // returns 0, len == 9, out == "Wikipedia"
raw: chunked string; out_payload: destination buffer; out_cap: capacity; out_len: size_t output.
Returns 0 on successful decode, -1 on malformed chunks or capacity overflow.
Parse hex chunk size. Verify CRLF after chunk data.
#include <stddef.h>
#include <stdint.h>
int decode_http_chunks(const char *raw, uint8_t *out_payload, size_t out_cap, size_t *out_len) {
(void)raw; (void)out_payload; (void)out_cap; (void)out_len;
return -1;
}
Forgetting that chunk sizes are hexadecimal; missing CRLF skip after payload.
0\r\n\r\n produces 0-length payload; invalid hex returns -1; missing CRLF returns -1.
Solve this exercise in the browser editor — compile and run against the test harness, no setup required.