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

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

void testHEAD(int totalConnections) {
  HttpServer.bind().then((server) {
    server.listen((request) {
        var response = request.response;
        if (request.uri.path == "/test100") {
          response.contentLength = 100;
          response.close();
        } else if (request.uri.path == "/test200") {
          response.contentLength = 200;
          List<int> data = new List<int>.filled(200, 0);
          response.add(data);
          response.close();
        } else if (request.uri.path == "/testChunked100") {
          List<int> data = new List<int>.filled(100, 0);
          response.add(data);
          response.close();
        } else if (request.uri.path == "/testChunked200") {
          List<int> data = new List<int>.filled(200, 0);
          response.add(data);
          response.close();
        } else {
          assert(false);
        }
      });

    HttpClient client = new HttpClient();

    int count = 0;

    requestDone() {
      count++;
      if (count == totalConnections * 2) {
        client.close();
        server.close();
      }
    }

    for (int i = 0; i < totalConnections; i++) {
      int len = (i % 2 == 0) ? 100 : 200;
      client.open("HEAD", "127.0.0.1", server.port, "/test$len")
        .then((request) => request.close())
        .then((HttpClientResponse response) {
          Expect.equals(len, response.contentLength);
          response.listen(
            (_) => Expect.fail("Data from HEAD request"),
            onDone: requestDone);
        });

      client.open("HEAD", "127.0.0.1", server.port, "/testChunked$len")
        .then((request) => request.close())
        .then((HttpClientResponse response) {
            print(response.headers);
          Expect.equals(-1, response.contentLength);
          response.listen(
            (_) => Expect.fail("Data from HEAD request"),
            onDone: requestDone);
        });
    }
  });
}

void main() {
  testHEAD(4);
}
