| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library http_multi_server; | 5 library http_multi_server; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:io'; | 8 import 'dart:io'; |
| 9 | 9 |
| 10 import 'src/multi_headers.dart'; |
| 10 import 'src/utils.dart'; | 11 import 'src/utils.dart'; |
| 11 | 12 |
| 12 /// An implementation of `dart:io`'s [HttpServer] that wraps multiple servers | 13 /// An implementation of `dart:io`'s [HttpServer] that wraps multiple servers |
| 13 /// and forwards methods to all of them. | 14 /// and forwards methods to all of them. |
| 14 /// | 15 /// |
| 15 /// This is useful for serving the same application on multiple network | 16 /// This is useful for serving the same application on multiple network |
| 16 /// interfaces while still having a unified way of controlling the servers. In | 17 /// interfaces while still having a unified way of controlling the servers. In |
| 17 /// particular, it supports serving on both the IPv4 and IPv6 loopback addresses | 18 /// particular, it supports serving on both the IPv4 and IPv6 loopback addresses |
| 18 /// using [HttpMultiServer.loopback]. | 19 /// using [HttpMultiServer.loopback]. |
| 19 class HttpMultiServer extends StreamView<HttpRequest> implements HttpServer { | 20 class HttpMultiServer extends StreamView<HttpRequest> implements HttpServer { |
| 20 /// The wrapped servers. | 21 /// The wrapped servers. |
| 21 final Set<HttpServer> _servers; | 22 final Set<HttpServer> _servers; |
| 22 | 23 |
| 24 /// Returns the default value of the `Server` header for all responses |
| 25 /// generated by each server. |
| 26 /// |
| 27 /// If the wrapped servers have different default values, it's not defined |
| 28 /// which value is returned. |
| 23 String get serverHeader => _servers.first.serverHeader; | 29 String get serverHeader => _servers.first.serverHeader; |
| 24 set serverHeader(String value) { | 30 set serverHeader(String value) { |
| 25 for (var server in _servers) { | 31 for (var server in _servers) { |
| 26 server.serverHeader = value; | 32 server.serverHeader = value; |
| 27 } | 33 } |
| 28 } | 34 } |
| 29 | 35 |
| 30 HttpHeaders get defaultResponseHeaders => | 36 /// Returns the default set of headers added to all response objects. |
| 31 throw new UnsupportedError('defaultResponseHeaders not supported'); | 37 /// |
| 38 /// If the wrapped servers have different default headers, it's not defined |
| 39 /// which header is returned for accessor methods. |
| 40 final HttpHeaders defaultResponseHeaders; |
| 32 | 41 |
| 33 Duration get idleTimeout => _servers.first.idleTimeout; | 42 Duration get idleTimeout => _servers.first.idleTimeout; |
| 34 set idleTimeout(Duration value) { | 43 set idleTimeout(Duration value) { |
| 35 for (var server in _servers) { | 44 for (var server in _servers) { |
| 36 server.idleTimeout = value; | 45 server.idleTimeout = value; |
| 37 } | 46 } |
| 38 } | 47 } |
| 39 | 48 |
| 40 /// Returns the port that one of the wrapped servers is listening on. | 49 /// Returns the port that one of the wrapped servers is listening on. |
| 41 /// | 50 /// |
| (...skipping 12 matching lines...) Expand all Loading... |
| 54 server.sessionTimeout = value; | 63 server.sessionTimeout = value; |
| 55 } | 64 } |
| 56 } | 65 } |
| 57 | 66 |
| 58 /// Creates an [HttpMultiServer] wrapping [servers]. | 67 /// Creates an [HttpMultiServer] wrapping [servers]. |
| 59 /// | 68 /// |
| 60 /// All [servers] should have the same configuration and none should be | 69 /// All [servers] should have the same configuration and none should be |
| 61 /// listened to when this is called. | 70 /// listened to when this is called. |
| 62 HttpMultiServer(Iterable<HttpServer> servers) | 71 HttpMultiServer(Iterable<HttpServer> servers) |
| 63 : _servers = servers.toSet(), | 72 : _servers = servers.toSet(), |
| 73 defaultResponseHeaders = new MultiHeaders( |
| 74 servers.map((server) => server.defaultResponseHeaders)), |
| 64 super(mergeStreams(servers)); | 75 super(mergeStreams(servers)); |
| 65 | 76 |
| 66 /// Creates an [HttpServer] listening on all available loopback addresses for | 77 /// Creates an [HttpServer] listening on all available loopback addresses for |
| 67 /// this computer. | 78 /// this computer. |
| 68 /// | 79 /// |
| 69 /// If this computer supports both IPv4 and IPv6, this returns an | 80 /// If this computer supports both IPv4 and IPv6, this returns an |
| 70 /// [HttpMultiServer] listening to [port] on both loopback addresses. | 81 /// [HttpMultiServer] listening to [port] on both loopback addresses. |
| 71 /// Otherwise, it returns a normal [HttpServer] listening only on the IPv4 | 82 /// Otherwise, it returns a normal [HttpServer] listening only on the IPv4 |
| 72 /// address. | 83 /// address. |
| 73 /// | 84 /// |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 for (var server in _servers) { | 141 for (var server in _servers) { |
| 131 var subInfo = server.connectionsInfo(); | 142 var subInfo = server.connectionsInfo(); |
| 132 info.total += subInfo.total; | 143 info.total += subInfo.total; |
| 133 info.active += subInfo.active; | 144 info.active += subInfo.active; |
| 134 info.idle += subInfo.idle; | 145 info.idle += subInfo.idle; |
| 135 info.closing += subInfo.closing; | 146 info.closing += subInfo.closing; |
| 136 } | 147 } |
| 137 return info; | 148 return info; |
| 138 } | 149 } |
| 139 } | 150 } |
| OLD | NEW |