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

// 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();
}
