in lib/src/chunked_coding/decoder.dart [75:147]
Uint8List _decode(List<int> bytes, int start, int end) {
/// Throws a [FormatException] if `bytes[start] != $char`. Uses [name] to
/// describe the character in the exception text.
void assertCurrentChar(int char, String name) {
if (bytes[start] != char) {
throw FormatException('Expected $name.', bytes, start);
}
}
final buffer = Uint8Buffer();
while (start != end) {
switch (_state) {
case _State.boundary:
_size = _digitForByte(bytes, start);
_state = _State.size;
start++;
break;
case _State.size:
if (bytes[start] == $cr) {
_state = _State.sizeBeforeLF;
} else {
// Shift four bits left since a single hex digit contains four bits
// of information.
_size = (_size << 4) + _digitForByte(bytes, start);
}
start++;
break;
case _State.sizeBeforeLF:
assertCurrentChar($lf, 'LF');
_state = _size == 0 ? _State.endBeforeCR : _State.body;
start++;
break;
case _State.body:
final chunkEnd = math.min(end, start + _size);
buffer.addAll(bytes, start, chunkEnd);
_size -= chunkEnd - start;
start = chunkEnd;
if (_size == 0) _state = _State.bodyBeforeCR;
break;
case _State.bodyBeforeCR:
assertCurrentChar($cr, 'CR');
_state = _State.bodyBeforeLF;
start++;
break;
case _State.bodyBeforeLF:
assertCurrentChar($lf, 'LF');
_state = _State.boundary;
start++;
break;
case _State.endBeforeCR:
assertCurrentChar($cr, 'CR');
_state = _State.endBeforeLF;
start++;
break;
case _State.endBeforeLF:
assertCurrentChar($lf, 'LF');
_state = _State.end;
start++;
break;
case _State.end:
throw FormatException('Expected no more data.', bytes, start);
}
}
return buffer.buffer.asUint8List(0, buffer.length);
}