| Index: sdk/lib/io/http.dart | 
| diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart | 
| index 2862036c416ff7485e2fe175183d0b93b50f5688..9c5a6fb266a42e1453753c7032717739858251d7 100644 | 
| --- a/sdk/lib/io/http.dart | 
| +++ b/sdk/lib/io/http.dart | 
| @@ -1,4 +1,4 @@ | 
| -// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
| +// 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. | 
|  | 
| @@ -57,54 +57,56 @@ abstract class HttpStatus { | 
| /** | 
| * HTTP server. | 
| */ | 
| -abstract class HttpServer { | 
| -  factory HttpServer() => new _HttpServer(); | 
| - | 
| +abstract class HttpServer implements Stream<HttpRequest> { | 
| +  // TODO(ajohnsen): Document with example, once the stream API is final. | 
| +  // TODO(ajohnsen): Add HttpServer.secure. | 
| /** | 
| * Start listening for HTTP requests on the specified [host] and | 
| * [port]. If a [port] of 0 is specified the server will choose an | 
| * ephemeral port. The optional argument [backlog] can be used to | 
| -   * specify the listen backlog for the underlying OS listen. | 
| -   * The optional arguments [certificate_name] and [requestClientCertificate] | 
| -   * are used by the HttpsServer class, which shares the same interface. | 
| -   * See [addRequestHandler] and [defaultRequestHandler] for | 
| -   * information on how incoming HTTP requests are handled. | 
| +   * specify the listen backlog for the underlying OS listen | 
| +   * setup. | 
| */ | 
| -  void listen(String host, | 
| -              int port, | 
| -              {int backlog: 128, | 
| -               String certificate_name, | 
| -               bool requestClientCertificate: false}); | 
| +  static Future<HttpServer> bind([String address = "127.0.0.1", | 
| +                                  int port = 0, | 
| +                                  int backlog = 0]) | 
| +      => _HttpServer.bind(address, port, backlog); | 
|  | 
| /** | 
| -   * Attach the HTTP server to an existing [:ServerSocket:]. If the | 
| -   * [HttpServer] is closed, the [HttpServer] will just detach itself, | 
| -   * and not close [serverSocket]. | 
| +   * Start listening for HTTPS requests on the specified [host] and | 
| +   * [port]. If a [port] of 0 is specified the server will choose an | 
| +   * ephemeral port. The optional argument [backlog] can be used to | 
| +   * specify the listen backlog for the underlying OS listen | 
| +   * setup. | 
| +   * | 
| +   * The certificate with Distinguished Name [certificate_name] is looked | 
| +   * up in the certificate database, and is used as the server certificate. | 
| +   * if [requestClientCertificate] is true, the server will request clients | 
| +   * to authenticate with a client certificate. | 
| */ | 
| -  void listenOn(ServerSocket serverSocket); | 
|  | 
| -  /** | 
| -   * Adds a request handler to the list of request handlers. The | 
| -   * function [matcher] is called with the request and must return | 
| -   * [:true:] if the [handler] should handle the request. The first | 
| -   * handler for which [matcher] returns [:true:] will be handed the | 
| -   * request. | 
| -   */ | 
| -  addRequestHandler(bool matcher(HttpRequest request), | 
| -                    void handler(HttpRequest request, HttpResponse response)); | 
| +  static Future<HttpServer> bindSecure(String address, | 
| +                                       int port, | 
| +                                       {int backlog: 0, | 
| +                                        String certificateName, | 
| +                                        bool requestClientCertificate: false}) | 
| +      => _HttpServer.bindSecure(address, | 
| +                                port, | 
| +                                backlog, | 
| +                                certificateName, | 
| +                                requestClientCertificate); | 
|  | 
| /** | 
| -   * Sets the default request handler. This request handler will be | 
| -   * called if none of the request handlers registered by | 
| -   * [addRequestHandler] matches the current request. If no default | 
| -   * request handler is set the server will just respond with status | 
| -   * code [:NOT_FOUND:] (404). | 
| +   * Attach the HTTP server to an existing [:ServerSocket:]. When the | 
| +   * [HttpServer] is closed, the [HttpServer] will just detach itself, | 
| +   * close current connections but not close [serverSocket]. | 
| */ | 
| -  void set defaultRequestHandler( | 
| -      void handler(HttpRequest request, HttpResponse response)); | 
| +  factory HttpServer.listenOn(ServerSocket serverSocket) | 
| +      => new _HttpServer.listenOn(serverSocket); | 
|  | 
| /** | 
| -   * Stop server listening. | 
| +   * Stop server listening. This will make the [Stream] close with a done | 
| +   * event. | 
| */ | 
| void close(); | 
|  | 
| @@ -116,11 +118,6 @@ abstract class HttpServer { | 
| int get port; | 
|  | 
| /** | 
| -   * Sets the error handler that is called when a connection error occurs. | 
| -   */ | 
| -  void set onError(void callback(e)); | 
| - | 
| -  /** | 
| * Set the timeout, in seconds, for sessions of this HTTP server. Default | 
| * is 20 minutes. | 
| */ | 
| @@ -128,21 +125,13 @@ abstract class HttpServer { | 
|  | 
| /** | 
| * Returns a [:HttpConnectionsInfo:] object with an overview of the | 
| -   * current connection handled by the server. | 
| +   * current connections handled by the server. | 
| */ | 
| HttpConnectionsInfo connectionsInfo(); | 
| } | 
|  | 
|  | 
| /** | 
| - * HTTPS server. | 
| - */ | 
| -abstract class HttpsServer implements HttpServer { | 
| -  factory HttpsServer() => new _HttpServer.httpsServer(); | 
| -} | 
| - | 
| - | 
| -/** | 
| * Overview information of the [:HttpServer:] socket connections. | 
| */ | 
| class HttpConnectionsInfo { | 
| @@ -445,18 +434,13 @@ abstract class HeaderValue { | 
| String toString(); | 
| } | 
|  | 
| -abstract class HttpSession { | 
| +abstract class HttpSession implements Map { | 
| /** | 
| * Get the id for the current session. | 
| */ | 
| String get id; | 
|  | 
| /** | 
| -   * Access the user-data associated with the session. | 
| -   */ | 
| -  dynamic data; | 
| - | 
| -  /** | 
| * Destroy the session. This will terminate the session and any further | 
| * connections with this id will be given a new id and session. | 
| */ | 
| @@ -466,6 +450,11 @@ abstract class HttpSession { | 
| * Set a callback that will be called when the session is timed out. | 
| */ | 
| void set onTimeout(void callback()); | 
| + | 
| +  /** | 
| +   * Is true if the session have not been sent to the client yet. | 
| +   */ | 
| +  bool get isNew; | 
| } | 
|  | 
|  | 
| @@ -590,9 +579,11 @@ abstract class Cookie { | 
|  | 
|  | 
| /** | 
| - * Http request delivered to the HTTP server callback. | 
| + * Http request delivered to the HTTP server callback. The [HttpRequest] is a | 
| + * [Stream] of the body content of the request. Listen to the body to handle the | 
| + * data and be notified once the entire body is received. | 
| */ | 
| -abstract class HttpRequest { | 
| +abstract class HttpRequest implements Stream<List<int>> { | 
| /** | 
| * Returns the content length of the request body. If the size of | 
| * the request body is not known in advance this -1. | 
| @@ -600,11 +591,6 @@ abstract class HttpRequest { | 
| int get contentLength; | 
|  | 
| /** | 
| -   * Returns the persistent connection state signaled by the client. | 
| -   */ | 
| -  bool get persistentConnection; | 
| - | 
| -  /** | 
| * Returns the method for the request. | 
| */ | 
| String get method; | 
| @@ -612,17 +598,7 @@ abstract class HttpRequest { | 
| /** | 
| * Returns the URI for the request. | 
| */ | 
| -  String get uri; | 
| - | 
| -  /** | 
| -   * Returns the path part of the URI. | 
| -   */ | 
| -  String get path; | 
| - | 
| -  /** | 
| -   * Returns the query string. | 
| -   */ | 
| -  String get queryString; | 
| +  Uri get uri; | 
|  | 
| /** | 
| * Returns the parsed query string. | 
| @@ -640,6 +616,11 @@ abstract class HttpRequest { | 
| List<Cookie> get cookies; | 
|  | 
| /** | 
| +   * Returns the persistent connection state signaled by the client. | 
| +   */ | 
| +  bool get persistentConnection; | 
| + | 
| +  /** | 
| * Returns the client certificate of the client making the request. | 
| * Returns 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 | 
| @@ -648,19 +629,12 @@ abstract class HttpRequest { | 
| X509Certificate get certificate; | 
|  | 
| /** | 
| -   * Returns, or initialize, a session for the given request. If the session is | 
| -   * being initialized by this call, [init] will be called with the | 
| -   * newly create session. Here the [:HttpSession.data:] field can be set, if | 
| -   * needed. | 
| +   * Get the session for the given request. If the session is | 
| +   * being initialized by this call, [:isNew:] will be true for the returned | 
| +   * session. | 
| * See [:HttpServer.sessionTimeout:] on how to change default timeout. | 
| */ | 
| -  HttpSession session([init(HttpSession session)]); | 
| - | 
| -  /** | 
| -   * Returns the input stream for the request. This is used to read | 
| -   * the request data. | 
| -   */ | 
| -  InputStream get inputStream; | 
| +  HttpSession get session; | 
|  | 
| /** | 
| * Returns the HTTP protocol version used in the request. This will | 
| @@ -673,13 +647,20 @@ abstract class HttpRequest { | 
| * isn't available. | 
| */ | 
| HttpConnectionInfo get connectionInfo; | 
| + | 
| +  /** | 
| +   * Get the [HttpResponse] object, used for sending back the response to the | 
| +   * client. | 
| +   */ | 
| +  HttpResponse get response; | 
| } | 
|  | 
|  | 
| /** | 
| * HTTP response to be send back to the client. | 
| */ | 
| -abstract class HttpResponse { | 
| +abstract class HttpResponse implements IOSink<HttpResponse> { | 
| +  // 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 | 
| @@ -719,17 +700,6 @@ abstract class HttpResponse { | 
| List<Cookie> get cookies; | 
|  | 
| /** | 
| -   * Returns the output stream for the response. This is used to write | 
| -   * the response data. When all response data has been written close | 
| -   * the stream to indicate the end of the response. | 
| -   * | 
| -   * When this is accessed for the first time the response header is | 
| -   * send. Calling any methods that will change the header after | 
| -   * having retrieved the output stream will throw an exception. | 
| -   */ | 
| -  OutputStream get outputStream; | 
| - | 
| -  /** | 
| * Detach the underlying socket from the HTTP server. When the | 
| * socket is detached the HTTP server will no longer perform any | 
| * operations on it. | 
| @@ -737,7 +707,7 @@ abstract class HttpResponse { | 
| * This is normally used when a HTTP upgrade request is received | 
| * and the communication should continue with a different protocol. | 
| */ | 
| -  DetachedSocket detachSocket(); | 
| +  Future<Socket> detachSocket(); | 
|  | 
| /** | 
| * Get information about the client connection. Returns [null] if the socket | 
| @@ -753,7 +723,7 @@ abstract class HttpResponse { | 
| * try to reuse opened sockets for several requests to support HTTP 1.1 | 
| * persistent connections. This means that sockets will be kept open for some | 
| * time after a requests have completed, unless HTTP procedures indicate that it | 
| - * must be closed as part of completing the request. Use [:HttpClient.shutdown:] | 
| + * must be closed as part of completing the request. Use [:HttpClient.close:] | 
| * to force close the idle sockets. | 
| */ | 
| abstract class HttpClient { | 
| @@ -763,50 +733,51 @@ abstract class HttpClient { | 
| factory HttpClient() => new _HttpClient(); | 
|  | 
| /** | 
| -   * Opens a HTTP connection. The returned [HttpClientConnection] is | 
| -   * used to register callbacks for asynchronous events on the HTTP | 
| -   * connection. 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" | 
| +   * Opens a HTTP connection. The returned [HttpClientRequest] is used to | 
| +   * fill in the content of the request before sending it. 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. | 
| */ | 
| -  HttpClientConnection open(String method, String host, int port, String path); | 
| +  Future<HttpClientRequest> open(String method, | 
| +                                 String host, | 
| +                                 int port, | 
| +                                 String path); | 
|  | 
| /** | 
| -   * Opens a HTTP connection. The returned [HttpClientConnection] is | 
| -   * used to register callbacks for asynchronous events on the HTTP | 
| -   * connection. The "Host" header for the request will be set based | 
| -   * the host and port specified in [url]. This can be overridden | 
| -   * through the HttpClientRequest interface before the request is | 
| -   * sent. NOTE if the host is specified as an IP address this will | 
| -   * still be set in the "Host" header. | 
| +   * Opens a HTTP connection. The returned [HttpClientRequest] is used to | 
| +   * fill in the content of the request before sending it. 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. | 
| */ | 
| -  HttpClientConnection openUrl(String method, Uri url); | 
| +  Future<HttpClientRequest> openUrl(String method, Uri url); | 
|  | 
| /** | 
| * Opens a HTTP connection using the GET method. See [open] for | 
| * details. Using this method to open a HTTP connection will set the | 
| * content length to 0. | 
| */ | 
| -  HttpClientConnection get(String host, int port, String path); | 
| +  Future<HttpClientRequest> get(String host, int port, String path); | 
|  | 
| /** | 
| * Opens a HTTP connection using the GET method. See [openUrl] for | 
| * details. Using this method to open a HTTP connection will set the | 
| * content length to 0. | 
| */ | 
| -  HttpClientConnection getUrl(Uri url); | 
| +  Future<HttpClientRequest> getUrl(Uri url); | 
|  | 
| /** | 
| * Opens a HTTP connection using the POST method. See [open] for details. | 
| */ | 
| -  HttpClientConnection post(String host, int port, String path); | 
| +  Future<HttpClientRequest> post(String host, int port, String path); | 
|  | 
| /** | 
| * Opens a HTTP connection using the POST method. See [openUrl] for details. | 
| */ | 
| -  HttpClientConnection postUrl(Uri url); | 
| +  Future<HttpClientRequest> postUrl(Uri url); | 
|  | 
| /** | 
| * Sets the function to be called when a site is requesting | 
| @@ -881,47 +852,64 @@ abstract class HttpClient { | 
| * trying to establish a new connection after calling [shutdown] | 
| * will throw an exception. | 
| */ | 
| -  void shutdown({bool force: false}); | 
| +  void close({bool force: false}); | 
| } | 
|  | 
|  | 
| /** | 
| - * A [HttpClientConnection] is returned by all [HttpClient] methods | 
| - * that initiate a connection to an HTTP server. The handlers will be | 
| - * called as the connection state progresses. | 
| + * HTTP request for a client connection. | 
| + * | 
| + * The request is an [IOSink], used to write the request data. When | 
| + * all request data has been written, close the stream to indicate the end of | 
| + * the request. | 
| * | 
| - * The setting of all handlers is optional. If [onRequest] is not set | 
| - * the request will be send without any additional headers and an | 
| - * empty body. If [onResponse] is not set the response will be read | 
| - * and discarded. | 
| + * When this is accessed for the first time the request header is | 
| + * send. Calling any methods that will change the header after | 
| + * having retrieved the output stream will throw an exception. | 
| */ | 
| -abstract class HttpClientConnection { | 
| +abstract class HttpClientRequest | 
| +    implements IOSink<HttpClientRequest> { | 
| +  /** | 
| +   * 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; | 
| + | 
| +  /** | 
| +   * Returns the request headers. | 
| +   */ | 
| +  HttpHeaders get headers; | 
| + | 
| +  /** | 
| +   * Cookies to present to the server (in the Cookie header). | 
| +   */ | 
| +  List<Cookie> get cookies; | 
| + | 
| /** | 
| -   * Sets the handler that is called when the connection is established. | 
| +   * Gets and sets the requested persistent connection state. | 
| +   * The default value is [:true:]. | 
| */ | 
| -  void set onRequest(void callback(HttpClientRequest request)); | 
| +  bool persistentConnection; | 
|  | 
| /** | 
| -   * Sets callback to be called when the request has been send and | 
| -   * the response is ready for processing. The callback is called when | 
| -   * all headers of the response are received and data is ready to be | 
| -   * received. | 
| +   * A [HttpClientResponse] future that will complete once the response is | 
| +   * available. If an error occours before the response is available, this | 
| +   * future will complete with an error. | 
| */ | 
| -  void set onResponse(void callback(HttpClientResponse response)); | 
| +  Future<HttpClientResponse> get response; | 
|  | 
| /** | 
| -   * Sets the handler that gets called if an error occurs while | 
| -   * connecting or processing the HTTP request. | 
| +   * Close the request for input. Returns the value of [response]. | 
| */ | 
| -  void set onError(void callback(e)); | 
| +  Future<HttpClientResponse> close(); | 
|  | 
| /** | 
| -   * Set this property to [:true:] if this connection should | 
| -   * automatically follow redirects. The default is | 
| -   * [:true:]. | 
| +   * 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 [:HttpStatus.MOVED_PERMANENTLY:] | 
| +   * 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 | 
| @@ -945,34 +933,6 @@ abstract class HttpClientConnection { | 
| int maxRedirects; | 
|  | 
| /** | 
| -   * Returns the series of redirects this connection has been through. | 
| -   */ | 
| -  List<RedirectInfo> get redirects; | 
| - | 
| -  /** | 
| -   * Redirect 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(s). However, any body send with the request will not be | 
| -   * part of the redirection request(s). | 
| -   */ | 
| -  void redirect([String method, Uri url]); | 
| - | 
| -  /** | 
| -   * 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. | 
| -   */ | 
| -  DetachedSocket detachSocket(); | 
| - | 
| -  /** | 
| * Get information about the client connection. Returns [null] if the socket | 
| * isn't available. | 
| */ | 
| @@ -981,49 +941,12 @@ abstract class HttpClientConnection { | 
|  | 
|  | 
| /** | 
| - * HTTP request for a client connection. | 
| - */ | 
| -abstract class HttpClientRequest { | 
| -  /** | 
| -   * 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; | 
| - | 
| -  /** | 
| -   * Returns the request headers. | 
| -   */ | 
| -  HttpHeaders get headers; | 
| + * HTTP response for a client connection. The [HttpClientResponse] is a | 
| + * [Stream] of the body content of the response. Listen to the body to handle | 
| + * the data and be notified once the entire body is received. | 
|  | 
| -  /** | 
| -   * Cookies to present to the server (in the Cookie header). | 
| -   */ | 
| -  List<Cookie> get cookies; | 
| - | 
| -  /** | 
| -   * Gets and sets the requested persistent connection state. | 
| -   * The default value is [:true:]. | 
| -   */ | 
| -  bool persistentConnection; | 
| - | 
| -  /** | 
| -   * Returns the output stream for the request. This is used to write | 
| -   * the request data. When all request data has been written close | 
| -   * the stream to indicate the end of the request. | 
| -   * | 
| -   * When this is accessed for the first time the request header is | 
| -   * send. Calling any methods that will change the header after | 
| -   * having retrieved the output stream will throw an exception. | 
| -   */ | 
| -  OutputStream get outputStream; | 
| -} | 
| - | 
| - | 
| -/** | 
| - * HTTP response for a client connection. | 
| */ | 
| -abstract class HttpClientResponse { | 
| +abstract class HttpClientResponse implements Stream<List<int>> { | 
| /** | 
| * Returns the status code. | 
| */ | 
| @@ -1054,11 +977,49 @@ abstract class HttpClientResponse { | 
| bool get isRedirect; | 
|  | 
| /** | 
| +   * Returns the series of redirects this connection has been through. The | 
| +   * list will be empty if no redirects was followed. [redirects] will be | 
| +   * updated both in the case of an automatic and a manual redirect. | 
| +   */ | 
| +  List<RedirectInfo> get redirects; | 
| + | 
| +  /** | 
| +   * Redirect 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(s). However, any body send with the request will not be | 
| +   * part of the redirection request(s). | 
| +   * | 
| +   * If [followLoops] is set to [true], redirect will follow the redirect, | 
| +   * even if was already visited. Default value is [false]. | 
| +   * | 
| +   * [redirect] will ignore [maxRedirects] and always perform the redirect. | 
| +   */ | 
| +  Future<HttpClientResponse> redirect([String method, | 
| +                                       Uri url, | 
| +                                       bool followLoops]); | 
| + | 
| + | 
| +  /** | 
| * Returns the response headers. | 
| */ | 
| 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; | 
| @@ -1070,10 +1031,10 @@ abstract class HttpClientResponse { | 
| X509Certificate get certificate; | 
|  | 
| /** | 
| -   * Returns the input stream for the response. This is used to read | 
| -   * the response data. | 
| +   * Get information about the client connection. Returns [null] if the socket | 
| +   * isn't available. | 
| */ | 
| -  InputStream get inputStream; | 
| +  HttpConnectionInfo get connectionInfo; | 
| } | 
|  | 
|  | 
|  |