| // 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. |
| |
| 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(); |
| } |