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

import "dart:async";
import "dart:io";

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

// Client makes a HTTP 1.0 request without connection keep alive. The
// server sets a content length but still needs to close the
// connection as there is no keep alive.
void testHttpIPv6() {
  asyncStart();
  HttpServer.bind("::", 0).then((server) {
    server.listen((HttpRequest request) {
      Expect.equals(request.headers["host"]![0], "[::1]:${server.port}");
      Expect.equals(request.requestedUri.host, "::1");
      request.response.close();
    });

    var client = new HttpClient();
    var url = Uri.parse('http://[::1]:${server.port}/xxx');
    Expect.equals(url.host, '::1');
    client
        .openUrl('GET', url)
        .then((request) => request.close())
        .then((response) {
      Expect.equals(response.statusCode, HttpStatus.ok);
    }).whenComplete(() {
      server.close();
      client.close();
      asyncEnd();
    });
  });
}

void main() {
  testHttpIPv6();
}
