finalize method

Stream<Uint8List> finalize()

Commits all fields and files into a stream for the final sending.

Implementation

Stream<Uint8List> finalize() {
  if (isFinalized) {
    throw StateError(
      'The FormData has already been finalized. '
      'This typically means you are using '
      'the same FormData in repeated requests.',
    );
  }
  _isFinalized = true;

  final controller = StreamController<Uint8List>(sync: false);
  void writeAscii(String s) => controller.add(utf8.encode(s));
  void writeUtf8(String string) => controller.add(utf8.encode(string));
  void writeLine() => controller.add(_rnU8); // \r\n

  for (final entry in fields) {
    writeAscii('--$boundary$_rn');
    writeAscii(_headerForField(entry.key, entry.value));
    writeUtf8(entry.value);
    writeLine();
  }

  Future<void>(() async {
    for (final file in files) {
      writeAscii('--$boundary$_rn');
      writeAscii(_headerForFile(file));
      await writeStreamToSink(file.value.finalize(), controller);
      writeLine();
    }
  }).then((_) {
    writeAscii('--$boundary--$_rn');
  }).whenComplete(() {
    controller.close();
  });

  return controller.stream;
}