| // 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(); |
| } |
| } |