| // Copyright 2019 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:convert'; |
| import 'dart:typed_data'; |
| |
| import 'package:meta/meta.dart'; |
| |
| /// Class that represents an HTTP response body before it has been serialized. |
| @immutable |
| abstract class Body { |
| /// Creates a new [Body]. |
| const Body(); |
| |
| /// Creates a [Body] that serializes the specified String [content]. |
| factory Body.forString(String content) => _StringBody(content); |
| |
| /// Creates a [Body] that passes through the already-serialized [stream]. |
| factory Body.forStream(Stream<Uint8List?> stream) => _StreamBody(stream); |
| |
| /// Creates a [Body] that serializes the specified JSON [value]. |
| /// |
| /// The [value] argument may be any JSON tyope (any scalar value, any object |
| /// that defines a `toJson()` method that returns a JSON type, or a [List] or |
| /// [Map] of other JSON types). |
| factory Body.forJson(dynamic value) => Body.forString(json.encode(value)); |
| |
| /// Value indicating that the HTTP response body should be empty. |
| static const Body empty = _EmptyBody(); |
| |
| /// Serializes this response body to bytes. |
| Stream<Uint8List?> serialize(); |
| } |
| |
| abstract class JsonBody extends Body { |
| const JsonBody(); |
| |
| @override |
| Stream<Uint8List> serialize() { |
| final Stream<String> raw = json.encoder.bind(Stream<Object>.fromIterable(<Object>[toJson()])); |
| return utf8.encoder.bind(raw).cast<Uint8List>(); |
| } |
| |
| /// Serializes this response body to a JSON-primitive map. |
| Map<String, dynamic> toJson(); |
| } |
| |
| class _EmptyBody extends Body { |
| const _EmptyBody(); |
| |
| @override |
| Stream<Uint8List> serialize() => const Stream<Uint8List>.empty(); |
| } |
| |
| class _StringBody extends Body { |
| const _StringBody(this.content); |
| |
| final String content; |
| |
| @override |
| Stream<Uint8List> serialize() { |
| return utf8.encoder.bind(Stream<String>.fromIterable(<String>[content])).cast<Uint8List>(); |
| } |
| } |
| |
| class _StreamBody extends Body { |
| const _StreamBody(this.stream); |
| |
| final Stream<Uint8List?> stream; |
| |
| @override |
| Stream<Uint8List?> serialize() => stream; |
| } |