| // Copyright (c) 2019, 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:async'; |
| import 'dart:io'; |
| import 'package:async_helper/async_helper.dart'; |
| import 'package:expect/expect.dart'; |
| |
| void main() { |
| // A virtual tun/tap interface should be created with following instrutctions: |
| // Create an interface with name [tap0], |
| // sudo ip tuntap add name [tap0] mode tap |
| // Assign an ipv6 address [fe80:1::1], |
| // sudo ip -6 addr add dev [tap0] [fe80:1::1] scope link nodad |
| // Check for virtual interface with ipv6 set, |
| // ip address show |
| asyncStart(); |
| try { |
| // Make sure the address here is the same as what it shows in |
| // "ip address show" |
| var ipv6 = 'fe80:1::1%tap0'; |
| |
| // Parses a Link-local address on Linux and Windows will throw an exception. |
| InternetAddress(ipv6); |
| |
| HttpServer.bind(ipv6, 0).then((server) { |
| server.listen((request) { |
| var timer = new Timer.periodic(const Duration(milliseconds: 0), (_) { |
| request.response |
| .write('data:${new DateTime.now().millisecondsSinceEpoch}\n\n'); |
| }); |
| request.response.done.whenComplete(() { |
| timer.cancel(); |
| }).catchError((_) {}); |
| }); |
| |
| var client = new HttpClient(); |
| client |
| .getUrl(Uri.parse("http://[${ipv6}]:${server.port}")) |
| .then((request) => request.close()) |
| .then((response) { |
| print( |
| 'response: status code: ${response.statusCode}, reason: ${response.reasonPhrase}'); |
| int bytes = 0; |
| response.listen((data) { |
| bytes += data.length; |
| if (bytes > 100) { |
| client.close(force: true); |
| } |
| }, onError: (error) { |
| server.close(); |
| }); |
| }); |
| asyncEnd(); |
| }); |
| } catch (e) { |
| Expect.fail('SocketException: $e'); |
| asyncEnd(); |
| } |
| } |