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();