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

import "dart:async";
import 'dart:convert';
import "dart:io";

import "package:expect/expect.dart";

void test(responseBytes, bodyLength) async {
  fullRequest(bytes) {
    var len = bytes.length;
    return len > 4 &&
        bytes[len - 4] == 13 &&
        bytes[len - 3] == 10 &&
        bytes[len - 2] == 13 &&
        bytes[len - 1] == 10;
  }

  handleSocket(socket) async {
    var bytes = [];
    await for (var data in socket) {
      bytes.addAll(data);
      if (fullRequest(bytes)) {
        socket.add(responseBytes);
        socket.close();
      }
    }
  }

  var server = await ServerSocket.bind('127.0.0.1', 0);
  server.listen(handleSocket);

  var client = new HttpClient();
  var request =
      await client.getUrl(Uri.parse('http://127.0.0.1:${server.port}/'));
  var response = await request.close();
  Expect.equals(response.statusCode, 200);
  Expect.equals(bodyLength,
      (await response.fold<List<int>>(<int>[], (p, e) => p..addAll(e))).length);
  server.close();
}

main() {
  var r1 = '''
HTTP/1.1 100 Continue\r
\r
HTTP/1.1 200 OK\r
\r
''';

  var r2 = '''
HTTP/1.1 100 Continue\r
My-Header-1: hello\r
My-Header-2: world\r
\r
HTTP/1.1 200 OK\r
\r
''';

  var r3 = '''
HTTP/1.1 100 Continue\r
\r
HTTP/1.1 200 OK\r
Content-Length: 2\r
\r
AB''';

  test(ascii.encode(r1), 0);
  test(ascii.encode(r2), 0);
  test(ascii.encode(r3), 2);

  test(ascii.encode(r1.replaceAll('\r\n', '\n')), 0);
  test(ascii.encode(r2.replaceAll('\r\n', '\n')), 0);
  test(ascii.encode(r3.replaceAll('\r\n', '\n')), 2);
}
