// 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.
//

// @dart = 2.9

import "dart:io";

main() {
  bool serverOnClosed = false;
  bool clientOnClosed = false;
  bool requestOnClosed = false;

  HttpServer.bind("127.0.0.1", 0).then((server) {
    var client = new HttpClient();

    checkDone() {
      if (serverOnClosed && clientOnClosed && requestOnClosed) {
        server.close();
        client.close();
      }
    }

    server.listen((request) {
      request.listen((_) {}, onDone: () {
        request.response.done.then((_) {
          serverOnClosed = true;
          checkDone();
        });
        request.response.write("hello!");
        request.response.close();
      });
    });

    client
        .postUrl(Uri.parse("http://127.0.0.1:${server.port}"))
        .then((request) {
      request.contentLength = "hello!".length;
      request.done.then((_) {
        clientOnClosed = true;
        checkDone();
      });
      request.write("hello!");
      return request.close();
    }).then((response) {
      response.listen((_) {}, onDone: () {
        requestOnClosed = true;
        checkDone();
      });
    });
  });
}
