| // Copyright (c) 2018, 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. |
| |
| // This test verifies that secure connections that fail due to |
| // unauthenticated certificates throw exceptions in HttpClient. |
| |
| import "dart:async"; |
| import 'dart:io' |
| show |
| Directory, |
| File, |
| HandshakeException, |
| Platform, |
| Process, |
| ProcessResult, |
| SecurityContext; |
| |
| import 'package:http_io/http_io.dart'; |
| import "package:test/test.dart"; |
| |
| const HOST_NAME = "localhost"; |
| const CERTIFICATE = "localhost_cert"; |
| |
| String localFile(path) { |
| var script = "${Directory.current.path}/test/$path"; |
| if (!(new File(script)).existsSync()) { |
| // If we can't find the file relative to the cwd, then look relative to |
| // Platform.script. |
| script = Platform.script.resolve(path).toFilePath(); |
| } |
| return script; |
| } |
| |
| SecurityContext untrustedServerContext = new SecurityContext() |
| ..useCertificateChain(localFile('certificates/untrusted_server_chain.pem')) |
| ..usePrivateKey(localFile('certificates/untrusted_server_key.pem'), |
| password: 'dartdart'); |
| |
| SecurityContext clientContext = new SecurityContext() |
| ..setTrustedCertificates(localFile('certificates/trusted_certs.pem')); |
| |
| Future<HttpServer> runServer() { |
| return HttpServer.bindSecure(HOST_NAME, 0, untrustedServerContext, backlog: 5) |
| .then((server) { |
| server.listen((HttpRequest request) { |
| request.listen((_) {}, onDone: () { |
| request.response.close(); |
| }); |
| }, onError: (e) { |
| if (e is! HandshakeException) throw e; |
| }); |
| return server; |
| }); |
| } |
| |
| Future<Null> runTest() { |
| final completer = new Completer<Null>(); |
| var clientScript = localFile('https_unauthorized_client.dart'); |
| Future clientProcess(int port) { |
| return Process.run(Platform.executable, [clientScript, port.toString()]) |
| .then((ProcessResult result) { |
| if (result.exitCode != 0 || !result.stdout.contains('SUCCESS')) { |
| print("Client failed"); |
| print(" stdout:"); |
| print(result.stdout); |
| print(" stderr:"); |
| print(result.stderr); |
| fail('Client subprocess exit code: ${result.exitCode}'); |
| } |
| }); |
| } |
| |
| runServer().then((server) { |
| clientProcess(server.port).then((_) { |
| server.close(); |
| completer.complete(); |
| }); |
| }); |
| return completer.future; |
| } |
| |
| void main() { |
| test('httpsUnauthorized', runTest); |
| } |