// 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.
//
// VMOptions=
// VMOptions=--short_socket_read
// VMOptions=--short_socket_write
// VMOptions=--short_socket_read --short_socket_write

// @dart = 2.9

import "dart:io";
import "package:expect/expect.dart";

void main() {
  final int REQUEST_COUNT = 100;
  int count = 0;
  HttpServer.bind("127.0.0.1", 0).then((server) {
    server.listen((HttpRequest request) {
      count++;
      request.response.write(request.uri.path);
      request.response.close();
      if (request.uri.path == "/done") {
        request.response.done.then((_) {
          Expect.equals(REQUEST_COUNT + 1, count);
          server.close();
        });
      }
    });
    Socket.connect("127.0.0.1", server.port).then((s) {
      s.listen((data) {});
      for (int i = 0; i < REQUEST_COUNT; i++) {
        s.write("GET /$i HTTP/1.1\r\nX-Header-1: 111\r\n\r\n");
      }
      s.write("GET /done HTTP/1.1\r\nConnection: close\r\n\r\n");
      s.close();
    });
  });
}
