OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library response; | |
6 | |
7 import 'dart:async'; | |
8 import 'dart:convert'; | |
9 import 'dart:typed_data'; | |
10 | |
11 import 'package:http_parser/http_parser.dart'; | |
12 | |
13 import 'base_request.dart'; | |
14 import 'base_response.dart'; | |
15 import 'streamed_response.dart'; | |
16 import 'utils.dart'; | |
17 | |
18 /// An HTTP response where the entire response body is known in advance. | |
19 class Response extends BaseResponse { | |
20 /// The bytes comprising the body of this response. | |
21 final Uint8List bodyBytes; | |
22 | |
23 /// The body of the response as a string. This is converted from [bodyBytes] | |
24 /// using the `charset` parameter of the `Content-Type` header field, if | |
25 /// available. If it's unavailable or if the encoding name is unknown, | |
26 /// [LATIN1] is used by default, as per [RFC 2616][]. | |
27 /// | |
28 /// [RFC 2616]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html | |
29 String get body => _encodingForHeaders(headers).decode(bodyBytes); | |
30 | |
31 /// Creates a new HTTP response with a string body. | |
32 Response( | |
33 String body, | |
34 int statusCode, | |
35 {BaseRequest request, | |
36 Map<String, String> headers: const {}, | |
37 bool isRedirect: false, | |
38 bool persistentConnection: true, | |
39 String reasonPhrase}) | |
40 : this.bytes( | |
41 _encodingForHeaders(headers).encode(body), | |
42 statusCode, | |
43 request: request, | |
44 headers: headers, | |
45 isRedirect: isRedirect, | |
46 persistentConnection: persistentConnection, | |
47 reasonPhrase: reasonPhrase); | |
48 | |
49 /// Create a new HTTP response with a byte array body. | |
50 Response.bytes( | |
51 List<int> bodyBytes, | |
52 int statusCode, | |
53 {BaseRequest request, | |
54 Map<String, String> headers: const {}, | |
55 bool isRedirect: false, | |
56 bool persistentConnection: true, | |
57 String reasonPhrase}) | |
58 : bodyBytes = toUint8List(bodyBytes), | |
59 super( | |
60 statusCode, | |
61 contentLength: bodyBytes.length, | |
62 request: request, | |
63 headers: headers, | |
64 isRedirect: isRedirect, | |
65 persistentConnection: persistentConnection, | |
66 reasonPhrase: reasonPhrase); | |
67 | |
68 /// Creates a new HTTP response by waiting for the full body to become | |
69 /// available from a [StreamedResponse]. | |
70 static Future<Response> fromStream(StreamedResponse response) { | |
71 return response.stream.toBytes().then((body) { | |
72 return new Response.bytes( | |
73 body, | |
74 response.statusCode, | |
75 request: response.request, | |
76 headers: response.headers, | |
77 isRedirect: response.isRedirect, | |
78 persistentConnection: response.persistentConnection, | |
79 reasonPhrase: response.reasonPhrase); | |
80 }); | |
81 } | |
82 } | |
83 | |
84 /// Returns the encoding to use for a response with the given headers. This | |
85 /// defaults to [LATIN1] if the headers don't specify a charset or | |
86 /// if that charset is unknown. | |
87 Encoding _encodingForHeaders(Map<String, String> headers) => | |
88 encodingForCharset(_contentTypeForHeaders(headers).parameters['charset']); | |
89 | |
90 /// Returns the [MediaType] object for the given headers's content-type. | |
91 /// | |
92 /// Defaults to `application/octet-stream`. | |
93 MediaType _contentTypeForHeaders(Map<String, String> headers) { | |
94 var contentType = headers['content-type']; | |
95 if (contentType != null) return new MediaType.parse(contentType); | |
96 return new MediaType("application", "octet-stream"); | |
97 } | |
OLD | NEW |