| Index: pkg/dev_compiler/tool/input_sdk/lib/io/http.dart
|
| diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/http.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/http.dart
|
| deleted file mode 100644
|
| index 07257eaf8b2710fbcbbebc623b5f15cf15077c90..0000000000000000000000000000000000000000
|
| --- a/pkg/dev_compiler/tool/input_sdk/lib/io/http.dart
|
| +++ /dev/null
|
| @@ -1,2033 +0,0 @@
|
| -// 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;
|
| -
|
| -/**
|
| - * HTTP status codes.
|
| - */
|
| -abstract class HttpStatus {
|
| - static const int CONTINUE = 100;
|
| - static const int SWITCHING_PROTOCOLS = 101;
|
| - static const int OK = 200;
|
| - static const int CREATED = 201;
|
| - static const int ACCEPTED = 202;
|
| - static const int NON_AUTHORITATIVE_INFORMATION = 203;
|
| - static const int NO_CONTENT = 204;
|
| - static const int RESET_CONTENT = 205;
|
| - static const int PARTIAL_CONTENT = 206;
|
| - static const int MULTIPLE_CHOICES = 300;
|
| - static const int MOVED_PERMANENTLY = 301;
|
| - static const int FOUND = 302;
|
| - static const int MOVED_TEMPORARILY = 302; // Common alias for FOUND.
|
| - static const int SEE_OTHER = 303;
|
| - static const int NOT_MODIFIED = 304;
|
| - static const int USE_PROXY = 305;
|
| - static const int TEMPORARY_REDIRECT = 307;
|
| - static const int BAD_REQUEST = 400;
|
| - static const int UNAUTHORIZED = 401;
|
| - static const int PAYMENT_REQUIRED = 402;
|
| - static const int FORBIDDEN = 403;
|
| - static const int NOT_FOUND = 404;
|
| - static const int METHOD_NOT_ALLOWED = 405;
|
| - static const int NOT_ACCEPTABLE = 406;
|
| - static const int PROXY_AUTHENTICATION_REQUIRED = 407;
|
| - static const int REQUEST_TIMEOUT = 408;
|
| - static const int CONFLICT = 409;
|
| - static const int GONE = 410;
|
| - static const int LENGTH_REQUIRED = 411;
|
| - static const int PRECONDITION_FAILED = 412;
|
| - static const int REQUEST_ENTITY_TOO_LARGE = 413;
|
| - static const int REQUEST_URI_TOO_LONG = 414;
|
| - static const int UNSUPPORTED_MEDIA_TYPE = 415;
|
| - static const int REQUESTED_RANGE_NOT_SATISFIABLE = 416;
|
| - static const int EXPECTATION_FAILED = 417;
|
| - static const int INTERNAL_SERVER_ERROR = 500;
|
| - static const int NOT_IMPLEMENTED = 501;
|
| - static const int BAD_GATEWAY = 502;
|
| - static const int SERVICE_UNAVAILABLE = 503;
|
| - static const int GATEWAY_TIMEOUT = 504;
|
| - static const int HTTP_VERSION_NOT_SUPPORTED = 505;
|
| - // Client generated status code.
|
| - static const int NETWORK_CONNECT_TIMEOUT_ERROR = 599;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * A server that delivers content, such as web pages, using the HTTP protocol.
|
| - *
|
| - * The HttpServer is a [Stream] that provides [HttpRequest] objects. Each
|
| - * HttpRequest has an associated [HttpResponse] object.
|
| - * The server responds to a request by writing to that HttpResponse object.
|
| - * The following example shows how to bind an HttpServer to an IPv6
|
| - * [InternetAddress] on port 80 (the standard port for HTTP servers)
|
| - * and how to listen for requests.
|
| - * Port 80 is the default HTTP port. However, on most systems accessing
|
| - * this requires super-user privileges. For local testing consider
|
| - * using a non-reserved port (1024 and above).
|
| - *
|
| - * import 'dart:io';
|
| - *
|
| - * main() {
|
| - * HttpServer
|
| - * .bind(InternetAddress.ANY_IP_V6, 80)
|
| - * .then((server) {
|
| - * server.listen((HttpRequest request) {
|
| - * request.response.write('Hello, world!');
|
| - * request.response.close();
|
| - * });
|
| - * });
|
| - * }
|
| - *
|
| - * Incomplete requests, in which all or part of the header is missing, are
|
| - * ignored, and no exceptions or HttpRequest objects are generated for them.
|
| - * Likewise, when writing to an HttpResponse, any [Socket] exceptions are
|
| - * ignored and any future writes are ignored.
|
| - *
|
| - * The HttpRequest exposes the request headers and provides the request body,
|
| - * if it exists, as a Stream of data. If the body is unread, it is drained
|
| - * when the server writes to the HttpResponse or closes it.
|
| - *
|
| - * ## Bind with a secure HTTPS connection
|
| - *
|
| - * Use [bindSecure] to create an HTTPS server.
|
| - *
|
| - * The server presents a certificate to the client. The certificate
|
| - * chain and the private key are set in the [SecurityContext]
|
| - * object that is passed to [bindSecure].
|
| - *
|
| - * import 'dart:io';
|
| - * import "dart:isolate";
|
| - *
|
| - * main() {
|
| - * SecurityContext context = new SecurityContext();
|
| - * var chain =
|
| - * Platform.script.resolve('certificates/server_chain.pem')
|
| - * .toFilePath();
|
| - * var key =
|
| - * Platform.script.resolve('certificates/server_key.pem')
|
| - * .toFilePath();
|
| - * context.useCertificateChain(chain);
|
| - * context.usePrivateKey(key, password: 'dartdart');
|
| - *
|
| - * HttpServer
|
| - * .bindSecure(InternetAddress.ANY_IP_V6,
|
| - * 443,
|
| - * context)
|
| - * .then((server) {
|
| - * server.listen((HttpRequest request) {
|
| - * request.response.write('Hello, world!');
|
| - * request.response.close();
|
| - * });
|
| - * });
|
| - * }
|
| - *
|
| - * The certificates and keys are PEM files, which can be created and
|
| - * managed with the tools in OpenSSL.
|
| - *
|
| - * ## Connect to a server socket
|
| - *
|
| - * You can use the [listenOn] constructor to attach an HTTP server to
|
| - * a [ServerSocket].
|
| - *
|
| - * import 'dart:io';
|
| - *
|
| - * main() {
|
| - * ServerSocket.bind(InternetAddress.ANY_IP_V6, 80)
|
| - * .then((serverSocket) {
|
| - * HttpServer httpserver = new HttpServer.listenOn(serverSocket);
|
| - * serverSocket.listen((Socket socket) {
|
| - * socket.write('Hello, client.');
|
| - * });
|
| - * });
|
| - * }
|
| - *
|
| - * ## Other resources
|
| - *
|
| - * * HttpServer is a Stream. Refer to the [Stream] class for information
|
| - * about the streaming qualities of an HttpServer.
|
| - * Pausing the subscription of the stream, pauses at the OS level.
|
| - *
|
| - * * The [http_server](https://pub.dartlang.org/packages/http_server)
|
| - * package on pub.dartlang.org contains a set of high-level classes that,
|
| - * together with this class, makes it easy to provide content through HTTP
|
| - * servers.
|
| - */
|
| -abstract class HttpServer implements Stream<HttpRequest> {
|
| - /**
|
| - * Get and set the default value of the `Server` header for all responses
|
| - * generated by this [HttpServer].
|
| - *
|
| - * If [serverHeader] is `null`, no `Server` header will be added to each
|
| - * response.
|
| - *
|
| - * The default value is `null`.
|
| - */
|
| - String serverHeader;
|
| -
|
| - /**
|
| - * Default set of headers added to all response objects.
|
| - *
|
| - * By default the following headers are in this set:
|
| - *
|
| - * Content-Type: text/plain; charset=utf-8
|
| - * X-Frame-Options: SAMEORIGIN
|
| - * X-Content-Type-Options: nosniff
|
| - * X-XSS-Protection: 1; mode=block
|
| - *
|
| - * If the `Server` header is added here and the `serverHeader` is set as
|
| - * well then the value of `serverHeader` takes precedence.
|
| - */
|
| - HttpHeaders get defaultResponseHeaders;
|
| -
|
| - /**
|
| - * Whether the [HttpServer] should compress the content, if possible.
|
| - *
|
| - * The content can only be compressed when the response is using
|
| - * chunked Transfer-Encoding and the incoming request has `gzip`
|
| - * as an accepted encoding in the Accept-Encoding header.
|
| - *
|
| - * The default value is `false` (compression disabled).
|
| - * To enable, set `autoCompress` to `true`.
|
| - */
|
| - bool autoCompress;
|
| -
|
| - /**
|
| - * Get or set the timeout used for idle keep-alive connections. If no further
|
| - * request is seen within [idleTimeout] after the previous request was
|
| - * completed, the connection is dropped.
|
| - *
|
| - * Default is 120 seconds.
|
| - *
|
| - * Note that it may take up to `2 * idleTimeout` before a idle connection is
|
| - * aborted.
|
| - *
|
| - * To disable, set [idleTimeout] to `null`.
|
| - */
|
| - Duration idleTimeout;
|
| -
|
| -
|
| - /**
|
| - * Starts listening for HTTP requests on the specified [address] and
|
| - * [port].
|
| - *
|
| - * The [address] can either be a [String] or an
|
| - * [InternetAddress]. If [address] is a [String], [bind] will
|
| - * perform a [InternetAddress.lookup] and use the first value in the
|
| - * list. To listen on the loopback adapter, which will allow only
|
| - * incoming connections from the local host, use the value
|
| - * [InternetAddress.LOOPBACK_IP_V4] or
|
| - * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
|
| - * connection from the network use either one of the values
|
| - * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
|
| - * bind to all interfaces or the IP address of a specific interface.
|
| - *
|
| - * If an IP version 6 (IPv6) address is used, both IP version 6
|
| - * (IPv6) and version 4 (IPv4) connections will be accepted. To
|
| - * restrict this to version 6 (IPv6) only, use [v6Only] to set
|
| - * version 6 only.
|
| - *
|
| - * If [port] has the value [:0:] an ephemeral port will be chosen by
|
| - * the system. The actual port used can be retrieved using the
|
| - * [port] getter.
|
| - *
|
| - * The optional argument [backlog] can be used to specify the listen
|
| - * backlog for the underlying OS listen setup. If [backlog] has the
|
| - * value of [:0:] (the default) a reasonable value will be chosen by
|
| - * the system.
|
| - *
|
| - * The optional argument [shared] specifies whether additional HttpServer
|
| - * objects can bind to the same combination of `address`, `port` and `v6Only`.
|
| - * If `shared` is `true` and more `HttpServer`s from this isolate or other
|
| - * isolates are bound to the port, then the incoming connections will be
|
| - * distributed among all the bound `HttpServer`s. Connections can be
|
| - * distributed over multiple isolates this way.
|
| - */
|
| - static Future<HttpServer> bind(address,
|
| - int port,
|
| - {int backlog: 0,
|
| - bool v6Only: false,
|
| - bool shared: false})
|
| - => _HttpServer.bind(address, port, backlog, v6Only, shared);
|
| -
|
| - /**
|
| - * The [address] can either be a [String] or an
|
| - * [InternetAddress]. If [address] is a [String], [bind] will
|
| - * perform a [InternetAddress.lookup] and use the first value in the
|
| - * list. To listen on the loopback adapter, which will allow only
|
| - * incoming connections from the local host, use the value
|
| - * [InternetAddress.LOOPBACK_IP_V4] or
|
| - * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
|
| - * connection from the network use either one of the values
|
| - * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
|
| - * bind to all interfaces or the IP address of a specific interface.
|
| - *
|
| - * If an IP version 6 (IPv6) address is used, both IP version 6
|
| - * (IPv6) and version 4 (IPv4) connections will be accepted. To
|
| - * restrict this to version 6 (IPv6) only, use [v6Only] to set
|
| - * version 6 only.
|
| - *
|
| - * If [port] has the value [:0:] an ephemeral port will be chosen by
|
| - * the system. The actual port used can be retrieved using the
|
| - * [port] getter.
|
| - *
|
| - * The optional argument [backlog] can be used to specify the listen
|
| - * backlog for the underlying OS listen setup. If [backlog] has the
|
| - * value of [:0:] (the default) a reasonable value will be chosen by
|
| - * the system.
|
| - *
|
| - * If [requestClientCertificate] is true, the server will
|
| - * request clients to authenticate with a client certificate.
|
| - * The server will advertise the names of trusted issuers of client
|
| - * certificates, getting them from [context], where they have been
|
| - * set using [SecurityContext.setClientAuthorities].
|
| - *
|
| - * The optional argument [shared] specifies whether additional HttpServer
|
| - * objects can bind to the same combination of `address`, `port` and `v6Only`.
|
| - * If `shared` is `true` and more `HttpServer`s from this isolate or other
|
| - * isolates are bound to the port, then the incoming connections will be
|
| - * distributed among all the bound `HttpServer`s. Connections can be
|
| - * distributed over multiple isolates this way.
|
| - */
|
| -
|
| - static Future<HttpServer> bindSecure(address,
|
| - int port,
|
| - SecurityContext context,
|
| - {int backlog: 0,
|
| - bool v6Only: false,
|
| - bool requestClientCertificate: false,
|
| - bool shared: false})
|
| - => _HttpServer.bindSecure(address,
|
| - port,
|
| - context,
|
| - backlog,
|
| - v6Only,
|
| - requestClientCertificate,
|
| - shared);
|
| -
|
| - /**
|
| - * Attaches the HTTP server to an existing [ServerSocket]. When the
|
| - * [HttpServer] is closed, the [HttpServer] will just detach itself,
|
| - * closing current connections but not closing [serverSocket].
|
| - */
|
| - factory HttpServer.listenOn(ServerSocket serverSocket)
|
| - => new _HttpServer.listenOn(serverSocket);
|
| -
|
| - /**
|
| - * Permanently stops this [HttpServer] from listening for new
|
| - * connections. This closes the [Stream] of [HttpRequest]s with a
|
| - * done event. The returned future completes when the server is
|
| - * stopped. For a server started using [bind] or [bindSecure] this
|
| - * means that the port listened on no longer in use.
|
| - *
|
| - * If [force] is `true`, active connections will be closed immediately.
|
| - */
|
| - Future close({bool force: false});
|
| -
|
| - /**
|
| - * Returns the port that the server is listening on. This can be
|
| - * used to get the actual port used when a value of 0 for [:port:] is
|
| - * specified in the [bind] or [bindSecure] call.
|
| - */
|
| - int get port;
|
| -
|
| - /**
|
| - * Returns the address that the server is listening on. This can be
|
| - * used to get the actual address used, when the address is fetched by
|
| - * a lookup from a hostname.
|
| - */
|
| - InternetAddress get address;
|
| -
|
| - /**
|
| - * Sets the timeout, in seconds, for sessions of this [HttpServer].
|
| - * The default timeout is 20 minutes.
|
| - */
|
| - set sessionTimeout(int timeout);
|
| -
|
| - /**
|
| - * Returns an [HttpConnectionsInfo] object summarizing the number of
|
| - * current connections handled by the server.
|
| - */
|
| - HttpConnectionsInfo connectionsInfo();
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Summary statistics about an [HttpServer]s current socket connections.
|
| - */
|
| -class HttpConnectionsInfo {
|
| - /**
|
| - * Total number of socket connections.
|
| - */
|
| - int total = 0;
|
| -
|
| - /**
|
| - * Number of active connections where actual request/response
|
| - * processing is active.
|
| - */
|
| - int active = 0;
|
| -
|
| - /**
|
| - * Number of idle connections held by clients as persistent connections.
|
| - */
|
| - int idle = 0;
|
| -
|
| - /**
|
| - * Number of connections which are preparing to close. Note: These
|
| - * connections are also part of the [:active:] count as they might
|
| - * still be sending data to the client before finally closing.
|
| - */
|
| - int closing = 0;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Headers for HTTP requests and responses.
|
| - *
|
| - * In some situations, headers are immutable:
|
| - *
|
| - * * HttpRequest and HttpClientResponse always have immutable headers.
|
| - *
|
| - * * HttpResponse and HttpClientRequest have immutable headers
|
| - * from the moment the body is written to.
|
| - *
|
| - * In these situations, the mutating methods throw exceptions.
|
| - *
|
| - * For all operations on HTTP headers the header name is
|
| - * case-insensitive.
|
| - *
|
| - * To set the value of a header use the `set()` method:
|
| - *
|
| - * request.headers.set(HttpHeaders.CACHE_CONTROL,
|
| - 'max-age=3600, must-revalidate');
|
| - *
|
| - * To retrieve the value of a header use the `value()` method:
|
| - *
|
| - * print(request.headers.value(HttpHeaders.USER_AGENT));
|
| - *
|
| - * An HttpHeaders object holds a list of values for each name
|
| - * as the standard allows. In most cases a name holds only a single value,
|
| - * The most common mode of operation is to use `set()` for setting a value,
|
| - * and `value()` for retrieving a value.
|
| - */
|
| -abstract class HttpHeaders {
|
| - static const ACCEPT = "accept";
|
| - static const ACCEPT_CHARSET = "accept-charset";
|
| - static const ACCEPT_ENCODING = "accept-encoding";
|
| - static const ACCEPT_LANGUAGE = "accept-language";
|
| - static const ACCEPT_RANGES = "accept-ranges";
|
| - static const AGE = "age";
|
| - static const ALLOW = "allow";
|
| - static const AUTHORIZATION = "authorization";
|
| - static const CACHE_CONTROL = "cache-control";
|
| - static const CONNECTION = "connection";
|
| - static const CONTENT_ENCODING = "content-encoding";
|
| - static const CONTENT_LANGUAGE = "content-language";
|
| - static const CONTENT_LENGTH = "content-length";
|
| - static const CONTENT_LOCATION = "content-location";
|
| - static const CONTENT_MD5 = "content-md5";
|
| - static const CONTENT_RANGE = "content-range";
|
| - static const CONTENT_TYPE = "content-type";
|
| - static const DATE = "date";
|
| - static const ETAG = "etag";
|
| - static const EXPECT = "expect";
|
| - static const EXPIRES = "expires";
|
| - static const FROM = "from";
|
| - static const HOST = "host";
|
| - static const IF_MATCH = "if-match";
|
| - static const IF_MODIFIED_SINCE = "if-modified-since";
|
| - static const IF_NONE_MATCH = "if-none-match";
|
| - static const IF_RANGE = "if-range";
|
| - static const IF_UNMODIFIED_SINCE = "if-unmodified-since";
|
| - static const LAST_MODIFIED = "last-modified";
|
| - static const LOCATION = "location";
|
| - static const MAX_FORWARDS = "max-forwards";
|
| - static const PRAGMA = "pragma";
|
| - static const PROXY_AUTHENTICATE = "proxy-authenticate";
|
| - static const PROXY_AUTHORIZATION = "proxy-authorization";
|
| - static const RANGE = "range";
|
| - static const REFERER = "referer";
|
| - static const RETRY_AFTER = "retry-after";
|
| - static const SERVER = "server";
|
| - static const TE = "te";
|
| - static const TRAILER = "trailer";
|
| - static const TRANSFER_ENCODING = "transfer-encoding";
|
| - static const UPGRADE = "upgrade";
|
| - static const USER_AGENT = "user-agent";
|
| - static const VARY = "vary";
|
| - static const VIA = "via";
|
| - static const WARNING = "warning";
|
| - static const WWW_AUTHENTICATE = "www-authenticate";
|
| -
|
| - // Cookie headers from RFC 6265.
|
| - static const COOKIE = "cookie";
|
| - static const SET_COOKIE = "set-cookie";
|
| -
|
| - static const GENERAL_HEADERS = const [CACHE_CONTROL,
|
| - CONNECTION,
|
| - DATE,
|
| - PRAGMA,
|
| - TRAILER,
|
| - TRANSFER_ENCODING,
|
| - UPGRADE,
|
| - VIA,
|
| - WARNING];
|
| -
|
| - static const ENTITY_HEADERS = const [ALLOW,
|
| - CONTENT_ENCODING,
|
| - CONTENT_LANGUAGE,
|
| - CONTENT_LENGTH,
|
| - CONTENT_LOCATION,
|
| - CONTENT_MD5,
|
| - CONTENT_RANGE,
|
| - CONTENT_TYPE,
|
| - EXPIRES,
|
| - LAST_MODIFIED];
|
| -
|
| -
|
| - static const RESPONSE_HEADERS = const [ACCEPT_RANGES,
|
| - AGE,
|
| - ETAG,
|
| - LOCATION,
|
| - PROXY_AUTHENTICATE,
|
| - RETRY_AFTER,
|
| - SERVER,
|
| - VARY,
|
| - WWW_AUTHENTICATE];
|
| -
|
| - static const REQUEST_HEADERS = const [ACCEPT,
|
| - ACCEPT_CHARSET,
|
| - ACCEPT_ENCODING,
|
| - ACCEPT_LANGUAGE,
|
| - AUTHORIZATION,
|
| - EXPECT,
|
| - FROM,
|
| - HOST,
|
| - IF_MATCH,
|
| - IF_MODIFIED_SINCE,
|
| - IF_NONE_MATCH,
|
| - IF_RANGE,
|
| - IF_UNMODIFIED_SINCE,
|
| - MAX_FORWARDS,
|
| - PROXY_AUTHORIZATION,
|
| - RANGE,
|
| - REFERER,
|
| - TE,
|
| - USER_AGENT];
|
| -
|
| - /**
|
| - * Gets and sets the date. The value of this property will
|
| - * reflect the 'date' header.
|
| - */
|
| - DateTime date;
|
| -
|
| - /**
|
| - * Gets and sets the expiry date. The value of this property will
|
| - * reflect the 'expires' header.
|
| - */
|
| - DateTime expires;
|
| -
|
| - /**
|
| - * Gets and sets the "if-modified-since" date. The value of this property will
|
| - * reflect the "if-modified-since" header.
|
| - */
|
| - DateTime ifModifiedSince;
|
| -
|
| - /**
|
| - * Gets and sets the host part of the 'host' header for the
|
| - * connection.
|
| - */
|
| - String host;
|
| -
|
| - /**
|
| - * Gets and sets the port part of the 'host' header for the
|
| - * connection.
|
| - */
|
| - int port;
|
| -
|
| - /**
|
| - * Gets and sets the content type. Note that the content type in the
|
| - * header will only be updated if this field is set
|
| - * directly. Mutating the returned current value will have no
|
| - * effect.
|
| - */
|
| - ContentType contentType;
|
| -
|
| - /**
|
| - * Gets and sets the content length header value.
|
| - */
|
| - int contentLength;
|
| -
|
| - /**
|
| - * Gets and sets the persistent connection header value.
|
| - */
|
| - bool persistentConnection;
|
| -
|
| - /**
|
| - * Gets and sets the chunked transfer encoding header value.
|
| - */
|
| - bool chunkedTransferEncoding;
|
| -
|
| - /**
|
| - * Returns the list of values for the header named [name]. If there
|
| - * is no header with the provided name, [:null:] will be returned.
|
| - */
|
| - List<String> operator[](String name);
|
| -
|
| - /**
|
| - * Convenience method for the value for a single valued header. If
|
| - * there is no header with the provided name, [:null:] will be
|
| - * returned. If the header has more than one value an exception is
|
| - * thrown.
|
| - */
|
| - String value(String name);
|
| -
|
| - /**
|
| - * Adds a header value. The header named [name] will have the value
|
| - * [value] added to its list of values. Some headers are single
|
| - * valued, and for these adding a value will replace the previous
|
| - * value. If the value is of type DateTime a HTTP date format will be
|
| - * applied. If the value is a [:List:] each element of the list will
|
| - * be added separately. For all other types the default [:toString:]
|
| - * method will be used.
|
| - */
|
| - void add(String name, Object value);
|
| -
|
| - /**
|
| - * Sets a header. The header named [name] will have all its values
|
| - * cleared before the value [value] is added as its value.
|
| - */
|
| - void set(String name, Object value);
|
| -
|
| - /**
|
| - * Removes a specific value for a header name. Some headers have
|
| - * system supplied values and for these the system supplied values
|
| - * will still be added to the collection of values for the header.
|
| - */
|
| - void remove(String name, Object value);
|
| -
|
| - /**
|
| - * Removes all values for the specified header name. Some headers
|
| - * have system supplied values and for these the system supplied
|
| - * values will still be added to the collection of values for the
|
| - * header.
|
| - */
|
| - void removeAll(String name);
|
| -
|
| - /**
|
| - * Enumerates the headers, applying the function [f] to each
|
| - * header. The header name passed in [:name:] will be all lower
|
| - * case.
|
| - */
|
| - void forEach(void f(String name, List<String> values));
|
| -
|
| - /**
|
| - * Disables folding for the header named [name] when sending the HTTP
|
| - * header. By default, multiple header values are folded into a
|
| - * single header line by separating the values with commas. The
|
| - * 'set-cookie' header has folding disabled by default.
|
| - */
|
| - void noFolding(String name);
|
| -
|
| - /**
|
| - * Remove all headers. Some headers have system supplied values and
|
| - * for these the system supplied values will still be added to the
|
| - * collection of values for the header.
|
| - */
|
| - void clear();
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Representation of a header value in the form:
|
| - *
|
| - * [:value; parameter1=value1; parameter2=value2:]
|
| - *
|
| - * [HeaderValue] can be used to conveniently build and parse header
|
| - * values on this form.
|
| - *
|
| - * To build an [:accepts:] header with the value
|
| - *
|
| - * text/plain; q=0.3, text/html
|
| - *
|
| - * use code like this:
|
| - *
|
| - * HttpClientRequest request = ...;
|
| - * var v = new HeaderValue("text/plain", {"q": "0.3"});
|
| - * request.headers.add(HttpHeaders.ACCEPT, v);
|
| - * request.headers.add(HttpHeaders.ACCEPT, "text/html");
|
| - *
|
| - * To parse the header values use the [:parse:] static method.
|
| - *
|
| - * HttpRequest request = ...;
|
| - * List<String> values = request.headers[HttpHeaders.ACCEPT];
|
| - * values.forEach((value) {
|
| - * HeaderValue v = HeaderValue.parse(value);
|
| - * // Use v.value and v.parameters
|
| - * });
|
| - *
|
| - * An instance of [HeaderValue] is immutable.
|
| - */
|
| -abstract class HeaderValue {
|
| - /**
|
| - * Creates a new header value object setting the value and parameters.
|
| - */
|
| - factory HeaderValue([String value = "", Map<String, String> parameters]) {
|
| - return new _HeaderValue(value, parameters);
|
| - }
|
| -
|
| - /**
|
| - * Creates a new header value object from parsing a header value
|
| - * string with both value and optional parameters.
|
| - */
|
| - static HeaderValue parse(String value,
|
| - {String parameterSeparator: ";",
|
| - String valueSeparator: null,
|
| - bool preserveBackslash: false}) {
|
| - return _HeaderValue.parse(value,
|
| - parameterSeparator: parameterSeparator,
|
| - valueSeparator: valueSeparator,
|
| - preserveBackslash: preserveBackslash);
|
| - }
|
| -
|
| - /**
|
| - * Gets the header value.
|
| - */
|
| - String get value;
|
| -
|
| - /**
|
| - * Gets the map of parameters.
|
| - *
|
| - * This map cannot be modified. invoking any operation which would
|
| - * modify the map will throw [UnsupportedError].
|
| - */
|
| - Map<String, String> get parameters;
|
| -
|
| - /**
|
| - * Returns the formatted string representation in the form:
|
| - *
|
| - * value; parameter1=value1; parameter2=value2
|
| - */
|
| - String toString();
|
| -}
|
| -
|
| -abstract class HttpSession implements Map {
|
| - /**
|
| - * Gets the id for the current session.
|
| - */
|
| - String get id;
|
| -
|
| - /**
|
| - * Destroys the session. This will terminate the session and any further
|
| - * connections with this id will be given a new id and session.
|
| - */
|
| - void destroy();
|
| -
|
| - /**
|
| - * Sets a callback that will be called when the session is timed out.
|
| - */
|
| - void set onTimeout(void callback());
|
| -
|
| - /**
|
| - * Is true if the session has not been sent to the client yet.
|
| - */
|
| - bool get isNew;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Representation of a content type. An instance of [ContentType] is
|
| - * immutable.
|
| - */
|
| -abstract class ContentType implements HeaderValue {
|
| - /**
|
| - * Content type for plain text using UTF-8 encoding.
|
| - *
|
| - * text/plain; charset=utf-8
|
| - */
|
| - static final TEXT = new ContentType("text", "plain", charset: "utf-8");
|
| -
|
| - /**
|
| - * Content type for HTML using UTF-8 encoding.
|
| - *
|
| - * text/html; charset=utf-8
|
| - */
|
| - static final HTML = new ContentType("text", "html", charset: "utf-8");
|
| -
|
| - /**
|
| - * Content type for JSON using UTF-8 encoding.
|
| - *
|
| - * application/json; charset=utf-8
|
| - */
|
| - static final JSON = new ContentType("application", "json", charset: "utf-8");
|
| -
|
| - /**
|
| - * Content type for binary data.
|
| - *
|
| - * application/octet-stream
|
| - */
|
| - static final BINARY = new ContentType("application", "octet-stream");
|
| -
|
| - /**
|
| - * Creates a new content type object setting the primary type and
|
| - * sub type. The charset and additional parameters can also be set
|
| - * using [charset] and [parameters]. If charset is passed and
|
| - * [parameters] contains charset as well the passed [charset] will
|
| - * override the value in parameters. Keys passed in parameters will be
|
| - * converted to lower case. The `charset` entry, whether passed as `charset`
|
| - * or in `parameters`, will have its value converted to lower-case.
|
| - */
|
| - factory ContentType(String primaryType,
|
| - String subType,
|
| - {String charset, Map<String, String> parameters}) {
|
| - return new _ContentType(primaryType, subType, charset, parameters);
|
| - }
|
| -
|
| - /**
|
| - * Creates a new content type object from parsing a Content-Type
|
| - * header value. As primary type, sub type and parameter names and
|
| - * values are not case sensitive all these values will be converted
|
| - * to lower case. Parsing this string
|
| - *
|
| - * text/html; charset=utf-8
|
| - *
|
| - * will create a content type object with primary type [:text:], sub
|
| - * type [:html:] and parameter [:charset:] with value [:utf-8:].
|
| - */
|
| - static ContentType parse(String value) {
|
| - return _ContentType.parse(value);
|
| - }
|
| -
|
| - /**
|
| - * Gets the mime-type, without any parameters.
|
| - */
|
| - String get mimeType;
|
| -
|
| - /**
|
| - * Gets the primary type.
|
| - */
|
| - String get primaryType;
|
| -
|
| - /**
|
| - * Gets the sub type.
|
| - */
|
| - String get subType;
|
| -
|
| - /**
|
| - * Gets the character set.
|
| - */
|
| - String get charset;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Representation of a cookie. For cookies received by the server as
|
| - * Cookie header values only [:name:] and [:value:] fields will be
|
| - * set. When building a cookie for the 'set-cookie' header in the server
|
| - * and when receiving cookies in the client as 'set-cookie' headers all
|
| - * fields can be used.
|
| - */
|
| -abstract class Cookie {
|
| - /**
|
| - * Gets and sets the name.
|
| - */
|
| - String name;
|
| -
|
| - /**
|
| - * Gets and sets the value.
|
| - */
|
| - String value;
|
| -
|
| - /**
|
| - * Gets and sets the expiry date.
|
| - */
|
| - DateTime expires;
|
| -
|
| - /**
|
| - * Gets and sets the max age. A value of [:0:] means delete cookie
|
| - * now.
|
| - */
|
| - int maxAge;
|
| -
|
| - /**
|
| - * Gets and sets the domain.
|
| - */
|
| - String domain;
|
| -
|
| - /**
|
| - * Gets and sets the path.
|
| - */
|
| - String path;
|
| -
|
| - /**
|
| - * Gets and sets whether this cookie is secure.
|
| - */
|
| - bool secure;
|
| -
|
| - /**
|
| - * Gets and sets whether this cookie is HTTP only.
|
| - */
|
| - bool httpOnly;
|
| -
|
| - /**
|
| - * Creates a new cookie optionally setting the name and value.
|
| - *
|
| - * By default the value of `httpOnly` will be set to `true`.
|
| - */
|
| - factory Cookie([String name, String value]) => new _Cookie(name, value);
|
| -
|
| - /**
|
| - * Creates a new cookie by parsing a header value from a 'set-cookie'
|
| - * header.
|
| - */
|
| - factory Cookie.fromSetCookieValue(String value) {
|
| - return new _Cookie.fromSetCookieValue(value);
|
| - }
|
| -
|
| - /**
|
| - * Returns the formatted string representation of the cookie. The
|
| - * string representation can be used for for setting the Cookie or
|
| - * 'set-cookie' headers
|
| - */
|
| - String toString();
|
| -}
|
| -
|
| -
|
| -/**
|
| - * A server-side object
|
| - * that contains the content of and information about an HTTP request.
|
| - *
|
| - * __Note__: Check out the
|
| - * [http_server](http://pub.dartlang.org/packages/http_server)
|
| - * package, which makes working with the low-level
|
| - * dart:io HTTP server subsystem easier.
|
| - *
|
| - * `HttpRequest` objects are generated by an [HttpServer],
|
| - * which listens for HTTP requests on a specific host and port.
|
| - * For each request received, the HttpServer, which is a [Stream],
|
| - * generates an `HttpRequest` object and adds it to the stream.
|
| - *
|
| - * An `HttpRequest` object delivers the body content of the request
|
| - * as a stream of byte lists.
|
| - * The object also contains information about the request,
|
| - * such as the method, URI, and headers.
|
| - *
|
| - * In the following code, an HttpServer listens
|
| - * for HTTP requests. When the server receives a request,
|
| - * it uses the HttpRequest object's `method` property to dispatch requests.
|
| - *
|
| - * final HOST = InternetAddress.LOOPBACK_IP_V4;
|
| - * final PORT = 80;
|
| - *
|
| - * HttpServer.bind(HOST, PORT).then((_server) {
|
| - * _server.listen((HttpRequest request) {
|
| - * switch (request.method) {
|
| - * case 'GET':
|
| - * handleGetRequest(request);
|
| - * break;
|
| - * case 'POST':
|
| - * ...
|
| - * }
|
| - * },
|
| - * onError: handleError); // listen() failed.
|
| - * }).catchError(handleError);
|
| - *
|
| - * An HttpRequest object provides access to the associated [HttpResponse]
|
| - * object through the response property.
|
| - * The server writes its response to the body of the HttpResponse object.
|
| - * For example, here's a function that responds to a request:
|
| - *
|
| - * void handleGetRequest(HttpRequest req) {
|
| - * HttpResponse res = req.response;
|
| - * res.write('Received request ${req.method}: ${req.uri.path}');
|
| - * res.close();
|
| - * }
|
| - */
|
| -abstract class HttpRequest implements Stream<List<int>> {
|
| - /**
|
| - * The content length of the request body.
|
| - *
|
| - * If the size of the request body is not known in advance,
|
| - * this value is -1.
|
| - */
|
| - int get contentLength;
|
| -
|
| - /**
|
| - * The method, such as 'GET' or 'POST', for the request.
|
| - */
|
| - String get method;
|
| -
|
| - /**
|
| - * The URI for the request.
|
| - *
|
| - * This provides access to the
|
| - * path and query string for the request.
|
| - */
|
| - Uri get uri;
|
| -
|
| - /**
|
| - * The requested URI for the request.
|
| - *
|
| - * The returend URI is reconstructed by using http-header fields, to access
|
| - * otherwise lost information, e.g. host and scheme.
|
| - *
|
| - * To reconstruct the scheme, first 'X-Forwarded-Proto' is checked, and then
|
| - * falling back to server type.
|
| - *
|
| - * To reconstruct the host, fisrt 'X-Forwarded-Host' is checked, then 'Host'
|
| - * and finally calling back to server.
|
| - */
|
| - Uri get requestedUri;
|
| -
|
| - /**
|
| - * The request headers.
|
| - *
|
| - * The returned [HttpHeaders] are immutable.
|
| - */
|
| - HttpHeaders get headers;
|
| -
|
| - /**
|
| - * The cookies in the request, from the Cookie headers.
|
| - */
|
| - List<Cookie> get cookies;
|
| -
|
| - /**
|
| - * The persistent connection state signaled by the client.
|
| - */
|
| - bool get persistentConnection;
|
| -
|
| - /**
|
| - * The client certificate of the client making the request.
|
| - *
|
| - * This value is null if the connection is not a secure TLS or SSL connection,
|
| - * or if the server does not request a client certificate, or if the client
|
| - * does not provide one.
|
| - */
|
| - X509Certificate get certificate;
|
| -
|
| - /**
|
| - * The session for the given request.
|
| - *
|
| - * If the session is
|
| - * being initialized by this call, [:isNew:] is true for the returned
|
| - * session.
|
| - * See [HttpServer.sessionTimeout] on how to change default timeout.
|
| - */
|
| - HttpSession get session;
|
| -
|
| - /**
|
| - * The HTTP protocol version used in the request,
|
| - * either "1.0" or "1.1".
|
| - */
|
| - String get protocolVersion;
|
| -
|
| - /**
|
| - * Information about the client connection.
|
| - *
|
| - * Returns [:null:] if the socket is not available.
|
| - */
|
| - HttpConnectionInfo get connectionInfo;
|
| -
|
| - /**
|
| - * The [HttpResponse] object, used for sending back the response to the
|
| - * client.
|
| - *
|
| - * If the [contentLength] of the body isn't 0, and the body isn't being read,
|
| - * any write calls on the [HttpResponse] automatically drain the request
|
| - * body.
|
| - */
|
| - HttpResponse get response;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * An HTTP response, which returns the headers and data
|
| - * from the server to the client in response to an HTTP request.
|
| - *
|
| - * Every HttpRequest object provides access to the associated [HttpResponse]
|
| - * object through the `response` property.
|
| - * The server sends its response to the client by writing to the
|
| - * HttpResponse object.
|
| - *
|
| - * ## Writing the response
|
| - *
|
| - * This class implements [IOSink].
|
| - * After the header has been set up, the methods
|
| - * from IOSink, such as `writeln()`, can be used to write
|
| - * the body of the HTTP response.
|
| - * Use the `close()` method to close the response and send it to the client.
|
| - *
|
| - * server.listen((HttpRequest request) {
|
| - * request.response.write('Hello, world!');
|
| - * request.response.close();
|
| - * });
|
| - *
|
| - * When one of the IOSink methods is used for the
|
| - * first time, the request header is sent. Calling any methods that
|
| - * change the header after it is sent throws an exception.
|
| - *
|
| - * ## Setting the headers
|
| - *
|
| - * The HttpResponse object has a number of properties for setting up
|
| - * the HTTP headers of the response.
|
| - * When writing string data through the IOSink, the encoding used
|
| - * is determined from the "charset" parameter of the
|
| - * "Content-Type" header.
|
| - *
|
| - * HttpResponse response = ...
|
| - * response.headers.contentType
|
| - * = new ContentType("application", "json", charset: "utf-8");
|
| - * response.write(...); // Strings written will be UTF-8 encoded.
|
| - *
|
| - * If no charset is provided the default of ISO-8859-1 (Latin 1) will
|
| - * be used.
|
| - *
|
| - * HttpResponse response = ...
|
| - * response.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
|
| - * response.write(...); // Strings written will be ISO-8859-1 encoded.
|
| - *
|
| - * An exception is thrown if you use the `write()` method
|
| - * while an unsupported content-type is set.
|
| - */
|
| -abstract class HttpResponse implements IOSink {
|
| - // TODO(ajohnsen): Add documentation of how to pipe a file to the response.
|
| - /**
|
| - * Gets and sets the content length of the response. If the size of
|
| - * the response is not known in advance set the content length to
|
| - * -1 - which is also the default if not set.
|
| - */
|
| - int contentLength;
|
| -
|
| - /**
|
| - * Gets and sets the status code. Any integer value is accepted. For
|
| - * the official HTTP status codes use the fields from
|
| - * [HttpStatus]. If no status code is explicitly set the default
|
| - * value [HttpStatus.OK] is used.
|
| - *
|
| - * The status code must be set before the body is written
|
| - * to. Setting the status code after writing to the response body or
|
| - * closing the response will throw a `StateError`.
|
| - */
|
| - int statusCode;
|
| -
|
| - /**
|
| - * Gets and sets the reason phrase. If no reason phrase is explicitly
|
| - * set a default reason phrase is provided.
|
| - *
|
| - * The reason phrase must be set before the body is written
|
| - * to. Setting the reason phrase after writing to the response body
|
| - * or closing the response will throw a `StateError`.
|
| - */
|
| - String reasonPhrase;
|
| -
|
| - /**
|
| - * Gets and sets the persistent connection state. The initial value
|
| - * of this property is the persistent connection state from the
|
| - * request.
|
| - */
|
| - bool persistentConnection;
|
| -
|
| - /**
|
| - * Set and get the [deadline] for the response. The deadline is timed from the
|
| - * time it's set. Setting a new deadline will override any previous deadline.
|
| - * When a deadline is exceeded, the response will be closed and any further
|
| - * data ignored.
|
| - *
|
| - * To disable a deadline, set the [deadline] to `null`.
|
| - *
|
| - * The [deadline] is `null` by default.
|
| - */
|
| - Duration deadline;
|
| -
|
| - /**
|
| - * Get or set if the [HttpResponse] should buffer output.
|
| - *
|
| - * Default value is `true`.
|
| - *
|
| - * __Note__: Disabling buffering of the output can result in very poor
|
| - * performance, when writing many small chunks.
|
| - */
|
| - bool bufferOutput;
|
| -
|
| - /**
|
| - * Returns the response headers.
|
| - *
|
| - * The response headers can be modified until the response body is
|
| - * written to or closed. After that they become immutable.
|
| - */
|
| - HttpHeaders get headers;
|
| -
|
| - /**
|
| - * Cookies to set in the client (in the 'set-cookie' header).
|
| - */
|
| - List<Cookie> get cookies;
|
| -
|
| - /**
|
| - * Respond with a redirect to [location].
|
| - *
|
| - * The URI in [location] should be absolute, but there are no checks
|
| - * to enforce that.
|
| - *
|
| - * By default the HTTP status code `HttpStatus.MOVED_TEMPORARILY`
|
| - * (`302`) is used for the redirect, but an alternative one can be
|
| - * specified using the [status] argument.
|
| - *
|
| - * This method will also call `close`, and the returned future is
|
| - * the furure returned by `close`.
|
| - */
|
| - Future redirect(Uri location, {int status: HttpStatus.MOVED_TEMPORARILY});
|
| -
|
| - /**
|
| - * Detaches the underlying socket from the HTTP server. When the
|
| - * socket is detached the HTTP server will no longer perform any
|
| - * operations on it.
|
| - *
|
| - * This is normally used when a HTTP upgrade request is received
|
| - * and the communication should continue with a different protocol.
|
| - *
|
| - * If [writeHeaders] is `true`, the status line and [headers] will be written
|
| - * to the socket before it's detached. If `false`, the socket is detached
|
| - * immediately, without any data written to the socket. Default is `true`.
|
| - */
|
| - Future<Socket> detachSocket({bool writeHeaders: true});
|
| -
|
| - /**
|
| - * Gets information about the client connection. Returns [:null:] if the
|
| - * socket is not available.
|
| - */
|
| - HttpConnectionInfo get connectionInfo;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * A client that receives content, such as web pages, from
|
| - * a server using the HTTP protocol.
|
| - *
|
| - * HttpClient contains a number of methods to send an [HttpClientRequest]
|
| - * to an Http server and receive an [HttpClientResponse] back.
|
| - * For example, you can use the [get], [getUrl], [post], and [postUrl] methods
|
| - * for GET and POST requests, respectively.
|
| - *
|
| - * ## Making a simple GET request: an example
|
| - *
|
| - * A `getUrl` request is a two-step process, triggered by two [Future]s.
|
| - * When the first future completes with a [HttpClientRequest], the underlying
|
| - * network connection has been established, but no data has been sent.
|
| - * In the callback function for the first future, the HTTP headers and body
|
| - * can be set on the request. Either the first write to the request object
|
| - * or a call to [close] sends the request to the server.
|
| - *
|
| - * When the HTTP response is received from the server,
|
| - * the second future, which is returned by close,
|
| - * completes with an [HttpClientResponse] object.
|
| - * This object provides access to the headers and body of the response.
|
| - * The body is available as a stream implemented by HttpClientResponse.
|
| - * If a body is present, it must be read. Otherwise, it leads to resource
|
| - * leaks. Consider using [HttpClientResponse.drain] if the body is unused.
|
| - *
|
| - * HttpClient client = new HttpClient();
|
| - * client.getUrl(Uri.parse("http://www.example.com/"))
|
| - * .then((HttpClientRequest request) {
|
| - * // Optionally set up headers...
|
| - * // Optionally write to the request object...
|
| - * // Then call close.
|
| - * ...
|
| - * return request.close();
|
| - * })
|
| - * .then((HttpClientResponse response) {
|
| - * // Process the response.
|
| - * ...
|
| - * });
|
| - *
|
| - * The future for [HttpClientRequest] is created by methods such as
|
| - * [getUrl] and [open].
|
| - *
|
| - * ## HTTPS connections
|
| - *
|
| - * An HttpClient can make HTTPS requests, connecting to a server using
|
| - * the TLS (SSL) secure networking protocol. Calling [getUrl] with an
|
| - * https: scheme will work automatically, if the server's certificate is
|
| - * signed by a root CA (certificate authority) on the default list of
|
| - * well-known trusted CAs, compiled by Mozilla.
|
| - *
|
| - * To add a custom trusted certificate authority, or to send a client
|
| - * certificate to servers that request one, pass a [SecurityContext] object
|
| - * as the optional [context] argument to the `HttpClient` constructor.
|
| - * The desired security options can be set on the [SecurityContext] object.
|
| - *
|
| - * ## Headers
|
| - *
|
| - * All HttpClient requests set the following header by default:
|
| - *
|
| - * Accept-Encoding: gzip
|
| - *
|
| - * This allows the HTTP server to use gzip compression for the body if
|
| - * possible. If this behavior is not desired set the
|
| - * `Accept-Encoding` header to something else.
|
| - * To turn off gzip compression of the response, clear this header:
|
| - *
|
| - * request.headers.removeAll(HttpHeaders.ACCEPT_ENCODING)
|
| - *
|
| - * ## Closing the HttpClient
|
| - *
|
| - * The HttpClient supports persistent connections and caches network
|
| - * connections to reuse them for multiple requests whenever
|
| - * possible. This means that network connections can be kept open for
|
| - * some time after a request has completed. Use HttpClient.close
|
| - * to force the HttpClient object to shut down and to close the idle
|
| - * network connections.
|
| - *
|
| - * ## Turning proxies on and off
|
| - *
|
| - * By default the HttpClient uses the proxy configuration available
|
| - * from the environment, see [findProxyFromEnvironment]. To turn off
|
| - * the use of proxies set the [findProxy] property to
|
| - * [:null:].
|
| - *
|
| - * HttpClient client = new HttpClient();
|
| - * client.findProxy = null;
|
| - */
|
| -abstract class HttpClient {
|
| - static const int DEFAULT_HTTP_PORT = 80;
|
| - static const int DEFAULT_HTTPS_PORT = 443;
|
| -
|
| - /**
|
| - * Get and set the idle timeout of non-active persistent (keep-alive)
|
| - * connections. The default value is 15 seconds.
|
| - */
|
| - Duration idleTimeout;
|
| -
|
| - /**
|
| - * Get and set the maximum number of live connections, to a single host.
|
| - *
|
| - * Increasing this number may lower performance and take up unwanted
|
| - * system resources.
|
| - *
|
| - * To disable, set to `null`.
|
| - *
|
| - * Default is `null`.
|
| - */
|
| - int maxConnectionsPerHost;
|
| -
|
| - /**
|
| - * Get and set whether the body of a response will be automatically
|
| - * uncompressed.
|
| - *
|
| - * The body of an HTTP response can be compressed. In most
|
| - * situations providing the un-compressed body is most
|
| - * convenient. Therefore the default behavior is to un-compress the
|
| - * body. However in some situations (e.g. implementing a transparent
|
| - * proxy) keeping the uncompressed stream is required.
|
| - *
|
| - * NOTE: Headers in from the response is never modified. This means
|
| - * that when automatic un-compression is turned on the value of the
|
| - * header `Content-Length` will reflect the length of the original
|
| - * compressed body. Likewise the header `Content-Encoding` will also
|
| - * have the original value indicating compression.
|
| - *
|
| - * NOTE: Automatic un-compression is only performed if the
|
| - * `Content-Encoding` header value is `gzip`.
|
| - *
|
| - * This value affects all responses produced by this client after the
|
| - * value is changed.
|
| - *
|
| - * To disable, set to `false`.
|
| - *
|
| - * Default is `true`.
|
| - */
|
| - bool autoUncompress;
|
| -
|
| - /**
|
| - * Set and get the default value of the `User-Agent` header for all requests
|
| - * generated by this [HttpClient]. The default value is
|
| - * `Dart/<version> (dart:io)`.
|
| - *
|
| - * If the userAgent is set to `null`, no default `User-Agent` header will be
|
| - * added to each request.
|
| - */
|
| - String userAgent;
|
| -
|
| - factory HttpClient({SecurityContext context}) => new _HttpClient(context);
|
| -
|
| - /**
|
| - * Opens a HTTP connection.
|
| - *
|
| - * The HTTP method to use is specified in [method], the server is
|
| - * specified using [host] and [port], and the path (including
|
| - * a possible query) is specified using [path].
|
| - * The path may also contain a URI fragment, which will be ignored.
|
| - *
|
| - * The `Host` header for the request will be set to the value
|
| - * [host]:[port]. This can be overridden through the
|
| - * [HttpClientRequest] interface before the request is sent. NOTE
|
| - * if [host] is an IP address this will still be set in the `Host`
|
| - * header.
|
| - *
|
| - * For additional information on the sequence of events during an
|
| - * HTTP transaction, and the objects returned by the futures, see
|
| - * the overall documentation for the class [HttpClient].
|
| - */
|
| - Future<HttpClientRequest> open(String method,
|
| - String host,
|
| - int port,
|
| - String path);
|
| -
|
| - /**
|
| - * Opens a HTTP connection.
|
| - *
|
| - * The HTTP method is specified in [method] and the URL to use in
|
| - * [url].
|
| - *
|
| - * The `Host` header for the request will be set to the value
|
| - * [host]:[port]. This can be overridden through the
|
| - * [HttpClientRequest] interface before the request is sent. NOTE
|
| - * if [host] is an IP address this will still be set in the `Host`
|
| - * header.
|
| - *
|
| - * For additional information on the sequence of events during an
|
| - * HTTP transaction, and the objects returned by the futures, see
|
| - * the overall documentation for the class [HttpClient].
|
| - */
|
| - Future<HttpClientRequest> openUrl(String method, Uri url);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the GET method.
|
| - *
|
| - * The server is specified using [host] and [port], and the path
|
| - * (including a possible query) is specified using
|
| - * [path].
|
| - *
|
| - * See [open] for details.
|
| - */
|
| - Future<HttpClientRequest> get(String host, int port, String path);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the GET method.
|
| - *
|
| - * The URL to use is specified in [url].
|
| - *
|
| - * See [openUrl] for details.
|
| - */
|
| - Future<HttpClientRequest> getUrl(Uri url);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the POST method.
|
| - *
|
| - * The server is specified using [host] and [port], and the path
|
| - * (including a possible query) is specified using
|
| - * [path].
|
| - *
|
| - * See [open] for details.
|
| - */
|
| - Future<HttpClientRequest> post(String host, int port, String path);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the POST method.
|
| - *
|
| - * The URL to use is specified in [url].
|
| - *
|
| - * See [openUrl] for details.
|
| - */
|
| - Future<HttpClientRequest> postUrl(Uri url);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the PUT method.
|
| - *
|
| - * The server is specified using [host] and [port], and the path
|
| - * (including a possible query) is specified using [path].
|
| - *
|
| - * See [open] for details.
|
| - */
|
| - Future<HttpClientRequest> put(String host, int port, String path);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the PUT method.
|
| - *
|
| - * The URL to use is specified in [url].
|
| - *
|
| - * See [openUrl] for details.
|
| - */
|
| - Future<HttpClientRequest> putUrl(Uri url);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the DELETE method.
|
| - *
|
| - * The server is specified using [host] and [port], and the path
|
| - * (including s possible query) is specified using [path].
|
| - *
|
| - * See [open] for details.
|
| - */
|
| - Future<HttpClientRequest> delete(String host, int port, String path);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the DELETE method.
|
| - *
|
| - * The URL to use is specified in [url].
|
| - *
|
| - * See [openUrl] for details.
|
| - */
|
| - Future<HttpClientRequest> deleteUrl(Uri url);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the PATCH method.
|
| - *
|
| - * The server is specified using [host] and [port], and the path
|
| - * (including a possible query) is specified using [path].
|
| - *
|
| - * See [open] for details.
|
| - */
|
| - Future<HttpClientRequest> patch(String host, int port, String path);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the PATCH method.
|
| - *
|
| - * The URL to use is specified in [url].
|
| - *
|
| - * See [openUrl] for details.
|
| - */
|
| - Future<HttpClientRequest> patchUrl(Uri url);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the HEAD method.
|
| - *
|
| - * The server is specified using [host] and [port], and the path
|
| - * (including a possible query) is specified using [path].
|
| - *
|
| - * See [open] for details.
|
| - */
|
| - Future<HttpClientRequest> head(String host, int port, String path);
|
| -
|
| - /**
|
| - * Opens a HTTP connection using the HEAD method.
|
| - *
|
| - * The URL to use is specified in [url].
|
| - *
|
| - * See [openUrl] for details.
|
| - */
|
| - Future<HttpClientRequest> headUrl(Uri url);
|
| -
|
| - /**
|
| - * Sets the function to be called when a site is requesting
|
| - * authentication. The URL requested and the security realm from the
|
| - * server are passed in the arguments [url] and [realm].
|
| - *
|
| - * The function returns a [Future] which should complete when the
|
| - * authentication has been resolved. If credentials cannot be
|
| - * provided the [Future] should complete with [:false:]. If
|
| - * credentials are available the function should add these using
|
| - * [addCredentials] before completing the [Future] with the value
|
| - * [:true:].
|
| - *
|
| - * If the [Future] completes with true the request will be retried
|
| - * using the updated credentials. Otherwise response processing will
|
| - * continue normally.
|
| - */
|
| - set authenticate(Future<bool> f(Uri url, String scheme, String realm));
|
| -
|
| - /**
|
| - * Add credentials to be used for authorizing HTTP requests.
|
| - */
|
| - void addCredentials(Uri url, String realm, HttpClientCredentials credentials);
|
| -
|
| - /**
|
| - * Sets the function used to resolve the proxy server to be used for
|
| - * opening a HTTP connection to the specified [url]. If this
|
| - * function is not set, direct connections will always be used.
|
| - *
|
| - * The string returned by [f] must be in the format used by browser
|
| - * PAC (proxy auto-config) scripts. That is either
|
| - *
|
| - * "DIRECT"
|
| - *
|
| - * for using a direct connection or
|
| - *
|
| - * "PROXY host:port"
|
| - *
|
| - * for using the proxy server [:host:] on port [:port:].
|
| - *
|
| - * A configuration can contain several configuration elements
|
| - * separated by semicolons, e.g.
|
| - *
|
| - * "PROXY host:port; PROXY host2:port2; DIRECT"
|
| - *
|
| - * The static function [findProxyFromEnvironment] on this class can
|
| - * be used to implement proxy server resolving based on environment
|
| - * variables.
|
| - */
|
| - set findProxy(String f(Uri url));
|
| -
|
| - /**
|
| - * Function for resolving the proxy server to be used for a HTTP
|
| - * connection from the proxy configuration specified through
|
| - * environment variables.
|
| - *
|
| - * The following environment variables are taken into account:
|
| - *
|
| - * http_proxy
|
| - * https_proxy
|
| - * no_proxy
|
| - * HTTP_PROXY
|
| - * HTTPS_PROXY
|
| - * NO_PROXY
|
| - *
|
| - * [:http_proxy:] and [:HTTP_PROXY:] specify the proxy server to use for
|
| - * http:// urls. Use the format [:hostname:port:]. If no port is used a
|
| - * default of 1080 will be used. If both are set the lower case one takes
|
| - * precedence.
|
| - *
|
| - * [:https_proxy:] and [:HTTPS_PROXY:] specify the proxy server to use for
|
| - * https:// urls. Use the format [:hostname:port:]. If no port is used a
|
| - * default of 1080 will be used. If both are set the lower case one takes
|
| - * precedence.
|
| - *
|
| - * [:no_proxy:] and [:NO_PROXY:] specify a comma separated list of
|
| - * postfixes of hostnames for which not to use the proxy
|
| - * server. E.g. the value "localhost,127.0.0.1" will make requests
|
| - * to both "localhost" and "127.0.0.1" not use a proxy. If both are set
|
| - * the lower case one takes precedence.
|
| - *
|
| - * To activate this way of resolving proxies assign this function to
|
| - * the [findProxy] property on the [HttpClient].
|
| - *
|
| - * HttpClient client = new HttpClient();
|
| - * client.findProxy = HttpClient.findProxyFromEnvironment;
|
| - *
|
| - * If you don't want to use the system environment you can use a
|
| - * different one by wrapping the function.
|
| - *
|
| - * HttpClient client = new HttpClient();
|
| - * client.findProxy = (url) {
|
| - * return HttpClient.findProxyFromEnvironment(
|
| - * url, {"http_proxy": ..., "no_proxy": ...});
|
| - * }
|
| - *
|
| - * If a proxy requires authentication it is possible to configure
|
| - * the username and password as well. Use the format
|
| - * [:username:password@hostname:port:] to include the username and
|
| - * password. Alternatively the API [addProxyCredentials] can be used
|
| - * to set credentials for proxies which require authentication.
|
| - */
|
| - static String findProxyFromEnvironment(Uri url,
|
| - {Map<String, String> environment}) {
|
| - return _HttpClient._findProxyFromEnvironment(url, environment);
|
| - }
|
| -
|
| - /**
|
| - * Sets the function to be called when a proxy is requesting
|
| - * authentication. Information on the proxy in use and the security
|
| - * realm for the authentication are passed in the arguments [host],
|
| - * [port] and [realm].
|
| - *
|
| - * The function returns a [Future] which should complete when the
|
| - * authentication has been resolved. If credentials cannot be
|
| - * provided the [Future] should complete with [:false:]. If
|
| - * credentials are available the function should add these using
|
| - * [addProxyCredentials] before completing the [Future] with the value
|
| - * [:true:].
|
| - *
|
| - * If the [Future] completes with [:true:] the request will be retried
|
| - * using the updated credentials. Otherwise response processing will
|
| - * continue normally.
|
| - */
|
| - set authenticateProxy(
|
| - Future<bool> f(String host, int port, String scheme, String realm));
|
| -
|
| - /**
|
| - * Add credentials to be used for authorizing HTTP proxies.
|
| - */
|
| - void addProxyCredentials(String host,
|
| - int port,
|
| - String realm,
|
| - HttpClientCredentials credentials);
|
| -
|
| - /**
|
| - * Sets a callback that will decide whether to accept a secure connection
|
| - * with a server certificate that cannot be authenticated by any of our
|
| - * trusted root certificates.
|
| - *
|
| - * When an secure HTTP request if made, using this HttpClient, and the
|
| - * server returns a server certificate that cannot be authenticated, the
|
| - * callback is called asynchronously with the [X509Certificate] object and
|
| - * the server's hostname and port. If the value of [badCertificateCallback]
|
| - * is [:null:], the bad certificate is rejected, as if the callback
|
| - * returned [:false:]
|
| - *
|
| - * If the callback returns true, the secure connection is accepted and the
|
| - * [:Future<HttpClientRequest>:] that was returned from the call making the
|
| - * request completes with a valid HttpRequest object. If the callback returns
|
| - * false, the [:Future<HttpClientRequest>:] completes with an exception.
|
| - *
|
| - * If a bad certificate is received on a connection attempt, the library calls
|
| - * the function that was the value of badCertificateCallback at the time
|
| - * the request is made, even if the value of badCertificateCallback
|
| - * has changed since then.
|
| - */
|
| - set badCertificateCallback(bool callback(X509Certificate cert,
|
| - String host,
|
| - int port));
|
| -
|
| - /**
|
| - * Shutdown the HTTP client. If [force] is [:false:] (the default)
|
| - * the [:HttpClient:] will be kept alive until all active
|
| - * connections are done. If [force] is [:true:] any active
|
| - * connections will be closed to immediately release all
|
| - * resources. These closed connections will receive an [:onError:]
|
| - * callback to indicate that the client was shutdown. In both cases
|
| - * trying to establish a new connection after calling [shutdown]
|
| - * will throw an exception.
|
| - */
|
| - void close({bool force: false});
|
| -}
|
| -
|
| -
|
| -/**
|
| - * HTTP request for a client connection.
|
| - *
|
| - * To set up a request, set the headers using the headers property
|
| - * provided in this class and write the data to the body of the request.
|
| - * HttpClientRequest is an [IOSink]. Use the methods from IOSink,
|
| - * such as writeCharCode(), to write the body of the HTTP
|
| - * request. When one of the IOSink methods is used for the first
|
| - * time, the request header is sent. Calling any methods that
|
| - * change the header after it is sent throws an exception.
|
| - *
|
| - * When writing string data through the [IOSink] the
|
| - * encoding used is determined from the "charset" parameter of
|
| - * the "Content-Type" header.
|
| - *
|
| - * HttpClientRequest request = ...
|
| - * request.headers.contentType
|
| - * = new ContentType("application", "json", charset: "utf-8");
|
| - * request.write(...); // Strings written will be UTF-8 encoded.
|
| - *
|
| - * If no charset is provided the default of ISO-8859-1 (Latin 1) is
|
| - * be used.
|
| - *
|
| - * HttpClientRequest request = ...
|
| - * request.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
|
| - * request.write(...); // Strings written will be ISO-8859-1 encoded.
|
| - *
|
| - * An exception is thrown if you use an unsupported encoding and the
|
| - * `write()` method being used takes a string parameter.
|
| - */
|
| -abstract class HttpClientRequest implements IOSink {
|
| - /**
|
| - * Gets and sets the requested persistent connection state.
|
| - *
|
| - * The default value is [:true:].
|
| - */
|
| - bool persistentConnection;
|
| -
|
| - /**
|
| - * Set this property to [:true:] if this request should
|
| - * automatically follow redirects. The default is [:true:].
|
| - *
|
| - * Automatic redirect will only happen for "GET" and "HEAD" requests
|
| - * and only for the status codes [:HttpHeaders.MOVED_PERMANENTLY:]
|
| - * (301), [:HttpStatus.FOUND:] (302),
|
| - * [:HttpStatus.MOVED_TEMPORARILY:] (302, alias for
|
| - * [:HttpStatus.FOUND:]), [:HttpStatus.SEE_OTHER:] (303) and
|
| - * [:HttpStatus.TEMPORARY_REDIRECT:] (307). For
|
| - * [:HttpStatus.SEE_OTHER:] (303) autmatic redirect will also happen
|
| - * for "POST" requests with the method changed to "GET" when
|
| - * following the redirect.
|
| - *
|
| - * All headers added to the request will be added to the redirection
|
| - * request(s). However, any body send with the request will not be
|
| - * part of the redirection request(s).
|
| - */
|
| - bool followRedirects;
|
| -
|
| - /**
|
| - * Set this property to the maximum number of redirects to follow
|
| - * when [followRedirects] is [:true:]. If this number is exceeded the
|
| - * [onError] callback will be called with a [RedirectException].
|
| - *
|
| - * The default value is 5.
|
| - */
|
| - int maxRedirects;
|
| -
|
| - /**
|
| - * The method of the request.
|
| - */
|
| - String get method;
|
| -
|
| - /**
|
| - * The uri of the request.
|
| - */
|
| - Uri get uri;
|
| -
|
| - /**
|
| - * Gets and sets the content length of the request. If the size of
|
| - * the request is not known in advance set content length to -1,
|
| - * which is also the default.
|
| - */
|
| - int contentLength;
|
| -
|
| - /**
|
| - * Get or set if the [HttpClientRequest] should buffer output.
|
| - *
|
| - * Default value is `true`.
|
| - *
|
| - * __Note__: Disabling buffering of the output can result in very poor
|
| - * performance, when writing many small chunks.
|
| - */
|
| - bool bufferOutput;
|
| -
|
| - /**
|
| - * Returns the client request headers.
|
| - *
|
| - * The client request headers can be modified until the client
|
| - * request body is written to or closed. After that they become
|
| - * immutable.
|
| - */
|
| - HttpHeaders get headers;
|
| -
|
| - /**
|
| - * Cookies to present to the server (in the 'cookie' header).
|
| - */
|
| - List<Cookie> get cookies;
|
| -
|
| - /**
|
| - * A [HttpClientResponse] future that will complete once the response is
|
| - * available. If an error occurs before the response is available, this
|
| - * future will complete with an error.
|
| - */
|
| - Future<HttpClientResponse> get done;
|
| -
|
| - /**
|
| - * Close the request for input. Returns the value of [done].
|
| - */
|
| - Future<HttpClientResponse> close();
|
| -
|
| - /**
|
| - * Get information about the client connection. Returns [:null:] if the socket
|
| - * is not available.
|
| - */
|
| - HttpConnectionInfo get connectionInfo;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * HTTP response for a client connection.
|
| - *
|
| - * The body of a [HttpClientResponse] object is a
|
| - * [Stream] of data from the server. Listen to the body to handle
|
| - * the data and be notified when the entire body is received.
|
| - *
|
| - * new HttpClient().get('localhost', 80, '/file.txt')
|
| - * .then((HttpClientRequest request) => request.close())
|
| - * .then((HttpClientResponse response) {
|
| - * response.transform(UTF8.decoder).listen((contents) {
|
| - * // handle data
|
| - * });
|
| - * });
|
| - */
|
| -abstract class HttpClientResponse implements Stream<List<int>> {
|
| - /**
|
| - * Returns the status code.
|
| - *
|
| - * The status code must be set before the body is written
|
| - * to. Setting the status code after writing to the body will throw
|
| - * a `StateError`.
|
| - */
|
| - int get statusCode;
|
| -
|
| - /**
|
| - * Returns the reason phrase associated with the status code.
|
| - *
|
| - * The reason phrase must be set before the body is written
|
| - * to. Setting the reason phrase after writing to the body will throw
|
| - * a `StateError`.
|
| - */
|
| - String get reasonPhrase;
|
| -
|
| - /**
|
| - * Returns the content length of the response body. Returns -1 if the size of
|
| - * the response body is not known in advance.
|
| - *
|
| - * If the content length needs to be set, it must be set before the
|
| - * body is written to. Setting the reason phrase after writing to
|
| - * the body will throw a `StateError`.
|
| - */
|
| - int get contentLength;
|
| -
|
| - /**
|
| - * Gets the persistent connection state returned by the server.
|
| - *
|
| - * if the persistent connection state needs to be set, it must be
|
| - * set before the body is written to. Setting the reason phrase
|
| - * after writing to the body will throw a `StateError`.
|
| - */
|
| - bool get persistentConnection;
|
| -
|
| - /**
|
| - * Returns whether the status code is one of the normal redirect
|
| - * codes [HttpStatus.MOVED_PERMANENTLY], [HttpStatus.FOUND],
|
| - * [HttpStatus.MOVED_TEMPORARILY], [HttpStatus.SEE_OTHER] and
|
| - * [HttpStatus.TEMPORARY_REDIRECT].
|
| - */
|
| - bool get isRedirect;
|
| -
|
| - /**
|
| - * Returns the series of redirects this connection has been through. The
|
| - * list will be empty if no redirects were followed. [redirects] will be
|
| - * updated both in the case of an automatic and a manual redirect.
|
| - */
|
| - List<RedirectInfo> get redirects;
|
| -
|
| - /**
|
| - * Redirects this connection to a new URL. The default value for
|
| - * [method] is the method for the current request. The default value
|
| - * for [url] is the value of the [HttpHeaders.LOCATION] header of
|
| - * the current response. All body data must have been read from the
|
| - * current response before calling [redirect].
|
| - *
|
| - * All headers added to the request will be added to the redirection
|
| - * request. However, any body sent with the request will not be
|
| - * part of the redirection request.
|
| - *
|
| - * If [followLoops] is set to [:true:], redirect will follow the redirect,
|
| - * even if the URL was already visited. The default value is [:false:].
|
| - *
|
| - * [redirect] will ignore [maxRedirects] and will always perform the redirect.
|
| - */
|
| - Future<HttpClientResponse> redirect([String method,
|
| - Uri url,
|
| - bool followLoops]);
|
| -
|
| -
|
| - /**
|
| - * Returns the client response headers.
|
| - *
|
| - * The client response headers are immutable.
|
| - */
|
| - HttpHeaders get headers;
|
| -
|
| - /**
|
| - * Detach the underlying socket from the HTTP client. When the
|
| - * socket is detached the HTTP client will no longer perform any
|
| - * operations on it.
|
| - *
|
| - * This is normally used when a HTTP upgrade is negotiated and the
|
| - * communication should continue with a different protocol.
|
| - */
|
| - Future<Socket> detachSocket();
|
| -
|
| - /**
|
| - * Cookies set by the server (from the 'set-cookie' header).
|
| - */
|
| - List<Cookie> get cookies;
|
| -
|
| - /**
|
| - * Returns the certificate of the HTTPS server providing the response.
|
| - * Returns null if the connection is not a secure TLS or SSL connection.
|
| - */
|
| - X509Certificate get certificate;
|
| -
|
| - /**
|
| - * Gets information about the client connection. Returns [:null:] if the socket
|
| - * is not available.
|
| - */
|
| - HttpConnectionInfo get connectionInfo;
|
| -}
|
| -
|
| -
|
| -abstract class HttpClientCredentials { }
|
| -
|
| -
|
| -/**
|
| - * Represents credentials for basic authentication.
|
| - */
|
| -abstract class HttpClientBasicCredentials extends HttpClientCredentials {
|
| - factory HttpClientBasicCredentials(String username, String password) =>
|
| - new _HttpClientBasicCredentials(username, password);
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Represents credentials for digest authentication. Digest
|
| - * authentication is only supported for servers using the MD5
|
| - * algorithm and quality of protection (qop) of either "none" or
|
| - * "auth".
|
| - */
|
| -abstract class HttpClientDigestCredentials extends HttpClientCredentials {
|
| - factory HttpClientDigestCredentials(String username, String password) =>
|
| - new _HttpClientDigestCredentials(username, password);
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Information about an [HttpRequest], [HttpResponse], [HttpClientRequest], or
|
| - * [HttpClientResponse] connection.
|
| - */
|
| -abstract class HttpConnectionInfo {
|
| - InternetAddress get remoteAddress;
|
| - int get remotePort;
|
| - int get localPort;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Redirect information.
|
| - */
|
| -abstract class RedirectInfo {
|
| - /**
|
| - * Returns the status code used for the redirect.
|
| - */
|
| - int get statusCode;
|
| -
|
| - /**
|
| - * Returns the method used for the redirect.
|
| - */
|
| - String get method;
|
| -
|
| - /**
|
| - * Returns the location for the redirect.
|
| - */
|
| - Uri get location;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * When detaching a socket from either the [:HttpServer:] or the
|
| - * [:HttpClient:] due to a HTTP connection upgrade there might be
|
| - * unparsed data already read from the socket. This unparsed data
|
| - * together with the detached socket is returned in an instance of
|
| - * this class.
|
| - */
|
| -abstract class DetachedSocket {
|
| - Socket get socket;
|
| - List<int> get unparsedData;
|
| -}
|
| -
|
| -
|
| -class HttpException implements IOException {
|
| - final String message;
|
| - final Uri uri;
|
| -
|
| - const HttpException(String this.message, {Uri this.uri});
|
| -
|
| - String toString() {
|
| - var b = new StringBuffer()
|
| - ..write('HttpException: ')
|
| - ..write(message);
|
| - if (uri != null) {
|
| - b.write(', uri = $uri');
|
| - }
|
| - return b.toString();
|
| - }
|
| -}
|
| -
|
| -
|
| -class RedirectException implements HttpException {
|
| - final String message;
|
| - final List<RedirectInfo> redirects;
|
| -
|
| - const RedirectException(this.message, this.redirects);
|
| -
|
| - String toString() => "RedirectException: $message";
|
| -
|
| - Uri get uri => redirects.last.location;
|
| -}
|
|
|