Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1015)

Unified Diff: sdk/lib/io/http_body_impl.dart

Issue 14019002: Introduce new HttpBodyHandler to easily extract full body of HttpRequest and HttpClientResponse. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/io/http_body.dart ('k') | sdk/lib/io/io.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/io/http_body_impl.dart
diff --git a/sdk/lib/io/http_body_impl.dart b/sdk/lib/io/http_body_impl.dart
new file mode 100644
index 0000000000000000000000000000000000000000..4bd9f8171cad26ee7bee0a7cb9654c699e82f9a2
--- /dev/null
+++ b/sdk/lib/io/http_body_impl.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart.io;
+
+class _HttpBodyHandlerTransformer
+ extends StreamEventTransformer<HttpRequest, HttpRequestBody> {
+ void handleData(HttpRequest request, EventSink<HttpRequestBody> sink) {
+ HttpBodyHandler.processRequest(request)
+ .then(sink.add, onError: sink.addError);
+ }
+}
+
+class _HttpBodyHandler implements HttpBodyHandler {
+ Stream<HttpRequestBody> bind(Stream<HttpRequest> stream) {
+ return new _HttpBodyHandlerTransformer().bind(stream);
+ }
+
+ static Future<HttpRequestBody> processRequest(HttpRequest request) {
+ return process(request, request.headers)
+ .then((body) => new _HttpRequestBody(request, body),
+ onError: (error) {
+ // Try to send BAD_REQUEST response.
+ request.response.statusCode = HttpStatus.BAD_REQUEST;
+ request.response.close();
+ request.response.done.catchError((_) {});
+ throw error;
+ });
+ }
+
+ static Future<HttpClientResponseBody> processResponse(
+ HttpClientResponse response) {
+ return process(response, response.headers)
+ .then((body) => new _HttpClientResponseBody(response, body));
+ }
+
+ static Future<HttpBody> process(Stream<List<int>> stream,
+ HttpHeaders headers) {
+ return stream.fold(
+ new _BufferList(),
+ (buffer, data) {
+ // TODO(ajohnsen): Add limit for POST data.
+ buffer.add(data);
+ return buffer;
+ })
+ .then((list) {
+ dynamic content = list.readBytes();
+ String type = "binary";
+ String mimeType = headers.contentType.toString();
+ String asText(Encoding defaultEncoding) {
+ var encoding;
+ var charset = headers.contentType.charset;
+ if (charset != null) encoding = Encoding.fromName(charset);
+ if (encoding == null) encoding = defaultEncoding;
+ return _decodeString(content, encoding);
+ }
+ switch (headers.contentType.primaryType) {
+ case "text":
+ type = "text";
+ content = asText(Encoding.ASCII);
+ break;
+
+ case "application":
+ switch (headers.contentType.subType) {
+ case "json":
+ content = JSON.parse(asText(Encoding.UTF_8));
+ type = "json";
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ return new _HttpBody(mimeType, type, content);
+ });
+ }
+}
+
+class _HttpBody implements HttpBody {
+ final String mimeType;
+ final String type;
+ final dynamic body;
+
+ _HttpBody(String this.mimeType,
+ String this.type,
+ dynamic this.body);
+}
+
+class _HttpRequestBody extends _HttpBody implements HttpRequestBody {
+ final String method;
+ final Uri uri;
+ final HttpHeaders headers;
+ final HttpResponse response;
+
+ _HttpRequestBody(HttpRequest request, HttpBody body)
+ : super(body.mimeType, body.type, body.body),
+ method = request.method,
+ uri = request.uri,
+ headers = request.headers,
+ response = request.response;
+}
+
+class _HttpClientResponseBody
+ extends _HttpBody implements HttpClientResponseBody {
+ final int statusCode;
+ final String reasonPhrase;
+ final HttpHeaders headers;
+
+ _HttpClientResponseBody(HttpClientResponse response, HttpBody body)
+ : super(body.mimeType, body.type, body.body),
+ statusCode = response.statusCode,
+ reasonPhrase = response.reasonPhrase,
+ headers = response.headers;
+}
« no previous file with comments | « sdk/lib/io/http_body.dart ('k') | sdk/lib/io/io.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698