blob: ad3cc51163d07e143d1b2cab06e3fd0d71cd63c5 [file] [log] [blame]
// Copyright (c) 2012, 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.
//
// OtherResources=certificates/server_chain.pem
// OtherResources=certificates/server_key.pem
// OtherResources=certificates/trusted_certs.pem
import "dart:async";
import "dart:io";
import "dart:isolate";
import "package:expect/expect.dart";
InternetAddress HOST;
String localFile(path) => Platform.script.resolve(path).toFilePath();
SecurityContext serverContext = new SecurityContext()
..useCertificateChain(localFile('certificates/server_chain.pem'))
..usePrivateKey(localFile('certificates/server_key.pem'),
password: 'dartdart');
SecurityContext clientContext = new SecurityContext()
..setTrustedCertificates(localFile('certificates/trusted_certs.pem'));
void testListenOn() {
void test(void onDone()) {
HttpServer.bindSecure(HOST, 0, serverContext, backlog: 5).then((server) {
ReceivePort serverPort = new ReceivePort();
server.listen((HttpRequest request) {
request.listen((_) {}, onDone: () {
request.response.close();
serverPort.close();
});
});
HttpClient client = new HttpClient(context: clientContext);
ReceivePort clientPort = new ReceivePort();
client
.getUrl(Uri.parse("https://${HOST.host}:${server.port}/"))
.then((HttpClientRequest request) {
return request.close();
}).then((HttpClientResponse response) {
response.listen((_) {}, onDone: () {
client.close();
clientPort.close();
server.close();
Expect.throws(() => server.port);
onDone();
});
}).catchError((e, trace) {
String msg = "Unexpected error in Https client: $e";
if (trace != null) msg += "\nStackTrace: $trace";
Expect.fail(msg);
});
});
}
// Test two servers in succession.
test(() {
test(() {});
});
}
void testEarlyClientClose() {
HttpServer.bindSecure(HOST, 0, serverContext).then((server) {
server.listen((request) {
String name = Platform.script.toFilePath();
new File(name)
.openRead()
.pipe(request.response)
.catchError((e) {/* ignore */});
});
var count = 0;
makeRequest() {
Socket.connect(HOST, server.port).then((socket) {
var data = "Invalid TLS handshake";
socket.write(data);
socket.close();
socket.done.then((_) {
socket.destroy();
if (++count < 10) {
makeRequest();
} else {
server.close();
}
});
});
}
makeRequest();
});
}
void main() {
InternetAddress.lookup("localhost").then((hosts) {
HOST = hosts.first;
testListenOn();
testEarlyClientClose();
});
}