Skip to content

Commit 0c22930

Browse files
authored
Add browser support for response header tests. (#716)
1 parent 9f1416e commit 0c22930

File tree

3 files changed

+69
-59
lines changed

3 files changed

+69
-59
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
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.
4+
5+
import 'dart:async';
6+
import 'dart:io';
7+
8+
import 'package:async/async.dart';
9+
import 'package:stream_channel/stream_channel.dart';
10+
11+
/// Starts an HTTP server that returns custom headers.
12+
///
13+
/// Channel protocol:
14+
/// On Startup:
15+
/// - send port
16+
/// On Request Received:
17+
/// - load response header map from channel
18+
/// - exit
19+
void hybridMain(StreamChannel<Object?> channel) async {
20+
late HttpServer server;
21+
final clientQueue = StreamQueue(channel.stream);
22+
23+
server = (await HttpServer.bind('localhost', 0))
24+
..listen((request) async {
25+
request.response.headers.set('Access-Control-Allow-Origin', '*');
26+
request.response.headers.set('Access-Control-Expose-Headers', '*');
27+
28+
(await clientQueue.next as Map).forEach((key, value) => request
29+
.response.headers
30+
.set(key as String, value as String, preserveHeaderCase: true));
31+
32+
await request.response.close();
33+
unawaited(server.close());
34+
});
35+
36+
channel.sink.add(server.port);
37+
}

pkgs/http_client_conformance_tests/lib/src/response_headers_tests.dart

Lines changed: 28 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,81 +2,57 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'dart:async';
6-
import 'dart:io';
7-
5+
import 'package:async/async.dart';
86
import 'package:http/http.dart';
7+
import 'package:stream_channel/stream_channel.dart';
98
import 'package:test/test.dart';
109

11-
/// Tests that the [Client] correctly processes response headers e.g.
12-
/// 'Content-Length'.
10+
import 'utils.dart';
11+
12+
/// Tests that the [Client] correctly processes response headers.
1313
void testResponseHeaders(Client client) async {
1414
group('server headers', () {
15+
late String host;
16+
late StreamChannel<Object?> httpServerChannel;
17+
late StreamQueue<Object?> httpServerQueue;
18+
19+
setUp(() async {
20+
httpServerChannel = await startServer('response_headers_server.dart');
21+
httpServerQueue = StreamQueue(httpServerChannel.stream);
22+
host = 'localhost:${await httpServerQueue.next}';
23+
});
24+
1525
test('single header', () async {
16-
final server = (await HttpServer.bind('localhost', 0))
17-
..listen((request) async {
18-
await request.drain<void>();
19-
var response = request.response;
20-
response.headers.set('foo', 'bar');
21-
unawaited(response.close());
22-
});
23-
final response =
24-
await client.get(Uri.http('localhost:${server.port}', ''));
26+
httpServerChannel.sink.add({'foo': 'bar'});
27+
28+
final response = await client.get(Uri.http(host, ''));
2529
expect(response.headers['foo'], 'bar');
26-
await server.close();
2730
});
2831

2932
test('UPPERCASE header', () async {
30-
final server = (await HttpServer.bind('localhost', 0))
31-
..listen((request) async {
32-
await request.drain<void>();
33-
var response = request.response;
34-
response.headers.set('FOO', 'BAR', preserveHeaderCase: true);
35-
unawaited(response.close());
36-
});
33+
httpServerChannel.sink.add({'foo': 'BAR'});
34+
35+
final response = await client.get(Uri.http(host, ''));
3736
// RFC 2616 14.44 states that header field names are case-insensive.
3837
// http.Client canonicalizes field names into lower case.
39-
final response =
40-
await client.get(Uri.http('localhost:${server.port}', ''));
4138
expect(response.headers['foo'], 'BAR');
42-
await server.close();
4339
});
4440

4541
test('multiple headers', () async {
46-
final server = (await HttpServer.bind('localhost', 0))
47-
..listen((request) async {
48-
await request.drain<void>();
49-
var response = request.response;
50-
response.headers
51-
..set('field1', 'value1')
52-
..set('field2', 'value2')
53-
..set('field3', 'value3');
54-
unawaited(response.close());
55-
});
56-
final response =
57-
await client.get(Uri.http('localhost:${server.port}', ''));
42+
httpServerChannel.sink
43+
.add({'field1': 'value1', 'field2': 'value2', 'field3': 'value3'});
44+
45+
final response = await client.get(Uri.http(host, ''));
5846
expect(response.headers['field1'], 'value1');
5947
expect(response.headers['field2'], 'value2');
6048
expect(response.headers['field3'], 'value3');
61-
await server.close();
6249
});
6350

6451
test('multiple values per header', () async {
65-
final server = (await HttpServer.bind('localhost', 0))
66-
..listen((request) async {
67-
await request.drain<void>();
68-
var response = request.response;
69-
// RFC 2616 14.44 states that header field names are case-insensive.
70-
response.headers
71-
..add('list', 'apple')
72-
..add('list', 'orange')
73-
..add('List', 'banana');
74-
unawaited(response.close());
75-
});
76-
final response =
77-
await client.get(Uri.http('localhost:${server.port}', ''));
52+
httpServerChannel.sink.add({'list': 'apple, orange, banana'});
53+
54+
final response = await client.get(Uri.http(host, ''));
7855
expect(response.headers['list'], 'apple, orange, banana');
79-
await server.close();
8056
});
8157
});
8258
}

pkgs/http_client_conformance_tests/test/browser_client_test.dart

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,9 @@ void main() {
1212
final client = BrowserClient();
1313

1414
group('testAll', () {
15-
// TODO: Replace this with `testAll` when all tests support browser testing.
16-
testRequestBody(client);
17-
testRedirect(client, redirectAlwaysAllowed: true);
18-
testRequestBodyStreamed(client, canStreamRequestBody: false);
19-
testResponseBody(client, canStreamResponseBody: false);
20-
testResponseBodyStreamed(client, canStreamResponseBody: false);
21-
testRequestHeaders(client);
15+
testAll(client,
16+
redirectAlwaysAllowed: true,
17+
canStreamRequestBody: false,
18+
canStreamResponseBody: false);
2219
});
2320
}

0 commit comments

Comments
 (0)