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

import 'dart:io';

import 'package:expect/expect.dart';

// This test checks whether a big header is accepted.

Future<void> testClient(int limit) async {
  final server = await HttpServer.bind('127.0.0.1', 0);
  final str = 'a' * (1000);
  int size = 0;
  server.listen((request) async {
    for (int i = 0; i < 10000; i++) {
      request.response.headers.add('dummy', str);
      size += 1000;
      if (size > limit) {
        break;
      }
    }
    await request.response.close();
    server.close();
  });

  final client = HttpClient();
  final request = await client.get('127.0.0.1', server.port, '/');
  await request.close();
}

Future<void> client() async {
  int i = 64;
  try {
    for (; i < 101 * 1024 * 1024; i *= 100) {
      await testClient(i);
    }
  } on HttpException catch (e) {
    Expect.isTrue(e.toString().contains('size limit'));
    Expect.isTrue(i > 1024 * 1024);
    return;
  }
  Expect.fail('An exception is expected');
}

Future<void> testServer(int limit, int port) async {
  final str = 'a' * (1000);
  final client = HttpClient();
  final request = await client.get('127.0.0.1', port, '/');
  for (int size = 0; size < limit; size += 1000) {
    request.headers.add('dummy', str);
  }
  await request.close();
}

Future<void> server() async {
  final server = await HttpServer.bind('127.0.0.1', 0);
  int i = 64;
  try {
    server.listen((request) async {
      await request.response.close();
    });
    for (; i < 101 * 1024 * 1024; i *= 100) {
      print(i);
      await testServer(i, server.port);
    }
  } on SocketException catch (_) {
    // Server will close on error and writing to the socket will be blocked due
    // to broken pipe.
    Expect.isTrue(i > 1024 * 1024);
    server.close();
    return;
  }
  server.close();
  Expect.fail('An exception is expected');
}

Future<void> main() async {
  await client();
  await server();
}
