Index: dart/pkg/http_base/lib/http_base.dart |
diff --git a/dart/pkg/http_base/lib/http_base.dart b/dart/pkg/http_base/lib/http_base.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d05812e28fba157b22948b564ff9d3cad0c06272 |
--- /dev/null |
+++ b/dart/pkg/http_base/lib/http_base.dart |
@@ -0,0 +1,126 @@ |
+// Copyright (c) 2014, 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. |
+ |
+library http_base; |
+ |
+import 'dart:async'; |
+ |
+/** |
+ * Representation of a set of HTTP headers. |
+ */ |
+abstract class Headers { |
+ /** |
+ * Returns the names of all header fields. |
+ */ |
+ Iterable<String> get names; |
+ |
+ /** |
+ * Returns `true` if a header field of the specified [name] exist. |
+ */ |
+ bool contains(String name); |
+ |
+ /** |
+ * Returns the value for the header field named [name]. |
+ * |
+ * The HTTP standard supports multiple values for each header field name. |
+ * Header fields with multiple values can be represented as a |
+ * comma-separated list. If a header has multiple values the returned string |
+ * is the comma-separated list of all these values. |
+ * |
+ * For header field-names which do not allow combining multiple values with |
+ * comma, this index operator will throw `IllegalArgument`. |
+ * This is currently the case for the 'Cookie' and 'Set-Cookie' headers. Use |
+ * `getMultiple` method to iterate over the header values for these. |
+ */ |
+ String operator [](String name); |
+ |
+ /** |
+ * Returns the values for the header field named [name]. |
+ * |
+ * The order in which the values for the field name appear is the same |
+ * as the order in which they are to be send or was received. |
+ */ |
+ Iterable<String> getMultiple(String name); |
+} |
+ |
+ |
+/** |
+ * Representation of a HTTP request. |
+ */ |
+abstract class Request { |
+ /** |
+ * Request method. |
+ */ |
+ String get method; |
+ |
+ /** |
+ * Request url. |
+ */ |
+ Uri get url; |
+ |
+ /** |
+ * Request headers. |
+ */ |
+ Headers get headers; |
+ |
+ /** |
+ * Request body. |
+ */ |
+ Stream<List<int>> read(); |
+} |
+ |
+ |
+/** |
+ * Representation of a HTTP response. |
+ */ |
+abstract class Response { |
+ /** |
+ * Response status code. |
+ */ |
+ int get status; |
+ |
+ /** |
+ * Response headers. |
+ */ |
+ Headers get headers; |
+ |
+ /** |
+ * Response body. |
+ */ |
+ Stream<List<int>> read(); |
+} |
+ |
+ |
+ |
+/** |
+ * Function for performing a HTTP request. |
+ * |
+ * The [Client] may use any transport mechanism it wants |
+ * (e.g. HTTP/1.1, HTTP/2.0, SPDY) to perform the HTTP request. |
+ * |
+ * [Client]s are composable. E.g. A [Client] may add an 'Authorization' |
+ * header to [request] and forward to another [Client]. |
+ * |
+ * A [Client] may ignore connection specific headers in [request] and may |
+ * not present them in the [Response] object. |
+ * |
+ * Connection specific headers: |
+ * 'Connection', 'Upgrade', 'Keep-Alive', 'Transfer-Encoding' |
+ */ |
+typedef Future<Response> Client(Request request); |
+ |
+/** |
+ * Function for handling a HTTP request. |
+ * |
+ * The [RequestHandler] should not react on any connection specific headers |
+ * in [request] and connection specific headers in it's [Response] may be |
+ * ignored by a HTTP Server. |
+ * |
+ * [RequestHandler]s are composable. E.g. A [RequestHandler] may call another |
+ * [RequestHandler] and augment the headers with e.g. a 'Set-Cookie' header. |
+ * |
+ * Connection specific headers: |
+ * 'Connection', 'Upgrade', 'Keep-Alive', 'Transfer-Encoding' |
+ */ |
+typedef Future<Response> HttpRequestHandler(Request request); |