| Index: lib/src/message.dart
|
| diff --git a/lib/src/message.dart b/lib/src/message.dart
|
| index 93a0730067951f3cc4afe3587ef2c4f9377c970d..0d41b53c1682cb2911a1311571751b6a6adcab42 100644
|
| --- a/lib/src/message.dart
|
| +++ b/lib/src/message.dart
|
| @@ -9,9 +9,12 @@ import 'dart:convert';
|
|
|
| import 'package:http_parser/http_parser.dart';
|
|
|
| +import 'body.dart';
|
| import 'shelf_unmodifiable_map.dart';
|
| import 'util.dart';
|
|
|
| +Body getBody(Message message) => message._body;
|
| +
|
| /// Represents logic shared between [Request] and [Response].
|
| abstract class Message {
|
| /// The HTTP headers.
|
| @@ -35,13 +38,7 @@ abstract class Message {
|
| /// The streaming body of the message.
|
| ///
|
| /// This can be read via [read] or [readAsString].
|
| - final Stream<List<int>> _body;
|
| -
|
| - /// This boolean indicates whether [_body] has been read.
|
| - ///
|
| - /// After calling [read], or [readAsString] (which internally calls [read]),
|
| - /// this will be `true`.
|
| - bool _bodyWasRead = false;
|
| + final Body _body;
|
|
|
| /// Creates a new [Message].
|
| ///
|
| @@ -57,7 +54,7 @@ abstract class Message {
|
| /// Content-Type header, it will be set to "application/octet-stream".
|
| Message(body, {Encoding encoding, Map<String, String> headers,
|
| Map<String, Object> context})
|
| - : this._body = _bodyToStream(body, encoding),
|
| + : this._body = new Body(body, encoding),
|
| this.headers = new ShelfUnmodifiableMap<String>(
|
| _adjustHeaders(headers, encoding), ignoreKeyCase: true),
|
| this.context = new ShelfUnmodifiableMap<Object>(context,
|
| @@ -114,14 +111,7 @@ abstract class Message {
|
| /// Returns a [Stream] representing the body.
|
| ///
|
| /// Can only be called once.
|
| - Stream<List<int>> read() {
|
| - if (_bodyWasRead) {
|
| - throw new StateError("The 'read' method can only be called once on a "
|
| - "shelf.Request/shelf.Response object.");
|
| - }
|
| - _bodyWasRead = true;
|
| - return _body;
|
| - }
|
| + Stream<List<int>> read() => _body.read();
|
|
|
| /// Returns a [Future] containing the body as a String.
|
| ///
|
| @@ -142,20 +132,6 @@ abstract class Message {
|
| body});
|
| }
|
|
|
| -/// Converts [body] to a byte stream.
|
| -///
|
| -/// [body] may be either a [String], a [Stream<List<int>>], or `null`. If it's a
|
| -/// [String], [encoding] will be used to convert it to a [Stream<List<int>>].
|
| -Stream<List<int>> _bodyToStream(body, Encoding encoding) {
|
| - if (encoding == null) encoding = UTF8;
|
| - if (body == null) return new Stream.fromIterable([]);
|
| - if (body is String) return new Stream.fromIterable([encoding.encode(body)]);
|
| - if (body is Stream) return body;
|
| -
|
| - throw new ArgumentError('Response body "$body" must be a String or a '
|
| - 'Stream.');
|
| -}
|
| -
|
| /// Adds information about [encoding] to [headers].
|
| ///
|
| /// Returns a new map without modifying [headers].
|
|
|