/*
 * 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 bool autoUncompress
 *  read / write
 *  Get and set whether the body of a response will be automatically
 *  uncompressed.
 *
 *  The body of an HTTP response can be compressed. In most situations providing
 *  the un-compressed body is most convenient. Therefore the default behavior is
 *  to un-compress the body. However in some situations (e.g. implementing a
 *  transparent proxy) keeping the uncompressed stream is required.
 *
 *  NOTE: Headers in from the response is never modified. This means that when
 *  automatic un-compression is turned on the value of the header Content-Length
 *  will reflect the length of the original compressed body. Likewise the header
 *  Content-Encoding will also have the original value indicating compression.
 *
 *  NOTE: Automatic un-compression is only performed if the Content-Encoding
 *  header value is gzip.
 *
 *  This value affects all responses produced by this client after the value is
 *  changed.
 *  To disable, set to false.
 *
 *  Default is true.
 * @description Checks that automatic un-compression is not performed if the
 * Content-Encoding header value is not gzip
 * @author sgrekhov@unipro.ru
 * @issue 31444
 */
import "dart:io";
import "dart:convert";
import "../../../Utils/expect.dart";

test() async {
  String helloWorld = 'Hello, test world!';
  HttpServer server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
  server.autoCompress = false;

  asyncStart();
  server.listen((HttpRequest request) {
    request.response
      ..headers.set(HttpHeaders.contentEncodingHeader, "no")
      ..write(helloWorld)
      ..close();
    server.close();
    asyncEnd();
  });

  asyncStart();
  HttpClient client = new HttpClient();
  client.autoUncompress = true;
  client
      .getUrl(Uri.parse(
      "http://${InternetAddress.loopbackIPv4.address}:${server.port}"))
      .then((HttpClientRequest request) {
    return request.close();
  }).then((HttpClientResponse response) {
    // Server sends uncompressed data. autoUncompress sets to true but
    // uncompression should not be performed
    response.cast<List<int>>().transform(utf8.decoder).listen((content) {
      Expect.equals(helloWorld, content);
      asyncEnd();
    });
  });
  asyncEnd();
}

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