connect method
void
connect(
- Uri uri,
- VoidCallback onConnected,
- StringCallback onError, {
- int timeoutSeconds = 15,
- bool ignoreBadCert = false,
override
Connects the socket to uri then invokes onConnected or onError.
Implementation
@override
void connect(Uri uri, VoidCallback onConnected, StringCallback onError,
{int timeoutSeconds = 15, bool ignoreBadCert = false}) async {
assert(!connecting);
connecting = true;
if (!ignoreBadCert || !uri.hasScheme || uri.scheme != 'wss') {
return io.WebSocket.connect('$uri')
.timeout(Duration(seconds: timeoutSeconds))
.then((io.WebSocket x) {
socket = x;
connectSucceeded(onConnected);
}, onError: (error, _) => onError(error));
}
io.HttpClient client = io.HttpClient();
client.badCertificateCallback =
(io.X509Certificate cert, String host, int port) => true;
/// Upgrade https to wss using [badCertificateCallback] to allow
/// self-signed certificates. This still gains you stream encryption.
try {
io.HttpClientRequest request =
await client.getUrl(Uri.parse('https' + '$uri'.substring(3)));
request.headers.add('Connection', 'upgrade');
request.headers.add('Upgrade', 'websocket');
request.headers.add('sec-websocket-version', '13');
request.headers.add(
'sec-websocket-key', base64.encode(randBytes(Random.secure(), 8)));
io.HttpClientResponse response = await request.close()
..timeout(Duration(seconds: timeoutSeconds));
socket = io.WebSocket.fromUpgradedSocket(await response.detachSocket(),
serverSide: false);
connectSucceeded(onConnected);
} catch (error) {
onError(error);
}
}