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

// VMOptions=
// VMOptions=--short_socket_read
// VMOptions=--short_socket_write
// VMOptions=--short_socket_read --short_socket_write

import "dart:async";
import "dart:isolate";
import "dart:io";

import "package:expect/expect.dart";

// Test that a response line without any reason phrase is handled.
void missingReasonPhrase(int statusCode, bool includeSpace) {
  var client = new HttpClient();
  ServerSocket.bind("127.0.0.1", 0).then((server) {
    server.listen((client) {
      client.listen(null);
      if (includeSpace) {
        client.write("HTTP/1.1 $statusCode \r\n\r\n");
      } else {
        client.write("HTTP/1.1 $statusCode\r\n\r\n");
      }
      client.close();
    });
    client
        .getUrl(Uri.parse("http://127.0.0.1:${server.port}/"))
        .then((request) => request.close())
        .then((response) {
          Expect.equals(statusCode, response.statusCode);
          Expect.equals("", response.reasonPhrase);
          return response.drain();
        })
        .whenComplete(() => server.close());
  });
}

void main() {
  missingReasonPhrase(HttpStatus.ok, true);
  missingReasonPhrase(HttpStatus.internalServerError, true);
  missingReasonPhrase(HttpStatus.ok, false);
  missingReasonPhrase(HttpStatus.internalServerError, false);
}
