Each chunk line gives a size before data.

highlighted = computed this step

The first chunk carries two bytes

The first chunk size converts to 2 data bytes.

first chunk bytes=2\text{first chunk bytes}=2
Chunk linesThe request, chunked response headers, chunk rows, decoded body, and checks are recomputed from pinned bytes.Chunk lines - GET /stream chunks decode to hi! (3 bytes)sectionnamevaluecheckrequest linemethodGETparsedrequest linepath/streamparsedrequest lineversionHTTP/1.1parsedheaderHostapi.exampleexactstatusversionHTTP/1.1parsedstatusstatus200 OKokheaderTransfer-EncodingchunkedchunkedheaderContent-Lengthabsentnot usedchunk 1size token2hex sizechunk 1decimal size2convertedchunk 1data displayhisafe display formchunk 1data hex6869pinned byteschunk 1roledatastream partchunk 2size token1hex sizechunk 2decimal size1convertedchunk 2data displayexclamation marksafe display formchunk 2data hex21pinned byteschunk 2roledatastream partchunk 3size token0hex sizechunk 3decimal size0convertedchunk 3data displayend markersafe display formchunk 3data hexno datapinned byteschunk 3roleendstream partdecoded bodydisplayhi!safe display formdecoded bodyexact hex686921pinned bytesdecoded bodybyte length3countedcheckfirst chunk bytes2chunk sizechecksecond chunk bytes1chunk sizecheckdecoded body bytes3sumcheckzero chunk endsyesterminatorcheckContent-Lengthabsentabsent

The second chunk carries one byte

The second chunk size converts to 1 data byte.

second chunk bytes=1\text{second chunk bytes}=1
Chunk linesThe request, chunked response headers, chunk rows, decoded body, and checks are recomputed from pinned bytes.Chunk lines - GET /stream chunks decode to hi! (3 bytes)sectionnamevaluecheckrequest linemethodGETparsedrequest linepath/streamparsedrequest lineversionHTTP/1.1parsedheaderHostapi.exampleexactstatusversionHTTP/1.1parsedstatusstatus200 OKokheaderTransfer-EncodingchunkedchunkedheaderContent-Lengthabsentnot usedchunk 1size token2hex sizechunk 1decimal size2convertedchunk 1data displayhisafe display formchunk 1data hex6869pinned byteschunk 1roledatastream partchunk 2size token1hex sizechunk 2decimal size1convertedchunk 2data displayexclamation marksafe display formchunk 2data hex21pinned byteschunk 2roledatastream partchunk 3size token0hex sizechunk 3decimal size0convertedchunk 3data displayend markersafe display formchunk 3data hexno datapinned byteschunk 3roleendstream partdecoded bodydisplayhi!safe display formdecoded bodyexact hex686921pinned bytesdecoded bodybyte length3countedcheckfirst chunk bytes2chunk sizechecksecond chunk bytes1chunk sizecheckdecoded body bytes3sumcheckzero chunk endsyesterminatorcheckContent-Lengthabsentabsent

The zero-size chunk is the end marker

The final chunk row has no data. It marks the end of the body.

zero chunk ends\text{zero chunk ends}
Chunk linesThe request, chunked response headers, chunk rows, decoded body, and checks are recomputed from pinned bytes.Chunk lines - GET /stream chunks decode to hi! (3 bytes)sectionnamevaluecheckrequest linemethodGETparsedrequest linepath/streamparsedrequest lineversionHTTP/1.1parsedheaderHostapi.exampleexactstatusversionHTTP/1.1parsedstatusstatus200 OKokheaderTransfer-EncodingchunkedchunkedheaderContent-Lengthabsentnot usedchunk 1size token2hex sizechunk 1decimal size2convertedchunk 1data displayhisafe display formchunk 1data hex6869pinned byteschunk 1roledatastream partchunk 2size token1hex sizechunk 2decimal size1convertedchunk 2data displayexclamation marksafe display formchunk 2data hex21pinned byteschunk 2roledatastream partchunk 3size token0hex sizechunk 3decimal size0convertedchunk 3data displayend markersafe display formchunk 3data hexno datapinned byteschunk 3roleendstream partdecoded bodydisplayhi!safe display formdecoded bodyexact hex686921pinned bytesdecoded bodybyte length3countedcheckfirst chunk bytes2chunk sizechecksecond chunk bytes1chunk sizecheckdecoded body bytes3sumcheckzero chunk endsyesterminatorcheckContent-Lengthabsentabsent

Summary

The body is read chunk by chunk until the zero-size marker appears.

chunk rows checked\text{chunk rows checked}
Chunk linesThe request, chunked response headers, chunk rows, decoded body, and checks are recomputed from pinned bytes.Chunk lines - GET /stream chunks decode to hi! (3 bytes)sectionnamevaluecheckrequest linemethodGETparsedrequest linepath/streamparsedrequest lineversionHTTP/1.1parsedheaderHostapi.exampleexactstatusversionHTTP/1.1parsedstatusstatus200 OKokheaderTransfer-EncodingchunkedchunkedheaderContent-Lengthabsentnot usedchunk 1size token2hex sizechunk 1decimal size2convertedchunk 1data displayhisafe display formchunk 1data hex6869pinned byteschunk 1roledatastream partchunk 2size token1hex sizechunk 2decimal size1convertedchunk 2data displayexclamation marksafe display formchunk 2data hex21pinned byteschunk 2roledatastream partchunk 3size token0hex sizechunk 3decimal size0convertedchunk 3data displayend markersafe display formchunk 3data hexno datapinned byteschunk 3roleendstream partdecoded bodydisplayhi!safe display formdecoded bodyexact hex686921pinned bytesdecoded bodybyte length3countedcheckfirst chunk bytes2chunk sizechecksecond chunk bytes1chunk sizecheckdecoded body bytes3sumcheckzero chunk endsyesterminatorcheckContent-Lengthabsentabsent