blob: ea07ff54813194b4089cccc77df2fc31af9f7f5d [file] [log] [blame]
// 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';
// Test that a HTTP "CONNECT" request with 200 status code won't close the
// underlying socket.
// issue: https://github.com/dart-lang/sdk/issues/37808
Future<void> testConnect(int statusCode, int port) async {
final url = "https://domain.invalid";
var client = HttpClient();
try {
client.findProxy = (uri) => "PROXY 127.0.0.1:$port";
try {
final request = await client.getUrl(Uri.parse(url));
await request.close();
Expect.fail('request should have thrown an exception');
} catch (e) {
if (statusCode == HttpStatus.ok) {
// Underlying sockets won't be closed and then handshake will fail.
Expect.type<HandshakeException>(e);
} else {
Expect.type<HttpException>(e);
}
}
} finally {
client.close();
}
}
Future<void> main() async {
final server = await HttpServer.bind('127.0.0.1', 0);
try {
final statusCodes = <int>[200, 299, 199, 300];
int index = 0;
server.listen((request) {
request.response.statusCode = statusCodes[index++];
request.response.headers.contentLength = 0;
request.response.close();
});
for (final statusCode in statusCodes) {
await testConnect(statusCode, server.port);
}
} finally {
server.close();
}
}