// Copyright (c) 2017, 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.

/// @assertion Future<HttpClientRequest> openUrl(
///  String method,
///  Uri url
///  )
/// Opens an HTTP connection.
///
/// The HTTP method is specified in method and the URL to use in url.
///
/// The Host header for the request will be set to the value Uri.host:Uri.port
/// from url. This can be overridden through the HttpClientRequest interface
/// before the request is sent. NOTE if host is an IP address this will still be
/// set in the Host header.
///
/// For additional information on the sequence of events during an HTTP
/// transaction, and the objects returned by the futures, see the overall
/// documentation for the class HttpClient.
/// @description Checks that the Host header for the request be overridden
/// through the HttpClientRequest interface before the request is sent
/// @author sgrekhov@unipro.ru
/// @issue 31527
/// @issue 31528

import "dart:io";
import "dart:convert";
import "../../../Utils/expect.dart";

var localhost = InternetAddress.loopbackIPv4.address;

test() async {
  String helloWorld = "Hello test world!";
  HttpServer server = await HttpServer.bind(localhost, 0);
  server.listen((HttpRequest request) {
    Expect.equals("GET", request.method);
    Expect.equals("/Xxx?q=12&i=j", request.uri.toString());
    Expect.equals("dartlang.org", request.headers.host);
    Expect.equals(111, request.headers.port);
    request.response.write(helloWorld);
    request.response.close();
    server.close();
    asyncEnd();
  });

  HttpClient client = new HttpClient();
  client.openUrl("get",
      Uri.parse("http://${localhost}:${server.port}/Xxx?q=12&i=j#fragment"))
      .then((HttpClientRequest request) {
    request.headers.host = "dartlang.org";
    request.headers.port = 111;
    return request.close();
  }).then((HttpClientResponse response) {
    response.cast<List<int>>().transform(utf8.decoder).listen((content) {
      Expect.equals(helloWorld, content);
    });
  });
}

main() {
  asyncStart();
  test();
}
