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/pkgs/http_multi_server/CHANGELOG.md b/pkgs/http_multi_server/CHANGELOG.md index 8cab523..7c7f2e4 100644 --- a/pkgs/http_multi_server/CHANGELOG.md +++ b/pkgs/http_multi_server/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/pkgs/http_multi_server/lib/http_multi_server.dart b/pkgs/http_multi_server/lib/http_multi_server.dart index 76c3eba..7075ab4 100644 --- a/pkgs/http_multi_server/lib/http_multi_server.dart +++ b/pkgs/http_multi_server/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/pkgs/http_multi_server/lib/src/multi_headers.dart b/pkgs/http_multi_server/lib/src/multi_headers.dart new file mode 100644 index 0000000..1677a9f --- /dev/null +++ b/pkgs/http_multi_server/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/pkgs/http_multi_server/pubspec.yaml b/pkgs/http_multi_server/pubspec.yaml index c7361d4..61e3dff 100644 --- a/pkgs/http_multi_server/pubspec.yaml +++ b/pkgs/http_multi_server/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/pkgs/http_multi_server/test/http_multi_server_test.dart b/pkgs/http_multi_server/test/http_multi_server_test.dart index a3d9062..0371c89 100644 --- a/pkgs/http_multi_server/test/http_multi_server_test.dart +++ b/pkgs/http_multi_server/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();