ChunkDecoder is useful to help decode chunk-transfer-encoded data, particularly from HTTP.
- XML documentation
using ChunkDecoder;
public Decoder decoder = new Decoder();
// process a byte array
if (decoder.Decode(data, out outData))
{
// success
}
// process a stream
long outLength = 0;
MemoryStream outStream = null;
if (decoder.Decode(stream, out outLength, out outStream))
{
// success
}
Chunk-transfer-encoded data is sent in segments, where each segment is comprised of a line containing the length (in hexadecimal) and the subsequent line containing the payload. Each line ends with a carriage return and line feed .
The final line ends with 0<crlf><crlf>
indicating the end of the stream.
For instance:
6<crlf> // 6 bytes of data will follow.
Hello_<crlf> // data. The value is 'Hello_' where _ is actually a space.
5<crlf> // 5 bytes of data will follow.
World<crlf> // data. The value is 'World'.
0<crlf><crlf> // end of stream.
Results in:
Hello world
For more information, please see:
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding
- https://en.wikipedia.org/wiki/Chunked_transfer_encoding
In cases where the supplied data has signatures, i.e.
6;chunk-signature=foo<crlf> // 6 bytes of data will follow, and the signature of the chunk is foo.
Hello_<crlf> // data. The value is 'Hello ' and _ is actually a space.
5;chunk-signature:bar<crlf> // 5 bytes of data will follow, and the signature of the chunk is bar.
World<crlf> // data. The value is 'World'.
0;<crlf><crlf> // end of stream.
You can assigned the Decoder.ProcessSignature
callback, which has the following signature:
using System.Collections.Generic;
static bool ProcessSignature(KeyValuePair<string, string>, byte[] data)
{
return true;
}
This method should return true
, otherwise ChunkDecoder will assume there is an error and terminate.
If you wish to process each chunk as it is read, set the Decoder.ProcessChunk
callback, which has the followning signature:
static bool ProcessChunk(byte[] data)
{
return true;
}
This method should also return true
, for the same reason. ProcessChunk is always called after ProcessSignature.
Refer to CHANGELOG.md