networking · intermediate · ~15 min

HTTP Chunked Transfer Decoder

Parse HTTP/1.1 chunked framing with hex length parsing and strict CRLF validation.

Challenge

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.

Your Task

Implement:

int decode_http_chunks(const char *raw, uint8_t *out_payload, size_t out_cap, size_t *out_len);

Chunk Format

<hex-length>\r\n
<chunk-data>\r\n
...
0\r\n\r\n

Rules

  1. If raw == NULL, out_payload == NULL, out_len == NULL, or out_cap == 0, return -1.
  2. Read chunk size in hexadecimal up to \r\n (using strtoul(..., 16)).
  3. If chunk size is 0 (terminal chunk), stop parsing and return 0.
  4. Verify that the chunk payload is followed immediately by \r\n.
  5. If cumulative decoded payload exceeds out_cap, return -1 without buffer overflow.
  6. Copy chunk data into out_payload + *out_len, update *out_len.
  7. Repeat until terminal chunk 0 is processed. Return 0 on success.

Example

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"

Input format

raw: chunked string; out_payload: destination buffer; out_cap: capacity; out_len: size_t output.

Output format

Returns 0 on successful decode, -1 on malformed chunks or capacity overflow.

Constraints

Parse hex chunk size. Verify CRLF after chunk data.

Starter code

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

Common mistakes

Forgetting that chunk sizes are hexadecimal; missing CRLF skip after payload.

Edge cases to handle

0\r\n\r\n produces 0-length payload; invalid hex returns -1; missing CRLF returns -1.

Background lessons

Solve this exercise in the browser editor — compile and run against the test harness, no setup required.