Chromium Code Reviews| Index: lib/src/io_server.dart |
| diff --git a/lib/src/io_server.dart b/lib/src/io_server.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..37166e2f4475eff1d7ee25a138476a1c82090f20 |
| --- /dev/null |
| +++ b/lib/src/io_server.dart |
| @@ -0,0 +1,59 @@ |
| +// Copyright (c) 2015, 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. |
| + |
| +library shelf.io_server; |
| + |
| +import 'dart:async'; |
| + |
| +import 'dart:io'; |
| + |
| +import '../shelf_io.dart'; |
| +import 'handler.dart'; |
| +import 'server.dart'; |
| + |
| +/// A [Server] backed by a `dart:io` [HttpServer]. |
| +class IOServer implements Server { |
| + /// The underlying [HttpServer]. |
| + final HttpServer server; |
| + |
| + /// Whether [mount] has been called. |
| + bool _mounted = false; |
| + |
| + Uri get url { |
| + if (server.address.isLoopback) { |
| + return new Uri(scheme: "http", host: "localhost", port: server.port); |
| + } |
| + |
| + // IPv6 addresses in URLs need to be enclosed in square brackets to avoid |
| + // URL ambiguity with the ":" in the address. |
| + if (server.address.type == InternetAddressType.IP_V6) { |
| + return new Uri( |
| + scheme: "http", |
| + host: "[${server.address.address}]", |
| + port: server.port); |
| + } |
| + |
| + return new Uri( |
| + scheme: "http", host: server.address.address, port: server.port); |
| + } |
| + |
| + /// Calls [HttpServer.bind] and wraps the result in an [IOServer]. |
| + static Future<IOServer> bind(address, int port, {int backlog}) async { |
| + backlog ??= 0; |
| + var server = await HttpServer.bind(address, port, backlog: backlog); |
| + return new IOServer(server); |
| + } |
| + |
| + IOServer(this.server); |
| + |
| + void mount(Handler handler) { |
| + if (_mounted) { |
| + throw new StateError("Can't mount two handlers for the same server."); |
| + } |
| + |
| + serveRequests(server, handler); |
|
kevmoo
2015/10/22 00:44:25
_mounted is never set
You get a state error for m
nweiz
2015/10/26 21:32:44
Done.
|
| + } |
| + |
| + Future close() => server.close(); |
| +} |