| 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..854e3417bfaa4594dfc14960b3ee098b4acd5512
|
| --- /dev/null
|
| +++ b/lib/src/io_server.dart
|
| @@ -0,0 +1,60 @@
|
| +// 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.");
|
| + }
|
| + _mounted = true;
|
| +
|
| + serveRequests(server, handler);
|
| + }
|
| +
|
| + Future close() => server.close();
|
| +}
|
|
|