Add support for HttpServer.defaultResponseHeaders to HttpMultiServer.
R=rnystrom@google.com
BUG=
Review URL: https://codereview.chromium.org//469583002
git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@39235 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8cab523..7c7f2e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.1.0
+
+* Add support for `HttpServer.defaultResponseHeaders`.
+
## 1.0.2
* Remove the workaround for [issue 19815][].
diff --git a/lib/http_multi_server.dart b/lib/http_multi_server.dart
index 76c3eba..7075ab4 100644
--- a/lib/http_multi_server.dart
+++ b/lib/http_multi_server.dart
@@ -7,6 +7,7 @@
import 'dart:async';
import 'dart:io';
+import 'src/multi_headers.dart';
import 'src/utils.dart';
/// An implementation of `dart:io`'s [HttpServer] that wraps multiple servers
@@ -20,6 +21,11 @@
/// The wrapped servers.
final Set<HttpServer> _servers;
+ /// Returns the default value of the `Server` header for all responses
+ /// generated by each server.
+ ///
+ /// If the wrapped servers have different default values, it's not defined
+ /// which value is returned.
String get serverHeader => _servers.first.serverHeader;
set serverHeader(String value) {
for (var server in _servers) {
@@ -27,8 +33,11 @@
}
}
- HttpHeaders get defaultResponseHeaders =>
- throw new UnsupportedError('defaultResponseHeaders not supported');
+ /// Returns the default set of headers added to all response objects.
+ ///
+ /// If the wrapped servers have different default headers, it's not defined
+ /// which header is returned for accessor methods.
+ final HttpHeaders defaultResponseHeaders;
Duration get idleTimeout => _servers.first.idleTimeout;
set idleTimeout(Duration value) {
@@ -61,6 +70,8 @@
/// listened to when this is called.
HttpMultiServer(Iterable<HttpServer> servers)
: _servers = servers.toSet(),
+ defaultResponseHeaders = new MultiHeaders(
+ servers.map((server) => server.defaultResponseHeaders)),
super(mergeStreams(servers));
/// Creates an [HttpServer] listening on all available loopback addresses for
diff --git a/lib/src/multi_headers.dart b/lib/src/multi_headers.dart
new file mode 100644
index 0000000..1677a9f
--- /dev/null
+++ b/lib/src/multi_headers.dart
@@ -0,0 +1,117 @@
+// Copyright (c) 2014, 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 http_multi_server.multi_headers;
+
+import 'dart:io';
+
+/// A class that delegates header access and setting to many [HttpHeaders]
+/// instances.
+class MultiHeaders implements HttpHeaders {
+ /// The wrapped headers.
+ final Set<HttpHeaders> _headers;
+
+ bool get chunkedTransferEncoding => _headers.first.chunkedTransferEncoding;
+ set chunkedTransferEncoding(bool value) {
+ for (var headers in _headers) {
+ headers.chunkedTransferEncoding = value;
+ }
+ }
+
+ int get contentLength => _headers.first.contentLength;
+ set contentLength(int value) {
+ for (var headers in _headers) {
+ headers.contentLength = value;
+ }
+ }
+
+ ContentType get contentType => _headers.first.contentType;
+ set contentType(ContentType value) {
+ for (var headers in _headers) {
+ headers.contentType = value;
+ }
+ }
+
+ DateTime get date => _headers.first.date;
+ set date(DateTime value) {
+ for (var headers in _headers) {
+ headers.date = value;
+ }
+ }
+
+ DateTime get expires => _headers.first.expires;
+ set expires(DateTime value) {
+ for (var headers in _headers) {
+ headers.expires = value;
+ }
+ }
+
+ String get host => _headers.first.host;
+ set host(String value) {
+ for (var headers in _headers) {
+ headers.host = value;
+ }
+ }
+
+ DateTime get ifModifiedSince => _headers.first.ifModifiedSince;
+ set ifModifiedSince(DateTime value) {
+ for (var headers in _headers) {
+ headers.ifModifiedSince = value;
+ }
+ }
+
+ bool get persistentConnection => _headers.first.persistentConnection;
+ set persistentConnection(bool value) {
+ for (var headers in _headers) {
+ headers.persistentConnection = value;
+ }
+ }
+
+ int get port => _headers.first.port;
+ set port(int value) {
+ for (var headers in _headers) {
+ headers.port = value;
+ }
+ }
+
+ MultiHeaders(Iterable<HttpHeaders> headers)
+ : _headers = headers.toSet();
+
+ void add(String name, Object value) {
+ for (var headers in _headers) {
+ headers.add(name, value);
+ }
+ }
+
+ void forEach(void f(String name, List<String> values)) =>
+ _headers.first.forEach(f);
+
+ void noFolding(String name) {
+ for (var headers in _headers) {
+ headers.noFolding(name);
+ }
+ }
+
+ void remove(String name, Object value) {
+ for (var headers in _headers) {
+ headers.remove(name);
+ }
+ }
+
+ void removeAll(String name) {
+ for (var headers in _headers) {
+ headers.removeAll(name, value);
+ }
+ }
+
+ void set(String name, Object value) {
+ for (var headers in _headers) {
+ headers.set(name, value);
+ }
+ }
+
+ String value(String name) => _headers.first.value(name);
+
+ List<String> operator[](String name) => _headers.first[name];
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index c7361d4..61e3dff 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: http_multi_server
-version: 1.0.2
+version: 1.1.0
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description:
diff --git a/test/http_multi_server_test.dart b/test/http_multi_server_test.dart
index a3d9062..0371c89 100644
--- a/test/http_multi_server_test.dart
+++ b/test/http_multi_server_test.dart
@@ -60,6 +60,28 @@
}), completes);
});
+ test("headers.set sets the value for all servers", () {
+ multiServer.defaultResponseHeaders.set(
+ "server", "http_multi_server test");
+
+ multiServer.listen((request) {
+ request.response.write("got request");
+ request.response.close();
+ });
+
+ expect(_get(subServer1).then((response) {
+ expect(response.headers['server'], equals("http_multi_server test"));
+ }), completes);
+
+ expect(_get(subServer2).then((response) {
+ expect(response.headers['server'], equals("http_multi_server test"));
+ }), completes);
+
+ expect(_get(subServer3).then((response) {
+ expect(response.headers['server'], equals("http_multi_server test"));
+ }), completes);
+ });
+
test("connectionsInfo sums the values for all servers", () {
var pendingRequests = 0;
var awaitingResponseCompleter = new Completer();